M5Stamp C3 vs M5Stamp Pico その3 ESP-NOW

2022年11月23日

M5Stamp C3

M5Stamp Pico

通信機能を色々試してみているのですが、TCP等ではどうしてもタイムラグや通信の落ちが気になってしまいます。色々試しており今回はESP-NOWです。

ESP32でESP-NOWを使って通信してみよう」や「M5StickCでESP-NOW その1」を参考にテストしてみました。

最初M5Stamp C3では上手くいったのですがpicoでは起動時に

ESPNow Init Success
E (131) ESPNOW: Peer interface is invalid
Failed to add peer_1
となり起動してくれませんでした。2行目はM5のOS自体がエラーとして書き出しているエラーメッセージですね。ESP-NOWのINITは成功しているのになぜなのか、結構悩みました。しかもなぜか起動時のメッセージも文字化けしています。

etsRչ ⸮⸮16⸮⸮⸮22⸮⸮j

!⸮⸮:0⸮ ⸮]ER⸮⸮%UMT)⸮⸮⸮⸮ųB⸮A%}⸮A⸮⸮e⸮A⸮⸮%⸮O⸮JC⸮⸮⸮˥⸮⸮ip’⸮⸮87⸮Ӣ⸮,ZA%WP⸮•e
⸮,k⸮E⸮v:⸮⸮⸮)}⸮r⸮’⸮A0⸮⸮E⸮v⸮⸮⸮0,c.⸮⸮rv’⸮⸮0,⸮}⸮rv’⸮⸮0,⸮}⸮rv⸮⸮⸮0
⸮[⸮⸮:⸮R⸮ ⸮⸮c⸮"⸮⸮:⸮C!⸮+⸮i0x&֙00&bb⸮⸮⸮11⸮j⸮⸮0 ⸮XZ ⸮⸮⸮r⸮⸮4
⸮⸮d:⸮Ѱ⸮‚0⸮ɕ⸮:⸮⸮&⸮
⸮녑:⸮Ѱ‚⸮00⸮⸮⸮:3⸮6C⸮⸮⸮⸮⸮ 0⸮⸮⸮0⸮Y,H⸮

送信側スケッチ

#include "esp_now.h"
#include "WiFi.h"
#define BUTTON_PIN 39
uint8_t slaveAddress[] = { 0x34, 0xB4, 0x72, 0x10, 0x11, 0x12 };
void onSend(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.println(macStr);
Serial.println(status == ESP_NOW_SEND_SUCCESS ? "Success" : "Failed");
}

void setup() {
Serial.begin(115200);
Serial.println();
Serial.println();
pinMode(BUTTON_PIN, INPUT);
WiFi.mode(WIFI_STA);

WiFi.disconnect();

if (esp_now_init() == ESP_OK) {
Serial.println("ESPNow Init Success");
}
delay(20);
esp_now_register_send_cb(onSend);

esp_now_peer_info_t peerInfo;

peerInfo.channel = 0;
peerInfo.encrypt = false;

memcpy(peerInfo.peer_addr, slaveAddress, 6);
if (esp_now_add_peer(&peerInfo) != ESP_OK) {
Serial.println("Failed to add peer_1");
return;
}
esp_now_register_send_cb(onSend);
}

void loop() {
if (digitalRead(BUTTON_PIN) == LOW) {
uint8_t data[2] = { 111, 222 }; // 送信データ
esp_err_t result = esp_now_send(slaveAddress, data, sizeof(data));

Serial.print("Send Status: ");
switch (result)
{
case ESP_OK:
Serial.println("Success");
break;
case ESP_ERR_ESPNOW_NOT_INIT:
Serial.println("ESPNOW not Init.");
break;
case ESP_ERR_ESPNOW_ARG:
Serial.println("Invalid Argument");
break;
case ESP_ERR_ESPNOW_INTERNAL:
Serial.println("Internal Error");
break;
case ESP_ERR_ESPNOW_NO_MEM:
Serial.println("ESP_ERR_ESPNOW_NO_MEM");
break;
case ESP_ERR_ESPNOW_NOT_FOUND:
Serial.println("Peer not found.");
break;

default:
Serial.println("Not sure what happened");
break;
}

}
delay(100);
}

いろいろなところに載っているコードとほぼ同じなのですが、コンパイルは問題なく通るのですが、同一のコードで(ピン番号等は機種ごとに合わせす必要あります)C3では動くのにPICOでは起動してくれません。

諸諸調べたところ。

setup中にある

esp_now_peer_info_t peerInfo;

この部分が悪さをしており、これをsetupより前のヘッダー部分に記載することで上手く動作してくれました。どうやらpeerInfo構造体を初期化していないために発生する問題のようで、

setup中に記載するときは

esp_now_peer_info_t peerInfo = {}; ときちんと初期化してあげる必要があるようでした。

 

とりあえず動いたのですが、あまり汎用的でなさそうだし、一対多数で制御が自信がなかったのでこの項書きかけでほっておかれており、この先どう動かしたかもう記憶にないので途中ですが、次回Bluetoothに挑戦。

電子工作

Posted by akiba