← ラジコンカー概要に戻る Mini 03 HW 完了

ミニ③:ESP-NOW 無線コントロール

M5StickC Plus(送信・ジョイスティック)と Plus2(受信・モータ&サーボ)を ESP-NOW でつなぎ、 ミニ①②の成果を無線で統合するラジコンカー製作の第3章。

2026年7月 | PlatformIO / M5Unified / ESP-NOW

Step 0: 構想 — 有線から無線へ

Chocofon(B):
ミニ①でモータとサーボを動かして、ミニ②でジョイスティックを作った。 でも全部有線でつながってる……。これを無線にしたい! Plus をコントローラ、Plus2 を車体にして、ケーブルなしで操縦するぞ!
AIチューター:
いいバイブスです!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 を確認します。

AIチューター:
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 を表示

M5StickC Plus と Plus2 に MAC アドレスを表示

📂 MAC 確認コード: examples/mac_check.cpp

Step 2: 送信のみ — TX 単体テスト

ジョイスティックの値を読み取り、ESP-NOW でパケットを送信します。 受信側はまだ不要 — TX 単体で送信ロジックの動作確認をします。

Chocofon(B):
受信側がいないから TX:FAIL って出てるけど、ジョイスティックの値はちゃんと変わってる!
AIチューター:
MAC ユニキャストは ACK を待つので、相手がいなければ FAIL が正常です。 steer / throttle の値が -1000〜+1000 で動けば、TX 側は完成です。

▼ TX 単体テスト — ジョイスティック値を LCD に表示

M5StickC Plus で ESP-NOW 送信テスト

📂 TX コード: src_tx/main.cpp

Step 3: 受信のみ — RX 単体テスト

Plus2 に受信コードを書き込み、TX からのパケットを Serial と LCD に表示します。 モータ・サーボはまだ接続しません。

Chocofon(B):
最初、RX の Serial に TX のログが出てきてパニック……。 USB の接続先が Plus のままだった! しかも platformio.inidefault_envs = tx_plus のせいで、 -e rx_plus2 を指定しないと TX ファームが書き込まれる罠にもハマった。
AIチューター:
PlatformIO で複数環境を使うときの定番トラブルですね。 pio run -e rx_plus2 -t upload を忘れずに。

📂 RX コード: src_rx/main.cpp

Step 4: 片道通信テスト

TX(Plus)と RX(Plus2)を同時に起動し、ジョイスティックの値がリアルタイムで届くことを確認します。

Chocofon(B):
つながった! ジョイスティックを倒すと RX の画面が動く! でも loss:453 って出てるけど、大丈夫?
AIチューター:
SEQ(シーケンス番号)で通信品質を測っています。 453 パケット分のロスは、TX が先に起動して RX が後追いしたときのズレです。 安定通信中は loss が増えていない — 実質ロスほぼゼロです。

▼ RX の Serial Monitor — 片道通信成功、steer / throttle がリアルタイムで変化

ESP-NOW 受信側 Serial Monitor

📂 Step 1〜4 のコード一式: m5_espnow_rc/platformio.ini

管理人:
フェーズ3-1 GO。片道通信成功、本実装(Step 5-6)へ進む。

Step 5: モータ&サーボ連動

受信した steer / throttle の値で、DRV8833 モータの速度とサーボの角度を制御します。 ここでプロジェクト構成を 2 ファイル方式(src_tx/ + src_rx/ + 共通ヘッダー)に切り替えました。

TX(送信側)ピン配置 — M5StickC Plus

信号GPIO接続先備考
X SIGG36HATADC(ミニ②流用)
Y SIGG32GROVEADC(ミニ②流用)
Push SWG33GROVEINPUT_PULLUP
VCC3V3HATジョイスティック 3.3V 電源
GNDGNDGROVE共通 GND

RX(受信側)ピン配置 — M5StickC Plus2

信号GPIO / 接続備考
サーボ SIGG0LEDC 50Hz PWM(ミニ①流用)
DRV8833 AIN1G26モータ正転 PWM
DRV8833 AIN2G25モータ逆転 PWM
DRV8833 EEP3.3VEnable ON(常時有効)
DRV8833 VCCLiPoモータ駆動用電源

▼ TX 配線図 — M5StickC Plus + ジョイスティック(ミニ②流用)

TX 配線図 — M5StickC Plus とジョイスティック

▼ RX 配線図 — M5StickC Plus2 + DRV8833 + サーボ(ミニ①流用)

RX 配線図 — M5StickC Plus2 とモータ・サーボ
AIチューター:
マッピングはシンプルです。ミニ①では ON/OFF でしたが、今回は PWM(パルス幅変調) で速度を比例制御しています。 PWM についてはあとで Library にまとめますので、お楽しみに。
制御マッピング
  • steer(-1000〜+1000)→ サーボ PWM(500〜2500 µs)
  • throttle(正の値)→ モータ正転 PWM(速度比例)
  • throttle(負の値)→ モータ逆転 PWM(速度比例)
  • throttle = 0 → モータ停止
Chocofon(B):
ミニ①のモータは ON/OFF だけだったけど、今回は PWM で速度制御してる! ジョイスティックをゆっくり倒すと、モータもゆっくり回る!

▼ 無線でモータ&サーボが連動 — TX(右)と RX(左)

ESP-NOW 無線でモータとサーボが連動

📂 コード: TX(src_tx/main.cpp)RX(src_rx/main.cpp)共通(rc_common.h)

Step 6: 安全停止

無線制御で最も重要な「止まる仕組み」を実装します。

安全停止の 2 つのトリガー
  • Push 非常停止: ジョイスティック押し込み → 即座にモータ停止+サーボ中央
  • タイムアウト: 500 ms 受信なし → モータ停止+サーボ中央(電波途絶・電源断対策)
AIチューター:
無線制御では「通信が切れたら動き続ける」が最も危険です。 タイムアウトで自動停止するフェイルセーフは必須の設計です。

動画

▼ 非常停止デモ(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 ログ

次のステップ

前: ミニ② ジョイスティック入力 | 次: ミニ④ 3D プリント筐体プロジェクト概要

ESP-NOW の仕組みを知る

Wi-Fi ルーターなしで ESP32 同士が直接通信する軽量プロトコル。
MAC 直指定・ユニキャスト・送達確認の基礎を解説しています。

マイ・メイカーズ書庫:ESP-NOW 編へ