03. シリアルモニタ・リセット・起動ログの読み方
シリアルモニタって何
- マイコンが
Serial.println("...")で吐いたテキストを Mac 側で受信して表示する仕組み - 普通の Web 開発でいう
console.logのような立ち位置 - スタックちゃんが LCD に出せない情報(内部状態・エラー)を確認する一番の手段
ボーレートとは
シリアル通信は1秒あたり何ビット送るかを 事前に両者で合意 しておく必要がある。これをボーレートと言う。
- このプロジェクトでは 115200 bps を使用
- マイコン側(
Serial.begin(115200))と Mac 側(pio device monitor --baud 115200)で必ず一致させる - 一致してないと「文字化け」する。設定ミスを疑う最初のポイント
モニタを起動する3通り
① PlatformIO で(普段はこれ)
bash
pio device monitorplatformio.ini の monitor_speed = 115200 を見て自動でボーレートを設定してくれる。
終了は Ctrl+C (ターミナルによっては Ctrl+])。
② screen コマンドで(PlatformIO 不調時のバックアップ)
bash
screen /dev/cu.usbmodem83301 115200終了は Ctrl+A → K → y。
③ 非対話シェル(自動化スクリプト)
PlatformIO の monitor は TTY を要求するので、CI やバックグラウンドからは使えない。 そういうときは Python の pyserial で直接読む:
python
import serial
s = serial.Serial('/dev/cu.usbmodem83301', 115200)
print(s.read(1024).decode())詳しくは troubleshooting/pio-monitor-tty.md。
リセットの種類
スタックちゃん(CoreS3)には何種類かのリセット方法がある。
| 種類 | やり方 | 用途 |
|---|---|---|
| 物理リセット | 本体側面の小さいボタンを短押し | 一番確実。電源は切れない |
| 電源OFF→ON | 電源ボタン長押し | 物理リセットが効かないときの最終手段 |
| ソフトウェアリセット | コードから ESP.restart() | プログラム的に再起動したいとき |
| USB経由リセット | DTR/RTS 信号を Mac から送る | 書き込み直後に自動で行われる(手動でも可) |
DTR / RTS って何?
USB ケーブルの中には、データ線だけでなく 制御信号線 も流れている。
- DTR = Data Terminal Ready(PC側が「準備できたよ」と伝える線)
- RTS = Request To Send(PC側が「送信していい?」と聞く線)
ESP32 のボードでは、この2本をハック的に利用 して以下のように動かしている:
| RTS | DTR | 結果 |
|---|---|---|
| HIGH | HIGH | 通常起動 |
| LOW | HIGH | 書き込みモードに入る |
| HIGH→LOW→HIGH | – | リセット |
つまり Mac から pio がアップロードする時、まず DTR/RTS をパタパタさせて CoreS3 を書き込みモードに入れ、書き込み後にもう一度パタパタさせて通常起動に戻す、というのを自動でやっている。
これが効かないとき(書き込み失敗時)は、本体のリセットボタンを長押ししながら接続すると手動で書き込みモードに入れる。
起動ログの読み方
書き込み直後の典型的なログ:
ESP-ROM:esp32s3-20210327 ← ESP32-S3 のブートROM(マスクROM)が動いた
Build:Mar 27 2021
rst:0x15 (USB_UART_CHIP_RESET),boot:0x28 (SPI_FAST_FLASH_BOOT)
↑ なぜリセットされたか / どこから起動したか
SPIWP:0xee
mode:DIO, clock div:1 ← フラッシュメモリの読み出しモード
load:0x3fce3808,len:0x4bc ← 第二段ローダのロード
load:0x403c9700,len:0xbd8
load:0x403cc700,len:0x2a0c
entry 0x403c98d0 ← この番地にジャンプして我々のコード開始
[ 1001][I][esp32-hal-psram.c:96] psramInit(): PSRAM enabled
↑ 外付け PSRAM が認識された
[ 1026][I][M5GFX.cpp:805] init_impl(): [M5GFX] [Autodetect] load from NVS : board:27
↑ どのボードかを自動判定
[ 1047][I][M5GFX.cpp:1509] autodetect(): [M5GFX] [Autodetect] board_M5StackChan
↑ 「スタックちゃんK151」を認識!
[ 1208][I][esp32-hal-i2c.c:75] i2cInit(): Initialising I2C Master: sda=12 scl=11
↑ サーボボードと話すための I2C 初期化
[boot] stack-chan firmware up ← ようやく我々の Serial.println が出力リセット原因コードの意味(rst:0xXX)
| コード | 意味 |
|---|---|
0x01 | 電源投入 |
0x03 | ソフトウェアリセット |
0x0c | ソフトウェア CPU リセット |
0x15 | USB UART チップリセット(書き込み直後) |
0xe7 | ウォッチドッグタイムアウト(プログラムがハングした) |
0xe7 が出てたら自分のコードが固まってる証拠。要デバッグ。
チートシート
bash
# 認識確認
ls /dev/cu.usbmodem*
# モニタ起動(普通はこれ)
pio device monitor
# ボーレート手動指定
pio device monitor --port /dev/cu.usbmodem83301 --baud 115200
# Mac の screen で見る(PlatformIO が動かないとき)
screen /dev/cu.usbmodem83301 115200
# 終了は Ctrl+A → K → y