hiro yamamoto works

マイコンハード、ソフトを作ったりしています。
お家や現場のお困りごと解決に!
内容利用は自己責任でお願いします。

ESP-NOWでリモートI/Oを作る

2022-02-24 08:23:00 | マイコンハードウェア

伝送接点数16 単方向(送信側→受信側への伝送のみ)

離れたところにある機器の信号を、電波が届く範囲で
配線無しで受け取ることができる。
ESP32同士で直接通信するのでアクセスポイントは不要
アクセスポイントを使わないので、安定して伝送できる到達距離は短くなります。伝送速度を必要としない用途では、到達距離を延ばせる設定があります。
到達距離の試験はしていませんがネット記事には500m届いたとかありました

WiFi.mode(WIFI_STA);//このあとに
esp_wifi_set_protocol( WIFI_IF_STA, WIFI_PROTOCOL_LR );//追加します

ただし、この設定を使ったあと、元に戻すときに不具合が出ました。
不具合はフラッシュツールesptool.pyでフラッシュを消去すると回復することができました。esptool.pyは別途インストール不要でした。
Raspberry Piでのフラッシュ消去方法
ファイルマネージャで
/home/pi/.arduino15/packages/esp32/tools/esptool_py/3.0.0へ移動し
ツール(L)− 現在のフォルダを端末で開く(T)
コマンド実行例 ./esptool.py --port /dev/ttyUSB0 -b 115200 erase_flash

主な部品 ESP32開発ボード、I/OエキスパンダMCP23017

テストの様子

右側が送信、左側が受信となっています。
Arduino-UNOで送信側のテスト信号を作ってMCP23017へ
入力しています。

MCP23017のデジタル入力を読み込み、16進数を文字配列
としてESP-NOWで送信
受信した文字配列を16進数へ変換してMCP23017のデジタル
出力へ出力する。

まだ十分理解できていませんのでおかしな点があると思います
がスケッチを紹介しておきます。

送信側 スケッチ抜粋
String data = String (mcp.readGPIOAB(), HEX);
//16ピンすべて(ポートAおよびB)を単一の16ビット変数に読み込みます。
//16ピンすべてを表す16ビット変数を返します
esp_err_t outcome = esp_now_send(broadcastAddress, (uint8_t *) &data, sizeof(data));

受信側 スケッチ抜粋
char intData[12];
unsigned int GPIO_BA;
void data_receive(const uint8_t * mac, const uint8_t *rcvData, int len) {
memcpy(&intData, rcvData, 5);
long Data = strtol(intData, NULL, 16);
//16進数表示で送られてきた文字配列を16進数数値に変換する
GPIO_BA = Data;
mcp.writeGPIOAB(GPIO_BA);
//すべてのピンを一度に書き込みます。
//引数へ16進数を与えると対応する出力のON/OFFができる。
}



作例を公開している方々に感謝します。