ESP-NOW使えそうなので、クランクトルク用の無線システム組んでみました。Lang-Ship様のサンプルプログラムにMACアドレスを書き換えてデータフォーマットに沿った送受信部分を書き込んで完成しました。
送受信タイミングエラーと時間周期精度の測定もしたので次回まとめます。
●ESP-NOWの通信設定の方法
ESP-NOW仕様書は、下記にあります。
https://docs.espressif.com/projects/esp-idf/en/latest/esp32/api-reference/network/esp_now.html
■ESP-NOWの通信コマンド
SlaveとMasterと名称で区別がありますが、プログラム上では立場は同じです。
Slaveの役割:Masterから送信されるデータを受信したり、Masterへ送信
Masterの役割:センサ等データを測定してSlaveへ送信
通信コマンド | 使い方 |
プログラムで使っている関数 戻り値が構造体 esp_err_tです |
イニシャライズ | WIFIをESP-NOW用に設定する 3個init関数あります |
esp_err_t esp_now_init (void) |
peer
|
送信相手のMACアドレス登録 7個もpeer関数があります |
esp_err_t
|
送信 | <手動送信> コールバック有無は選択できます。 MACアドレスを指定するか MACアドレスを全FF:なら全端末あてに同時送信 (ブロードキャスト) 3個send関数あります |
esp_err_t
|
受信 | <割込みで自動受信> コールバックが必須でついてます。通信の信頼性を確保するために必須だからだと思います。 受信は来るものは拒まず、相手のMACアドレスとdataを受信できます2個しか受信関数ありません |
esp_err_t
|
●基本的なMACアドレスの設定
⓪受信は全て自分宛の送信は来るものは拒まず受信します。割込みで順次受信
①全部FFの場合は、自分以外の全ての端末へデータを送信します。
➁peerにaddしたMACアドレスがあればそのアドレスの端末のみへ送信します。
●プログラム備忘録
①SLAVE(母艦M5StackBasic用)
//=====================LangShip ESP-NOW1=================-
#include <M5Stack.h> esp_now_peer_info_t slave; // 送信コールバック } // 受信コールバック /* void setup() { // マルチキャスト用Slave登録 if (addStatus == ESP_OK) { void loop() { if(t-t_1>1000) // Aボタンを押したらM5StackPower Reset } } } |
➁MASTER(左右子機 M5StickC用)
#include <M5StickC.h> #include <esp_now.h> #include <WiFi.h>esp_now_peer_info_t slave; uint8_t data[12];//12byte 4*value0,value1,value2 int i=0; int j=0; int value0,value1,value2; uint8_t ti,ti_1; int toff=0; int tzero=0; int t=0; int hasu=0; //+++++++++++++++i_to_char+++++++++++++++++ // i=IntegerValueData,*d=Array pointer, n=Array start No void i_to_char(int i,uint8_t *d, int n) { d[n] = i & 0x000000ff; d[n+1] = (i & 0x0000ff00) >> 8; d[n+2] = (i & 0x00ff0000) >> 16; d[n+3] = (i & 0xff000000) >> 24; } //++++++++++++++++++++++++++++++++++++++++++// 送信コールバック void OnDataSent(const uint8_t *mac_addr, esp_now_send_status_t status) { char macStr[18]; snprintf(macStr, sizeof(macStr), “%02X:%02X:%02X:%02X:%02X:%02X”, mac_addr[0], mac_addr[1], mac_addr[2], mac_addr[3], mac_addr[4], mac_addr[5]); //Serial.print(“Last Packet Sent to: “); //Serial.println(macStr); //Serial.print(“Last Packet Send Status: “); //Serial.println(status == ESP_NOW_SEND_SUCCESS ? “Delivery Success” : “Delivery Fail”); }// 受信コールバック void OnDataRecv(const uint8_t *mac_addr, const uint8_t *data, int data_len) { char macStr[18]; snprintf(macStr, sizeof(macStr), “%02X:%02X:%02X:%02X:%02X:%02X”, mac_addr[0], mac_addr[1], mac_addr[2], mac_addr[3], mac_addr[4], mac_addr[5]);if(data[0]==0x73 && data[1]==0x74)//when data=”ST” TimingSTART { hasu++; delay(1); } if(data[0]==0x54 && data[1]==0x52)//when data=”TR” TimerReset { toff=1; hasu=0; j=0; } /*Serial.print( macStr); //Serial.print(“,”); //Serial.print(data_len); for ( int i = 0 ; i < data_len ; i++ ) { Serial.print(data[i]); Serial.print(” “); } Serial.println(“”); */ } void setup() { // マルチキャスト用Slave登録 memset(&slave, 0, sizeof(slave)); // ESP-NOWコールバック登録 void loop() { esp_err_t result = esp_now_send(slave.peer_addr, data, sizeof(data)); Serial.print(value0);//j counter delay(8); /* } |
●以後
30分以上連続運転してデータをログして、送受信による周期エラー
上死点タイミング同期の誤差エラーを測定して使えるか検証します。