AtomLite (M5Stack) でMesh Netoworkを試してみた
はじめに
※ 2023/8/30 いただいたコメント を受けて記事を修正しました。painlessMeshはBluetoothでなくWIFI Mesh Newtworkライブラリです
以前からメッシュネットワークを試したいと思っていたけど、なんとなく敷居が高い気がしていて積んでおいたんだけど最近ESP32を使うことが多くなってきたのでそっちでやってみようかと思った。
色々調べてみるとpainlessMeshというMeshを簡単に扱えるライブラリがあることを知ったのでAtom Liteでこれを使って試してみようと思います。
やってみた
できたコードはこちら。painlessMeshのbasicサンプルをもとにしました。Atom Liteのノードから送信すると緑、ノードが他ノードからデータを受信すると青にLEDが点灯します。
複数のノードを起動してからノード一つをシリアルモニタで確認すると、他ノードとデータを送受信しているのが確認できます。
sendMessage: Hello from node 2510684577
startHere: Received from 632239657 msg=Hello from node 632239657
sendMessage: Hello from node 2510684577
startHere: Received from 632236789 msg=Hello from node 632236789
startHere: Received from 632239657 msg=Hello from node 632239657
startHere: Received from 2510683585 msg=Hello from node 2510683585
startHere: Received from 632236789 msg=Hello from node 632236789
sendMessage: Hello from node 2510684577
startHere: Received from 2510683585 msg=Hello from node 2510683585
startHere: Received from 632239657 msg=Hello from node 632239657
startHere: Received from 632236789 msg=Hello from node 632236789
startHere: Received from 2510683585 msg=Hello from node 2510683585
sendMessage: Hello from node 2510684577
startHere: Received from 632239657 msg=Hello from node 632239657
sendMessage: Hello from node 2510684577
startHere: Received from 632236789 msg=Hello from node 632236789
startHere: Received from 2510683585 msg=Hello from node 2510683585
startHere: Received from 632239657 msg=Hello from node 632239657
sendMessage: Hello from node 2510684577
startHere: Received from 632236789 msg=Hello from node 632236789
sendMessage: Hello from node 2510684577
sendMessage: Hello from node 2510684577
startHere: Received from 2510683585 msg=Hello from node 2510683585
startHere: Received from 632239657 msg
コードを見るとわかりますが、単にデータをブロードキャストするだけならMeshネットワークのセッション構築などをほぼ意識せず簡単にコードが書けることがわかります。
ただ、the problem with using delay() in your codeやLimitations and caveatsに書いてあるようにpainlessMeshの性質やESP32のリソース制限等に配慮すべきことがいろいろあります。このサンプルもLEDの点滅にdelay()
を使わずTaskSchedulerを使うことで送受信を妨げないようにしました。ある程度複雑なセンシング処理とpainlessMeshをコンカレントに動かす必要がある場合はマルチスレッドが必須です。
あと、普通に使えると思っていたM5Atomライブラリを入れた途端コンパイルエラーになってハマりました。原因は、M5AtomのTaskクラスがTaskSchedulerのTaskとかぶっているためです。これを回避するために更新したM5Atomライブラリをコードに内包しました。
おわりに
Atom Liteで試した感じでは各ノードの通信距離は見通しの良い場所で10m程度ですが、Mesh化することで両端の距離をかなり稼ぐことができます。試しに3つのMeshノードを配置して直線距離で30m離れた家の1階から2階のデータを受信することができました。
M5StackでMesh Networkが気軽に開発できることがわかったので活用シーンを色々考えていみようと思います。
Discussion
すみません、この記事を参考にさせていただきpainlessMeshのREADMEを読んでみたら、Bluetooth Meshと書いてなくWIFIを使用したもののような気がするのですが、当方の勘違いでしょうか??
ご指摘ありがとうございます。先入観でBluetooth Meshと思い込んでいましたが、おっしゃるとおり読み直すとWIFIを利用した非IPネットワークのようですね。記事を修正させていただきます。
早速コメントいただきありがとうございました。
BLE Meshはまとまった情報が無く、手探りで頑張るしか無さそうですね、、。少しづつ実験進めていつか自分もノウハウ共有できるよう頑張ってみます!
おっしゃるとおりですね。私もBLE Meshがやりたくていろいろ調べているうちにpainlessMeshにたどり着きました。結果BLEじゃなかったですが用件は満たせた感じです。つい先日 M5Stamp c3uでもこのサンプルが動作確認できたので低コストでのMesh構築の可能性を感じています。こちらももっと勉強します!