うごくものをつくる

個人的な学習ノート

基礎技術メモ

ESP-NOWによる無線通信の使い方(受信編)

ESP-NOWを使ったESP32マイコン同士のデータ通信について、本記事では受信の方法を記す。

こちらも必要最低限(と思われる)部分のみ記載する。先に送信についての記事を書いたので、こちらの記事については内容は薄めで行く。送信編の記事はこちら。

1,必要なライブラリのインクルード

#include <WiFi.h>
#include <esp_now.h>

ここは送信用のコードと同様に、必要なライブラリであるWiFi.hとesp_now.hをインクルードする。

2,ESP-NOW機能を初期化

ここの初期化のやり方も、送信用コードと全く同じ。

WiFi.mode(WIFI_STA); //Wi-Fi機能をステーションモードで起動
    WiFi.disconnect(); //初期化前にWi-Fi接続を切断
    if (esp_now_init() == ESP_OK) {
        Serial.println("ESP-Now Init Success");
    }

3,受信時に実行される関数を設定

esp_now_register_recv_cb(dataRecv);

何らかのデータを受信したときに実行される関数をesp_now_register_recv_cb()で設定する。カッコの中に書いた関数がデータ受信時に呼び出される。ここではdataRecvという名前の関数を呼び出すことにした。

4,受信時に実行される関数の定義&実装

void dataRecv(const uint8_t *addr, const uint8_t *data, int dataSize) {
  //データ受信時に実行したい内容をここに書く。
}

先程設定したdataRecvという関数の中身を具体的に作っていく。

ここで、addrは送信した機器のMACアドレス、dataは受信したデータ、dataSizeは受信したデータのサイズ、つまりsizeof(data)である。関数内でこれらを使いたい場合は使う。

5,まとめ&サンプルコード

受信用のコードは送信よりもさらにシンプル。もうこれだけでデータの無線通信ができるんだからESP-NOWは便利でいいね!

ここまでの内容を統合し、各種機能を付け足したサンプルコードを以下に記す。

#include <Arduino.h>
#include <WiFi.h>
#include <esp_now.h>

void dataRecv(const uint8_t *addr, const uint8_t *data, int dataSize)//データ受信時に呼び出される関数
{
  //受信したデータをシリアルコンソールに表示
  Serial.print("Received data is, ");
  Serial.print(data[0]);
  Serial.print(" , ");
  Serial.print(data[1]);
  Serial.print(" , ");
  Serial.println(data[2]);

  if(data[0]%3 == 0)//dataの0番目に格納されている値を3で割った余りが0だったら(3の倍数だったら)
  {
    digitalWrite(2, HIGH);//ボード上のLED点灯
  }
  else digitalWrite(2, LOW);//ボード上のLED消灯
}

void setup() {

  Serial.begin(115200);
  
  WiFi.mode(WIFI_STA); //Wi-Fi機能をステーションモードで起動
    WiFi.disconnect(); //初期化前にWi-Fi接続を切断
    if (esp_now_init() == ESP_OK) {
        Serial.println("ESP-Now Init Success");
    }

    esp_now_register_recv_cb(dataRecv);//データ受信時にdataRecvを呼び出すように設定

  //その他設定
  pinMode(2, OUTPUT);//開発ボード上のLED(D2ピンに繋がっている)を出力に設定
}

void loop() {
  //今回のサンプルではloop()内でやることは特に無い。
}

送信編の記事にて記載したサンプルコードは、ボタンを押したら要素数3つのリストを送信するというものだった。リストの0番目の値は送信回数、1番目の値は送信回数に5を掛けたもの、2番目の要素は常に47、という3つの整数からなるリストの送信をしている。

そこで今回の受信用サンプルは、リストの0番目の要素が3の倍数であったときにLEDを点灯し、それ以外であれば消灯する、という動作にした。つまり送信機のボタンを押していくと3回に1回受信機側のLEDが点灯するという動作となる。

ちなみに、パソコン側のシリアルコンソールで送られてきたデータの中身を見るとこんな感じである。

シリアルコンソール画面

送信側で送ったデータのとおり、「送信回数, 送信回数を5倍した値, 47」というリストがちゃんと受信できている。

自分の頭の整理のために送信編、受信編と2回に分けてESP-NOWの使い方説明を書いたけど、2回に分ける必要もないくらいかなり簡単に無線通信ができた。送信編にも書いたけど、多少パケットロスによる通信エラーになったって気にしないような用途において、ESP-NOWを使うのはかなり楽なのでおすすめしたい。

(おわり)

返信する

メールアドレスが公開されることはありません。 が付いている欄は必須項目です