はじめに
皆さんはESP-NOWを使ったことはありますか?
ESP-NOWはESP32同士で直接通信することが可能な便利な通信プロトコルです.
ネットに転がっている記事を読んだところArduino IDEで実装している人がほとんどだったので,今回はMicroPythonを使った実装方法を紹介しようと思います.
MicroPythonのESP-NOW
MicroPythonではESP-NOWは実はまだ開発段階であり,公式が配布しているファームウェアには残念ながら含まれていません!!!
しかしながら開発中のファームウェアがGitHubに上がっているのでそれを使います.
MicroPython1.21.0にてメインブランチに追加されたため,そちらを使ってください
(2024年1月23日追記)
This module is still under development and its classes, functions, methods and constants are subject to change. This module is not yet included in the main branch of micropython. Until such a time that the code is accepted into the micropython main branch, the following resources are available: Source code | Pre-compiled images | Pull request (PR#6515)
環境
バージョンは最近のものを選ぶと良いと思います.
なお今回使用するMicroPythonですが,何かこれといって特別なこともなくESP-NOW以外の機能は一切変わりありません.
- ESP32(DevKitC):2台
- MicroPython 1.18(上記のGitHubのリポジトリに上がっているもの)
実装
MicroPythonの公式リファレンスに載っていたプログラムを実行してみました.
以下sender.pyが送信用プログラム,receiver.pyが受信用のプログラムです.
import network
import espnow
# A WLAN interface must be active to send()/recv()
w0 = network.WLAN(network.STA_IF) # Or network.AP_IF
w0.active(True)
w0.disconnect() # For ESP8266
e = espnow.ESPNow()
e.active(True)
peer = b'\xbb\xbb\xbb\xbb\xbb\xbb' # MAC address of peer's wifi interface
e.add_peer(peer)
e.send("Starting...") # Send to all peers
for i in range(100):
e.send(peer, str(i)*20, True)
e.send(b'end')
import network
import espnow
# A WLAN interface must be active to send()/recv()
w0 = network.WLAN(network.STA_IF)
w0.active(True)
w0.disconnect() # Because ESP8266 auto-connects to last Access Point
e = espnow.ESPNow()
e.active(True)
peer = b'\xaa\xaa\xaa\xaa\xaa\xaa' # MAC address of peer's wifi interface
e.add_peer(peer)
while True:
host, msg = e.recv()
if msg: # msg == None if timeout in recv()
print(host, msg)
if msg == b'end':
break
実行結果
受信したESP32の出力の結果が以下になります.
最初のb'\xfc\xf5\xc4=;,'
というのは送信したESP32のMACアドレスです.
そのあとのメッセージが受信したもので,バイナリ型で送られてきます.
このプログラムの場合にはb'end'
を受け取った時点で受信を終了しているので,最初に送った20個の0だけが受信されています.
おわりに
簡単なメッセージのやりとりだけであればすぐに実装することができました.
開発途中とはいえほとんど完成に近いと思います.
mainブランチに実装されることを心待ちにしてます.