環境
- ESP32-DevKitC V4 × 2個(MasterとSlave)
- Arduino IDE (Windows Store 1.8.57.0)
- ボード ESP32 Dev Module(ESP32 Espressif Systems v 1.0.6)
使用サンプル
ESP32 Dev Moduleの「スケッチ例」->「ESP32」->「ESPNow」->「Basic」のMaster/Slaveのセット
\ArduinoData\packages\esp32\hardware\esp32\1.0.6\libraries\ESP32\examples\ESPNow\Basic の MasterとSlave
発生エラー
Slaveのpeerにデータを送るタイミング(esp_now_send)で「違うチャンネルには送れないよ!」と怒られる。
E (838684) ESPNOW: Peer channel is not equal to the home channel, send fail!
Send Status: Invalid Argument
原因
文字通り違うチャンネルには送れないみたい。公式サイトになんとなくそれを前提としていそうなことは書いてあるけど明示してある箇所は見つけていない。(メッセージがそのままなのでまぁ間違いはないんだろう。)ここらみると2020年の冬ぐらいの1.0.5-rc2で変わったのかな?
For example, the destination device doesn’t exist; the channels of the devices are not the same
Masterは自分がDefaultの1チャンネルになっていて送信想定が3チャンネルになっているので引っかかっている。(それはそれとしてサンプルのSlaveはチャンネルが1になっているのにMasterのソースでは3を指定しているのでそこでも不整合が生じている)
対処
チャンネルを合わせればよい。
1chで上げる場合
Slaveは1チャンネルで上がっているので、送信想定を1にしてやればよい
define CHANNEL 1
slave.channel = CHANNEL;
その他チャンネルで上げる場合
Master/Slaveのチャンネルを任意(使用可能は1~13)に指定してやればよい。
Slave(APモード)のチャンネル指定
Slaveは(違和感あるけど)APモードになっていてSoftAP立ち上げの際に指定できる。
define CHANNEL 1 // からの
bool result = WiFi.softAP(SSID, "Slave_1_Password", CHANNEL, 0);
Master(STAモード)のチャンネル指定
MasterはSTAモードになってる。ここをみるとSTAモードのときはsoft-APもstationモードと一致するらしい。(で。ドキュメントで確認できていないけどESPNowもsoft-APの設定使って動いているみたい。Espressif だとソース見れないみたいだけどM5Stackの方では派生したもの?みれるようなのでそっち追えばわかるかも)
3. ESP32 is limited to only one channel, so when in the soft-AP+station mode, the soft-AP will adjust its channel automatically to be the same as the channel of the ESP32 station.
指定方法の正しい作法はわからなかった。動いたのは以下の操作。
#include <esp_wifi.h>// して
void setup() {
//の
WiFi.mode(WIFI_STA);
// した後に
esp_wifi_set_channel(CHANNEL, WIFI_SECOND_CHAN_NONE); // チャンネルを指定してあげる
その他
チャンネルについて
2.4 GHz 帯の中で微妙に周波数変えて周波数ごとにデータ送るやつ。こことかわかりやすい。日本だと1-13チャンネル使えてESPも1-13指定できる。(多分同じ奴だと思うけど調べてない)チャンネル近いと干渉するので、既存の機器と重なったりしたら変えてみると幸せかもしれない。
少し上のWIFI_SECOND_CHAN_NONEについて
「チャンネル2つ使うとデータが倍の勢いで送受信できる」ってやつを使うかどうかの選択パラメータで使わない(HT20)を指定している。使う(HT40)指定のWIFI_SECOND_CHAN_ABOVEとWIFI_SECOND_CHAN_BELOWもあるけどESPNowには多分反映されないでWifiの方だけにかかわると思う。(とりあえず速さいらんと思うのでちゃんと調べてはいない)