1日目は、キーボード疎通と画面表示までを実機で確認しました。2日目は、Wi-Fi接続、GitHubへの保存、AI変換という、今回いちばんの山場に入ります。
秘密情報まわりの設計し直し
着手する前に、別件のセキュリティ課題を見つけてしまいました。80_www/cardputer-henkan/deploy.pyにFTPパスワードが平文でコミットされていたのです。Privateリポジトリではあるものの、ローテーションは必要な状態でした。これは別タスクとして起票し、今回のメイン作業では触れずに進めることにしました。
そのうえで、秘密情報の扱いをsecrets.h生成方式に統一しました。secrets/配下(wifi・github・ai_bridge)に置いた設定から、generate_secrets_header.pyで.gitignore済みのヘッダファイルを生成する仕組みです。中身は一切表示しない運用を徹底しています。
Wi-Fi接続、直らない一日
ここからが本当の格闘でした。
ネットワークを切り替えるたびにWiFi.disconnect()を挟むと、cannot set configというエラーで接続が失敗し続けます。
- 試行1:
disconnect()の後にdelay(200)を挟む → 解消せず - 試行2:無線を完全にオフにしてからオンにして作り直す → リトライ経路で同じエラーが別の場所に再発
最終的な正解は、disconnect()を一切呼ばず、begin()だけで切り替えることでした。ESP32 Arduino coreのbegin()は、内部で必要な切断処理を自分でやってくれます。余計な手を加えない方が安定する、というオチでした。
並行して、電波強度も原因の一つだったと判明しました。スキャン用のスケッチで確認すると-86〜-92dBm。ルーターとスマートフォンに近づけたところ、-69dBmまで改善しました。
また、全部品を1つにまとめるとビルドサイズが1.2MBのデフォルトパーティションでは111%オーバーとなり、ビルドできませんでした。パーティションをhuge_app(3MB)に変更して解決しています。
これらを経て、自動接続テストが初めて完走しました。push OK: 00_inbox/...、ai henkan: こんにちは。Wi-Fi接続・GitHub push・AI変換の3つが、同時に成功した瞬間です。
全部品を1つに統合 → 新しいクラッシュ
部品ごとには直ったはずのバグが、組み合わせた瞬間に別の顔で戻ってくることがあります。今回もそうでした。
単体テストでは通っていたのに、統合版だけ接続に失敗するようになったのです。最初はI2C(キーボード)とWi-Fiの干渉を疑い、一時停止処理を追加してみましたが効果はありませんでした。
原因は、保存操作の瞬間に初めてbegin()していたことでした。起動直後にWi-Fiを先に始めておく「プリウォーム」方式に変更したところ解消しました。これは、以前のMicroPython版と同じ設計に回帰した形になります。
さらに、assert failed: udp_new_ip_type ... Required to lock TCPIP core functionality!というlwIPのアサーション失敗で再起動するクラッシュにも遭遇しました。Wi-Fi接続直後にNTP同期を呼ぶと発生する現象です。接続直後にdelay(1000)を挟み、lwIPの内部状態が安定するまでの猶予を作ったところ、以後は再現しなくなりました。
ここまでの積み重ねの末、実際にタイプした「あいうえお」がGitHubに保存される瞬間を迎えました。入力→変換→表示→保存→pushという全経路が、実機・実データで初めてつながりました。
運用してみて見つかった細部
一通り動くようになってから、運用の中で細かい問題も見つかりました。
バッテリー駆動でテスト中に「文字が打てなくなった」という現象が起きましたが、これはUSBの物理接続不良で、コード側の問題ではありませんでした。再接続で復旧しています。
また、このタイミングでvault(リポジトリ)をmynotebookへ移行し、git remote・GitHubトークン・GITHUB_REPO定数を一括更新しました。新リポジトリへのpushも確認済みです。
もう一つ、実際に保存されたファイルを見て気づいたのが、AI変換結果に「md」という文字列が紛れ込む不具合でした。Geminiがまれにmarkdownのコードフェンス付きで結果を返してきて、フェンスの除去処理が不完全だったのが原因です。サーバー側(PHPブリッジ)には手を入れず、Arduino側の受信処理だけでstrip_markdown_fence()による防御的な除去を行い、ネイティブテストで検証しました。
NTPタイムアウトについては、4件に1件くらいの割合で、ファイル名が1970年起点になってしまうケースが残っています。データ自体は保存されるため実害は小さいのですが、これは未解決のまま持ち越しています。
—
2日目は、直しては別の場所で再発する、という繰り返しの多い一日でした。3日目は、細部の使い勝手を仕上げていきます。


コメント