なぜホストインタフェースが壁になるか
Bluetoothモジュール は単独では動きません。データを渡す MCU の裏に控えています。ホストインタフェースの品質——フレーミング、フロー制御、スリープハンドシェイク——が、製品が1週間で出るか3ヶ月かを決めます。本稿では量産向けのホストプロトコルを解説します。
物理層
- UART 115200-921600 bps、8N1。921600 では基板をきれいに、配線 30 cm 未満に。
- 460800 超は溢れ防止にハード RTS/CTS 必須。
- 任意:スリープ連携用の `HOST_WAKE` GPIO 1 本。
2つのスタイル
| スタイル | 長所 | 短所 |
|---|---|---|
| AT コマンド(文字) | デバグ容易、人が読める | 冗長、パーサ負荷 |
| バイナリ(TLV/COBS) | コンパクト、高速 | ツール要 |
量産設定は AT、バルクデータはバイナリ。
AT フレーミング
<CR><LF>AT+NAME=Sensor01<CR><LF>
応答: <CR><LF>OK<CR><LF>
エラー: <CR><LF>ERROR:code<CR><LF>
- 終端は CRLF。`\n` 単体には依存しない。
- 立ち上げ時はエコーON、量産はOFF。
- 非同期イベントは勝手に届く:`+EVENT:conn 1`。
バイナリフレーミング(TLV)
[0xAA][Len:2][Cmd:1][TLV...][CRC:2]
- COBS で 0x00 エスケープを除去。
- CRC-16/CCITT;全フレームで再計算。
フロー制御
- CTS が Low = モジュールビジー、ホストは停止。
- バルク送信はウィンドウ 4-8 フレーム;次バースト前に `OK` 待ち。
スリープハンドシェイク
モジュールは省電力で寝ます。ホストは送信前に起こします。
HOST: HOST_WAKE アサート(またはブレーク送信)
MODULE: 2 ms 以内に RTS を上げる
HOST: RTS 待ってから送信
これがないとバイトは静かに失われます。
スループット計算
115200 bps、8N1 効率 ≈ 11 bit/byte → 生 ~10.4 KB/s。プロトコル+ACK オーバヘッド ≈ 30% → 実効 ~7 KB/s。1 KB/s センサストリームなら余裕;音声は 921600 または SDIO を使ってください。
よくある落とし穴
- CTS 忘れ → 高速で代入消失。
- ホストパーサに watchdog なし → 不良フレームで停止。
- ウェイク線なしで寝る → 「急に止まった」。
- SDK 間で `\n` と `\r\n` を混ぜる。
最小ホスト状態機械
IDLE → SEND → WAIT_ACK → (RETRY|OK) → IDLE、ACK タイムアウト 500 ms、リトライ 3 回。
清潔な Bluetoothモジュール のホストプロトコルは意図して退屈です——それこそが、他のファームウェアを面白くする土台です。