4
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?

【ESP32】Micropythonで始めるESP-NOW

Last updated at Posted at 2022-07-10

はじめに

皆さんは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が受信用のプログラムです.

sender.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')
receiver.py
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だけが受信されています.
スクリーンショット 2022-05-11 173841.png

おわりに

簡単なメッセージのやりとりだけであればすぐに実装することができました.
開発途中とはいえほとんど完成に近いと思います.
mainブランチに実装されることを心待ちにしてます.

4
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
4
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?