見出し画像

(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のブロックがあります。

通信させてみる

EspNowブロックには「Init」「Write」「Read」「Callback」の種別があります。「Init」はEspNowを使えるようにする初期化処理についてのブロックです。「Write」は送信ブロック、「Read」は受信ブロック、「Callback」は送信や受信が行われたことをきっかけに、追加で実行する内容を決めておくブロックです。

まずは、基本の通信をさせてみましょう。

1.receive callback(受信時の動作)

まず、受信時の動作を決めておきます。

受信時には送信元のmacアドレス(mac)と、受信したデータ(data)が送られてきます。一旦変数に格納して、それらをラベルに表示させましょう。

2.初期化処理(Init)

EspNowの初期化処理として、チャンネル番号の設定とreceive callbackの有効化(enable)をします。

3.送信処理

とりあえず、ボタンを押したときにブロードキャストでデータを送るようにします。data部分は1234以外でも構いません。

プログラムの全体像は以下のようになります。 

2台のM5GOにプログラムを転送してボタンAを押せば、label0に送信してきた相手のMACアドレスが、label1に送信されてきたデータが表示されるはずです。

データ部分をじゃんけんにおける相手の手にすれば、どのM5GOが、何の手を送ってきたのかがわかります。ちなみに、すべての通信はテキストで行われます。

MACアドレスから個体を特定

送信してきた相手が、どのM5GOかは、MACアドレスで特定できるのですが、12桁の文字列ですので、ぱっと見で判断することは困難です。
今回は、その問題を解決するためにEEPROM(M5GOの内蔵メモリ)を使用することにします。EEPROMは、ハードウェアの中にあります。

EEPROMにはkeyに対してvalue(値)を保存しておくことができます。
今回は、ファームウェアを書き込む際に、EEPROMにkeyを個体番号にして、valueにMacアドレスをあらかじめ記録しています。

したがって、recieve callbackを以下のように変更します。

ループブロックはいくつかありますが、カウント用変数iにカウントアップしながら数字を入れてループさせるブロックを使用します。(以下の画像ではカウント用変数がjになっています)

EEPROMからiをカウントアップしながら読み込み、それが、受信したmacアドレスと一致したとき、MACアドレスの代わりにiを表示します。なお、keyにはテキストを入れなければなりませんが、iは数値なので、テキストに変換するブロックを使用してテキストとしてkeyを読み込ませます。そうしないと、一致しません。
このように、プログラムにおいては、テキストと数値は明確に区別されます。

実行したあと、ボタンAを押した結果は以下のとおりです。

通信しているのが、2台だけならこれでよいのですが、実際にこれを教室で行うと、教室中の端末の通信を全て受信することになります。例えば、No39の通信内容を表示していたかと思ったら、次の瞬間にはNo21の通信内容を表示している、などです。

これは、ブロードキャストで通信を送り合っているからなのですが、特定の相手とだけ通信したい場合は、MACアドレスを指定して送信する必要があります。以下の画像の赤枠部分が、そのブロックです。
「Init」で「peer」に相手のMACアドレスを指定し、「id」を設定するブロックを使用します。
また、「Write」では、設定した「id」向けに送信するブロックを使用します。

MACアドレスを指定して送信するサンプルは以下のとおりです。
変数「相手の番号」で指定した番号を「id1」に追加し、「id1」に送信します。(ラベルにはMACアドレスを表示しています)
このプログラムの場合は送信相手ごとに変数「相手の番号」の数字を書き換えて送る必要があります。

いいなと思ったら応援しよう!