ミニ③:ESP-NOW 無線コントロール
M5StickC Plus(送信・ジョイスティック)と Plus2(受信・モータ&サーボ)を ESP-NOW でつなぎ、 ミニ①②の成果を無線で統合するラジコンカー製作の第3章。
Step 0: 構想 — 有線から無線へ
ミニ①でモータとサーボを動かして、ミニ②でジョイスティックを作った。 でも全部有線でつながってる……。これを無線にしたい! Plus をコントローラ、Plus2 を車体にして、ケーブルなしで操縦するぞ!
いいバイブスです!ESP32 には ESP-NOW という軽量な無線プロトコルが内蔵されています。 Wi-Fi ルーターなしで ESP32 同士が直接通信できるので、ラジコンの操縦に最適です。 MAC アドレスを直指定(ユニキャスト)して、50 Hz でコマンドを飛ばします。
- 送信側(TX): M5StickC Plus + ジョイスティック → ESP-NOW 送信
- 受信側(RX): M5StickC Plus2 → ESP-NOW 受信 → DRV8833 モータ + サーボ制御
- パケット: steer / throttle / e_stop / seq(6 bytes)
- レート: 50 Hz(20 ms 間隔)
- ペアリング: MAC 直指定(ユニキャスト) — 送達確認付き
- タイムアウト: 500 ms 無受信 → モータ自動停止
フェーズ1 GO。Step 構成と通信設計を確定した。
Step 1: MAC アドレス確認
ESP-NOW のユニキャスト通信では、送信先の MAC アドレスが必要です。 まず Plus と Plus2 それぞれの MAC を確認します。
WiFi.mode(WIFI_STA) → WiFi.macAddress() で取得できます。
スケルトンコードを書き込んで、LCD と Serial に表示させましょう。
- TX(Plus): D8:A0:1D:55:30:74
- RX(Plus2): 14:2B:2F:B2:27:9C
▼ Plus(右・オレンジ)と Plus2(左・黄色)の LCD に MAC を表示
Step 2: 送信のみ — TX 単体テスト
ジョイスティックの値を読み取り、ESP-NOW でパケットを送信します。 受信側はまだ不要 — TX 単体で送信ロジックの動作確認をします。
受信側がいないから
TX:FAIL って出てるけど、ジョイスティックの値はちゃんと変わってる!
MAC ユニキャストは ACK を待つので、相手がいなければ FAIL が正常です。 steer / throttle の値が -1000〜+1000 で動けば、TX 側は完成です。
▼ TX 単体テスト — ジョイスティック値を LCD に表示
Step 3: 受信のみ — RX 単体テスト
Plus2 に受信コードを書き込み、TX からのパケットを Serial と LCD に表示します。 モータ・サーボはまだ接続しません。
最初、RX の Serial に TX のログが出てきてパニック……。 USB の接続先が Plus のままだった! しかも
platformio.ini の default_envs = tx_plus のせいで、
-e rx_plus2 を指定しないと TX ファームが書き込まれる罠にもハマった。
PlatformIO で複数環境を使うときの定番トラブルですね。
pio run -e rx_plus2 -t upload を忘れずに。
Step 4: 片道通信テスト
TX(Plus)と RX(Plus2)を同時に起動し、ジョイスティックの値がリアルタイムで届くことを確認します。
つながった! ジョイスティックを倒すと RX の画面が動く! でも loss:453 って出てるけど、大丈夫?
SEQ(シーケンス番号)で通信品質を測っています。 453 パケット分のロスは、TX が先に起動して RX が後追いしたときのズレです。 安定通信中は loss が増えていない — 実質ロスほぼゼロです。
▼ RX の Serial Monitor — 片道通信成功、steer / throttle がリアルタイムで変化
フェーズ3-1 GO。片道通信成功、本実装(Step 5-6)へ進む。
Step 5: モータ&サーボ連動
受信した steer / throttle の値で、DRV8833 モータの速度とサーボの角度を制御します。
ここでプロジェクト構成を 2 ファイル方式(src_tx/ + src_rx/ + 共通ヘッダー)に切り替えました。
TX(送信側)ピン配置 — M5StickC Plus
| 信号 | GPIO | 接続先 | 備考 |
|---|---|---|---|
| X SIG | G36 | HAT | ADC(ミニ②流用) |
| Y SIG | G32 | GROVE | ADC(ミニ②流用) |
| Push SW | G33 | GROVE | INPUT_PULLUP |
| VCC | 3V3 | HAT | ジョイスティック 3.3V 電源 |
| GND | GND | GROVE | 共通 GND |
RX(受信側)ピン配置 — M5StickC Plus2
| 信号 | GPIO / 接続 | 備考 |
|---|---|---|
| サーボ SIG | G0 | LEDC 50Hz PWM(ミニ①流用) |
| DRV8833 AIN1 | G26 | モータ正転 PWM |
| DRV8833 AIN2 | G25 | モータ逆転 PWM |
| DRV8833 EEP | 3.3V | Enable ON(常時有効) |
| DRV8833 VCC | LiPo | モータ駆動用電源 |
▼ TX 配線図 — M5StickC Plus + ジョイスティック(ミニ②流用)
▼ RX 配線図 — M5StickC Plus2 + DRV8833 + サーボ(ミニ①流用)
マッピングはシンプルです。ミニ①では ON/OFF でしたが、今回は PWM(パルス幅変調) で速度を比例制御しています。 PWM についてはあとで Library にまとめますので、お楽しみに。
- steer(-1000〜+1000)→ サーボ PWM(500〜2500 µs)
- throttle(正の値)→ モータ正転 PWM(速度比例)
- throttle(負の値)→ モータ逆転 PWM(速度比例)
- throttle = 0 → モータ停止
ミニ①のモータは ON/OFF だけだったけど、今回は PWM で速度制御してる! ジョイスティックをゆっくり倒すと、モータもゆっくり回る!
▼ 無線でモータ&サーボが連動 — TX(右)と RX(左)
Step 6: 安全停止
無線制御で最も重要な「止まる仕組み」を実装します。
- Push 非常停止: ジョイスティック押し込み → 即座にモータ停止+サーボ中央
- タイムアウト: 500 ms 受信なし → モータ停止+サーボ中央(電波途絶・電源断対策)
無線制御では「通信が切れたら動き続ける」が最も危険です。 タイムアウトで自動停止するフェイルセーフは必須の設計です。
動画
▼ 非常停止デモ(Shorts)— Push 押し込み & タイムアウト停止
Step(開発ワークフロー)毎に検証を進めることにより、 ブレッドボード上では、確実に動作確認することができるようになった。
ミニ③ 最終判定:GO とする。
「Chocofon(B)」もよく頑張った。それにしても、Curso……いや「AIチューター」すごいぞ……。
まとめ
ミニ③では、ミニ②のジョイスティック(TX)とミニ①のモータ&サーボ(RX)を ESP-NOW で無線接続し、50 Hz のコマンド送信 + フェイルセーフ(Push 非常停止 / 500 ms タイムアウト)まで実装しました。
- MAC ユニキャストで片道通信 → PWM 速度制御でモータ&サーボ連動
- PlatformIO 2 ファイル方式(
src_tx/+src_rx/)に移行 - SEQ 連番で通信品質(ロス率)をデバッグ表示
Trial & Error ログ
-
Step 1 — MAC アドレス確認
Plus / Plus2 それぞれの MAC を LCD + Serial に表示。送信先を確定。 -
Step 3 — Serial に TX ログが出る
USB 接続先ミス +default_envs = tx_plusの罠。pio run -e rx_plus2 -t uploadを明示指定で解決。 -
Step 4 — loss:453 問題
通信不安定かと思ったが、TX 先行起動による起動タイミング差。安定後は実質ロスほぼゼロ。 -
設計 — G36 は Input Only
DRV8833 AIN2 を G25 に修正(ミニ①正本に合わせた)。 -
Step 5-6 — 本実装(2026-07-05)
モータ PWM 速度制御 + サーボ連動 OK。Push 非常停止 / タイムアウト停止 OK。
次のステップ
- ミニ④ 3D プリンタ筐体へ — ブレッドボードから卒業、シャーシ設計
- ミニ⑤ 組み立て・完成 — 全体組み立てと走行テスト
- Library:ESP-NOW の基礎 — ユニキャスト vs ブロードキャストなど通信方式の復習
- Library:PWM の基礎(pwm.html)— 速度制御・サーボの仕組み
前: ミニ② ジョイスティック入力 | 次: ミニ④ 3D プリント筐体 | プロジェクト概要
ESP-NOW の仕組みを知る
Wi-Fi ルーターなしで ESP32 同士が直接通信する軽量プロトコル。
MAC 直指定・ユニキャスト・送達確認の基礎を解説しています。