![見出し画像](https://assets.st-note.com/production/uploads/images/162095375/rectangle_large_type_2_5382e6708d40447c7749e925ed59530a.png?width=1200)
(9)M5GOとUIFlowでプログラミング - じゃんけんゲームをつくろう(通信・EEPROM)
さて、(8)までで、自分の手を表示することはできました。じゃんけんゲームをするには相手の手を知らなければなりません。
通信について
通信機器にはMACアドレス(Media Access Control address)と呼ばれる12桁の固有の番号が割り当てられてあり、原則として重複することはありません。
通信するときはこのMACアドレスを指定して通信相手を決めます。
じゃんけんでいうと、いきなり教室で「じゃーんけーん、」と始めても誰が反応してよいか分からないので、「〇〇さん!じゃーんけーん、」と相手を指定するイメージです。
この例でいうと、相手を指定せずに「じゃーんけーん、」と始めることもでき、これは「ブロードキャスト通信」といいます。ブロードキャスト通信では相手に「FFFFFFFFFFFF」を指定します。「みんな!じゃーんけーん、」みたいな感じですね。
ESPNowによる通信
さて、M5製品同士で通信をすることができます。様々な通信方法をとることができますが、ここでは比較的扱いが簡単な「EspNow」という方法を使用してみます。M5製品はESP32というマイコンをベースにしていますが、ESP32同士はこのEspNowで通信することができます。Wi-Fi通信を応用した通信方法のようです。
UIFlow(v1.13.8)には、EspNowを扱うブロックが用意されています。
高度なブロックの中にEspNowのブロックがあります。
![](https://assets.st-note.com/img/1731760868-khNqwxFP4ZIEgDustoGj6TrQ.png?width=1200)
通信させてみる
EspNowブロックには「Init」「Write」「Read」「Callback」の種別があります。「Init」はEspNowを使えるようにする初期化処理についてのブロックです。「Write」は送信ブロック、「Read」は受信ブロック、「Callback」は送信や受信が行われたことをきっかけに、追加で実行する内容を決めておくブロックです。
まずは、基本の通信をさせてみましょう。
1.receive callback(受信時の動作)
まず、受信時の動作を決めておきます。
![](https://assets.st-note.com/img/1731760868-iFOh4Cr6N0pyx75cszHUklta.png)
受信時には送信元のmacアドレス(mac)と、受信したデータ(data)が送られてきます。一旦変数に格納して、それらをラベルに表示させましょう。
2.初期化処理(Init)
EspNowの初期化処理として、チャンネル番号の設定とreceive callbackの有効化(enable)をします。
![](https://assets.st-note.com/img/1731760868-PwoaklQCZNdqisuKz4UtVA1H.png)
3.送信処理
とりあえず、ボタンを押したときにブロードキャストでデータを送るようにします。data部分は1234以外でも構いません。
![](https://assets.st-note.com/img/1731760868-St8eXcN0nMlBwUhuQm6bsExr.png)
プログラムの全体像は以下のようになります。
![](https://assets.st-note.com/img/1731760868-KV54h8QlF92oLfrEXqCpUbYw.png?width=1200)
2台のM5GOにプログラムを転送してボタンAを押せば、label0に送信してきた相手のMACアドレスが、label1に送信されてきたデータが表示されるはずです。
![](https://assets.st-note.com/img/1731760871-FUbnYJ7L2uK0ACOpt9ZoMH13.png?width=1200)
データ部分をじゃんけんにおける相手の手にすれば、どのM5GOが、何の手を送ってきたのかがわかります。ちなみに、すべての通信はテキストで行われます。
MACアドレスから個体を特定
送信してきた相手が、どのM5GOかは、MACアドレスで特定できるのですが、12桁の文字列ですので、ぱっと見で判断することは困難です。
今回は、その問題を解決するためにEEPROM(M5GOの内蔵メモリ)を使用することにします。EEPROMは、ハードウェアの中にあります。
![](https://assets.st-note.com/img/1731760868-8fShZdBXQoEqRx46VOMI7Jc3.png?width=1200)
EEPROMにはkeyに対してvalue(値)を保存しておくことができます。
今回は、ファームウェアを書き込む際に、EEPROMにkeyを個体番号にして、valueにMacアドレスをあらかじめ記録しています。
したがって、recieve callbackを以下のように変更します。
![](https://assets.st-note.com/img/1731760868-gS2HthU3Wzn5K1d7FZXiGYcB.png?width=1200)
ループブロックはいくつかありますが、カウント用変数iにカウントアップしながら数字を入れてループさせるブロックを使用します。(以下の画像ではカウント用変数がjになっています)
![](https://assets.st-note.com/img/1731760868-JoEuasVTwY8Mv7dmc94l5hrX.png)
EEPROMからiをカウントアップしながら読み込み、それが、受信したmacアドレスと一致したとき、MACアドレスの代わりにiを表示します。なお、keyにはテキストを入れなければなりませんが、iは数値なので、テキストに変換するブロックを使用してテキストとしてkeyを読み込ませます。そうしないと、一致しません。
このように、プログラムにおいては、テキストと数値は明確に区別されます。
![](https://assets.st-note.com/img/1731760868-eAuziYSD6tQXIKl7gr5Nxbmy.png?width=1200)
実行したあと、ボタンAを押した結果は以下のとおりです。
![](https://assets.st-note.com/img/1731760871-8rcBd10iY5myLDt2OzQoeNAZ.png?width=1200)
通信しているのが、2台だけならこれでよいのですが、実際にこれを教室で行うと、教室中の端末の通信を全て受信することになります。例えば、No39の通信内容を表示していたかと思ったら、次の瞬間にはNo21の通信内容を表示している、などです。
これは、ブロードキャストで通信を送り合っているからなのですが、特定の相手とだけ通信したい場合は、MACアドレスを指定して送信する必要があります。以下の画像の赤枠部分が、そのブロックです。
「Init」で「peer」に相手のMACアドレスを指定し、「id」を設定するブロックを使用します。
また、「Write」では、設定した「id」向けに送信するブロックを使用します。
![](https://assets.st-note.com/img/1731760868-ZmMLrop5KHca7uvsnX2FwTjV.png?width=1200)
MACアドレスを指定して送信するサンプルは以下のとおりです。
変数「相手の番号」で指定した番号を「id1」に追加し、「id1」に送信します。(ラベルにはMACアドレスを表示しています)
このプログラムの場合は送信相手ごとに変数「相手の番号」の数字を書き換えて送る必要があります。
![](https://assets.st-note.com/img/1731760868-LHUwlo8cECNa9Z7YnJyAOtzb.png?width=1200)