トラブルを防ぐ書き込み前の「非常停止手順」を知る
スタックチャンのような小型ロボットであっても、ハードウェア制御を完全にAIへ委ねることにはリスクが伴います。生成された組み込みプログラムは画面表示だけでなく、モーターやLEDへ直接駆動命令を送るためです。制御角度、出力値、停止条件の設定に不備があると、人間が物理的に介入するまで異常動作を続けるおそれがあります。
特にサーボモーターの制御には注意が必要です。可動域を超えた角度へ力をかけ続けるプログラムは、ギアの破損や発熱を引き起こします。M5Stack公式の資料でも、通電中の可動部を無理に手で回すと故障の原因になると警告されています。
また、公式仕様によるとスタックチャンの背面には12個のWS2812C(フルカラーLED)が搭載されています。最大輝度で点灯させ続けると消費電流と発熱が増大するため、開発時は低い輝度からテストし、強光を直視しないよう配慮が必要です。
今回はまだサーボを動かしません。LEDは低い輝度設定から開始し、3秒で自動消灯するロジックをコード側に組み込んだ上で、実機から目を離さない状態でテストを行います。万が一の誤動作に備え、書き込み前に電源オフとダウンロードモード移行の手順を確認しておきます。
-
電源ボタンを約6秒間押し続けると電源が切れます(USB接続時も有効)。
-
RSTボタンを約3秒間押し続けると、アプリを起動せずダウンロード(書き込み)モードに入ります(RSTボタン横のランプが緑点灯)。
電源ボタンとRSTボタンの操作は、M5Stack公式の手順でも確認できます。なお、毎回手動でダウンロードモードへ入らなくても書き込みは可能です。
通常の書き込み
現在のファームウェアが正常に動作している場合は、以下の手順で書き込みを行います。
-
スタックチャンを安定した場所に置いて起動します。
-
足の背面にある台座側のUSB-CポートとPCをケーブルで接続します。
-
PC側で
/dev/ttyACM0と表示され機器が認識されたことを確認します。 -
ポート確認後、
make flashコマンドを実行します。 -
ポートが認識されない、または自動切替に失敗した場合は、右下のRSTボタンを約3秒間押し続けます。
- RSTボタン横のランプが緑点灯したらボタンを離し、ダウンロードモードでポートを確認してから再度書き込みを実行します。
実機書き込みの際、Codexから接続確認を求められました。
スタックチャンの台座側USB-CポートをPCへ接続し、シリアルポートの/dev/ttyACM0が見える状態にしてください。 準備できたら「準備できました」と返してください。 設定を全消去しない通常のflashを実行します。
これに対し「準備できました」と返答すると、Codexから次の案内がありました。
接続を確認しました。これから/dev/ttyACM0へ通常のflashを書き込みます。 完了をお知らせするまで、電源、USBケーブル、RSTボタンには触れないでください。
Codexは Makefile を解析し、以下の書き込みコマンドを自動実行しました。
make flash BOARD=cores3 PORT=/dev/ttyACM0
書き込み実行中は機器に触れず待機します。もし画面やモジュールが想定外の挙動を示した場合は、電源ボタンを6秒間長押しして強制終了させてください。
「Hello World」表示による描画とビルドの確認
変更前ビルドの成功を確認後、最初の画面変更をCodexに依頼しました。
吹き出しに「Hello World」と表示してください。
Codexは既存の画面描画を調べ、吹き出しの文字を設定する処理を見つけました。
新しい描画の仕組みを作らず、画面の初期化後に「Hello World」を5秒間表示する1行を追加しています。
g_state->set_balloon_text("Hello World", /*hold_ms=*/5000);
ビルドして書き込むと画面に顔と吹き出しが表示されましたが、約0.5秒で吹き出しが消えてしまう現象が発生しました。状況をそのまま伝えます。
出ました。サウンドが成る→顔と吹き出し表示→0.5秒くらいで吹き出しが消える
Codexが描画処理を追跡したところ、最初のフレームのみ表示開始時刻が正しく設定されていないことが判明しました。時刻計算の不具合を修正して再書き込みを行うと、「Hello World」が意図通り約5秒間保持されました。
表示されました
単に「動かない」と伝えるのではなく、「音、表示、消えるまでの時間」を順序立てて報告したことで、Codexは即座に原因を特定し修正まで完結できました。
「/side」コマンドで文脈を保ったまま疑問を解消
作業中、先ほどの書き込みコマンドにあった「flash」の具体的な意味について気になったため、Codexに質問してみることにします。
Codex CLIには、本線の文脈を維持したまま脇道の質問が行える「/side」コマンド(別名:/btw)が用意されています。
/side flashって何をしているんですか?
すると、Codexから以下の解説が得られました。
ここでのflashは、stackchan-idfのMakefileにある処理名です。 make flashを実行すると、Makefileはidf.pyのflash処理を呼び出します。 idf.pyは内部でesptoolを使い、ブートローダー、パーティションテーブル、OTA初期データ、アプリ本体を、ESP32-S3のフラッシュメモリ上の決められた位置へ書き込みます。 書き込み後は内容を検証し、ESP32-S3をリセットします。 通常のflashはNVSやストレージを全消去しません。erase-flashは別の操作です。
この回答により、今回の操作が設定情報を残す通常の書き込み(flash)であり、全消去(erase-flash)ではないことが明確に理解できました。途中で分からない用語が出た場合も「/side」で掘り下げて確認できます。確認が終われば Ctrl+C で元の開発セッションに復帰可能です。
