0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

ESP-NOWでマルチホップで通信する方法

Last updated at Posted at 2024-07-12

はじめに

ESP32でESP-NOWでマルチホップで通信を行います.実装はMicroPython1.22.1で行いました.以下のように3つのESP32に3つのコードを実装します.
image.png

実装

MicroPythonの公式ドキュメントを参考に実装を行いました.
send.pyが送信を行うプログラム,relay.pyが受信したデータを転送するプログラム,receive.pyがデータを受信するプログラムです.

send.py
import network
import espnow
import time

try:
    # A WLAN interface must be active to send()/recv()
    sta = network.WLAN(network.STA_IF)  # Or network.AP_IF
    sta.active(True)
    sta.disconnect()      # For ESP8266

    e = espnow.ESPNow()
    e.active(True)
    peer = b'0\xae\xa4\xd4}\x04'   # MAC address of peer's wifi interface
    e.add_peer(peer)      # Must add_peer() before send()

    e.send(peer, "Starting...")

    for i in range(60):
        e.send(peer, str(i), True)
        print(i)
        time.sleep(1)

    e.send(peer, b'end')
    e.active(False)
    sta.active(False)
    
    time.sleep(60)
	
except Exception as e:
    f = open("error.log", "a")
    f.write(str(e))
    f.write("\n")
    f.close()
    e.active(False)
    sta.active(False)

peerには送信先のmacアドレスを入力してください.
送信内容を変更するにはe.send()の2番目の引数を変更してください.
e.sendのすぐ下のprint部分では送信した内容を出力してます.
printする内容も送信内容に応じて変更してください.

relay.py
import network
import espnow
import time
    
try:
    # A WLAN interface must be active to send()/recv()
    sta = network.WLAN(network.STA_IF)
    sta.active(True)
    sta.disconnect()   # Because ESP8266 auto-connects to last Access Point

    e = espnow.ESPNow()
    e.active(True)
    peer = b'\x10R\x1ch\x88D'
    e.add_peer(peer)

    while True:
        host, msg = e.recv()
        if msg:             # msg == None if timeout in recv()
            print(host, msg)
            e.send(msg)
            time.sleep(1)
            if msg == b'end':
                break

    e.active(False)
    sta.active(False)
    
    time.sleep(60)
    
except Exception as e:
    f = open("error.log", "a")
    f.write(str(e))
    f.write("\n")
    f.close()
    e.active(False)
    sta.active(False)

peerには送信先のmacアドレスを入力してください.

receive.py
import network
import espnow
import time


try:
    # A WLAN interface must be active to send()/recv()
    sta = network.WLAN(network.STA_IF)
    sta.active(True)
    sta.disconnect()   # Because ESP8266 auto-connects to last Access Point

    e = espnow.ESPNow()
    e.active(True)

    while True:
        host, msg = e.recv()
        if msg:             # msg == None if timeout in recv()
            print(host, msg)
            if msg == b'end':
                break
        
    e.active(False)
    sta.active(False)

    time.sleep(60)

except Exception as e:
    f = open("error.log", "a")
    f.write(str(e))
    f.write("\n")
    f.close()
    e.active(False)
    sta.active(False)

送信側のコードを実行すると以下のように送信したデータが出力されます.
image.png
受信したデータを転送するコードを実行すると以下のように出力されます.
image.png
左側の部分が送信元のmacアドレス,右側の部分が受信したデータの内容です.
データを受信するコードを実行すると以下のように出力されます.
image.png
左側の部分が送信元のmacアドレス,右側の部分が受信したデータの内容です.
転送するコードと受信するコードで出力されるmacアドレスが違うものになっていればマルチホップで通信できています.

最後に

拙いですが見た方の助けになれば幸いです.

参考にしたサイト

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?