複数個のM5CPUでESP-NOW無線システムを組んでますが、計測システムなので、それぞれのCPUのサンプリングのスタート同期と周期の精度をそろえないといけません。センサや他のマイコンとの接続の汎用性をもたせるためにM5AtomliteをESP-NOW方式のSPP無線モジュール化(シリアル入力データをそのまま無線発信するモジュール)しました。
同期信号は、コントローラのM5から同期信号を送るとGPIOピンにDigitalOutされる方式にしました。
これで、毎回プログラムをいじらなくても、シリアルポートにデータを入力すれば、無線データ通信できるのでBlueToothSPPとかXbeeと同じ使い勝手でマイコン無線通信が格安で、高速、高信頼性、多端末で可能になります。
●M5Atom_ESP-Now_SPP_Moduleの説明
①動作
シリアル入力された文字列データをそのまま、無線(ESP-NOW)でコントローラに送信するシリアル無線送信モジュールです。
M5Atomlite_SPP | 結線 | 設定方法 |
シリアルポート | RX:23<-マイコンのTXと接続 TX:22->マイコンのRXと接続 |
ボーレートは115200 送信文字は、ASCII250バイト以下 デリミタは自由で最後に”\n\r”をつけるデータ入力周期は、最速10msecとする |
同期信号 | GPIO19からHIGH-LOW信号 | コントローラから受信するとHIGH データ送信終了でLOW |
電源 | 5Vピンに外部から入力 |
コントローラ側 M5,ESP系ESP-NOWが使えるCPU |
||
PC | USBシリアル 115200bps接続 | |
受信データ | SPPモジュールから受信したASCII文字列をそのままUSBシリアルに流してPCへ転送 | |
複数個受信 | 可能(次記事解説) |
②プログラムの備忘録
A:外部シリアルポートは、Serial2を使います。
void setup()に1行いれますGPIO23、22を使います。
Serial2.begin(115200,SERIAL_8N1,23,22); //*******(baudrate,config,RX,TX)******* |
B:同期信号は、GPIO19を使います。
int startPin=19;
pinMode(startPin,OUTPUT); //startPin Start DataSending |
c:コントローラとのPEER接続設定
void setup()でコントローラのMACアドレスをPEERアドレスに書き込み
// マルチキャスト用Slave<pnのM5ATOM> address AA:BB:CC:DD:EE:FF memset(&slave, 0, sizeof(slave)); //============M5Stack Slave AP Mac====================== slave.peer_addr[0] = (uint8_t)0xAA; slave.peer_addr[1] = (uint8_t)0xBB; slave.peer_addr[2] = (uint8_t)0xCC; slave.peer_addr[3] = (uint8_t)0xDD; slave.peer_addr[4] = (uint8_t)0xEE; slave.peer_addr[5] = (uint8_t)0xFF;esp_err_t addStatus = esp_now_add_peer(&slave); |
D:データの扱い
センサ、マイコンからASCIIデータが入ってくると
ESP-NOWの送信仕様は、 uint8_t型の配列変数dataと送信文字数が必要。 esp_now_send(slave.peer_addr, uint8_t data, data長);■ESP-NOW用に文字列データの変換sdata->cdata->dataと面倒 ①”xxxxxxxxxxx\n\r” String 変数sdataで受信して文字数dnum=sdata.length() |
E:SPPモジュールのソースコード
GISTにおいてあります、ArduinoIDEでM5Atomliteを書き込める設定にしてからコピペしてコンパイルするだけで動作します。
https://gist.github.com/dj1711572002/b9859cdf6fb42a3e590168176b4497fc
F:コントローラのソースコード
GISTにおいてあります、ArduinoIDEでM5Atomliteを書き込める設定にしてからコピペしてコンパイルするだけで動作します。
https://gist.github.com/dj1711572002/08e9bb5ec0362c630f2706e6d4ee1b4a
※同期信号の周期の設定は、void loop()の
if(t-t_1>1000) //デフォルト1秒周期=1000msec、この値を変更すれば同期周期変更可 { t_1=t; |
③動作確認
1:1で10msec周期で実験しました。
2時間まわしても、時間周期ずれがありませんので同期と送信データ欠落は発生してませんでした、SPP経由での遅延は、1msec以内でおさまってます。後日、複数台接続の場合どのくらいの周期で遅延どのくらいになるか測定してみます。