M5Stack 2台を使ってESP-NOWというEspressif社が開発した通信プロトコルでブロードキャスト通信をしてみました。
こちらでテストした通信のArduino版で、また下記サイトのコードを使わせていただきました。
https://lang-ship.com/blog/work/m5stickc-esp-now-1/
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 |
#include <M5Stack.h> #include <esp_now.h> #include <WiFi.h> esp_now_peer_info_t slave; void cbSend(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]); M5.Lcd.setTextColor(BLUE); M5.Lcd.print("To: "); M5.Lcd.println(macStr); M5.Lcd.print("Sts: "); M5.Lcd.println(status == ESP_NOW_SEND_SUCCESS ? "Delivery Success" : "Delivery Fail"); } void cbRecv(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]); M5.Lcd.setTextColor(GREEN); M5.Lcd.print("From: "); M5.Lcd.println(macStr); M5.Lcd.printf("Recv (%d): ", data_len); for ( int i = 0 ; i < data_len ; i++ ) { M5.Lcd.print(data[i]); M5.Lcd.print(" "); } M5.Lcd.println(); } void setup() { M5.begin(); M5.Lcd.fillScreen(BLACK); M5.Lcd.setTextSize(2); // ESP-NOW Init WiFi.mode(WIFI_STA); WiFi.disconnect(); if (esp_now_init() == ESP_OK) { M5.Lcd.print("ESPNow Init Success\n"); } else { M5.Lcd.print("ESPNow Init Failed\n"); ESP.restart(); } memset(&slave, 0, sizeof(slave)); for (int i = 0; i < 6; ++i) { slave.peer_addr[i] = (uint8_t)0xff; } esp_err_t addStatus = esp_now_add_peer(&slave); if (addStatus == ESP_OK) { Serial.println("Pair success"); } // ESP-NOW callback esp_now_register_send_cb(cbSend); esp_now_register_recv_cb(cbRecv); } uint8_t cnt = 0; void loop() { M5.update(); if ( M5.BtnA.wasPressed() ) { uint8_t data[3]; data[0] = cnt; data[1] = cnt + 1; data[2] = cnt + 2; cnt ++; esp_err_t result = esp_now_send(slave.peer_addr, data, sizeof(data)); Serial.print("Send Status: "); if (result == ESP_OK) { Serial.println("Success"); } else if (result == ESP_ERR_ESPNOW_NOT_INIT) { Serial.println("ESPNOW not Init."); } else if (result == ESP_ERR_ESPNOW_ARG) { Serial.println("Invalid Argument"); } else if (result == ESP_ERR_ESPNOW_INTERNAL) { Serial.println("Internal Error"); } else if (result == ESP_ERR_ESPNOW_NO_MEM) { Serial.println("ESP_ERR_ESPNOW_NO_MEM"); } else if (result == ESP_ERR_ESPNOW_NOT_FOUND) { Serial.println("Peer not found."); } else { Serial.println("Not sure what happened"); } } if ( M5.BtnC.wasPressed() ) { M5.Lcd.fillScreen(BLACK); M5.Lcd.setCursor(0, 0); } delay(1); } |
左側がM5Stack Gray、右側がM5Goで、上記同じプログラムを書き込みます。(書き込み設定も全く同じ)
電源を入れます。
M5StackのAボタンを二回押します。
M5GoのAボタンを二回押します。
M5GrayのAボタンを一回押します。
送受信ができていることが確認できました。
ちなみにCボタンで画面をクリアできます。
WiFiでMACアドレスに対してに直接通信をしているようです。ルータとか使わず2台のみで直接データのやりとりができる点は手軽です。
台数を増やして、ディスプレイを利用したメディアアート的な使い方をするのも面白いかもしれません。