【M5】M5AtomliteをESP-NOW通信SPPモジュール化した<手頃な無線>

複数個の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()
②sdataを文字列配列に変換 sdata.toCharArray(cdata,dnum);
③forループでiをdnum回ループして、data[i]=(uint8_t)cdata[i]と変換

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以内でおさまってます。後日、複数台接続の場合どのくらいの周期で遅延どのくらいになるか測定してみます。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です