![見出し画像](https://assets.st-note.com/production/uploads/images/112179132/rectangle_large_type_2_d54dc299e655700cf9f34e10032a46d4.png?width=800)
(4)M5Stack BasicとM5Stamp Pico 、UIFlowでダイソー「ピンポンブザー」を早押し対応にする - プログラミング
※本記事は、ダイソー製品に関する改造記事です。本記事を参考にして同様の改造を行い、何が起こったとしても責任はとれませんので、もし参考にする場合は、自己責任でお願いします。予めご了承の上、お読みください。なお、該当製品の「使用上の注意」には、「分解や改造をしないでください。」とありますので、(株)大創産業の想定していない使用方法であることを付記しておきます。完全自己責任です。
前回はこちら
さて、ハードウェア的な改造は済みましたので、あとはプログラミングです。プログラミング環境は、UIFlowを使用してブロックプログラミングを行います。
M5Stamp PicoをUIFlowとつなげる
M5Stamp Picoは、API keyが自身のMacアドレスになっています。
また、ディスプレイがないので、搭載されているLEDでUIFlowとの接続状態を確認します。SSIDやパスワードなどのWiFi設定がきちんとされ、LEDが緑色になっていればWiFiを通じてインターネットに出ていけています。
電源が切れている状態でボタンを押し続けて電源を入れると、「スイッチングモード」の状態になります。この状態では、LEDが緑、青、黄、紫の順で切り替わります。色の違いははモードの違いを表します。LEDが対応する色に切り替わったらボタンを離し対応するモードに入ります。
![](https://assets.st-note.com/img/1690845686913-cqDzR08l01.png?width=800)
緑:オンラインプログラミングモード(Web上のUIFlowに接続)
青:オフラインプログラミングモード(USBケーブルでデスクトップUIFlowに接続)
黄:WiFi設定モード(APモードで起動し、WiFi設定ができます)
紫:APPモード(書き込んであるプログラムを起動します)
買ってきたばかりのデフォルトはWiFi設定モードのようです。
だいたいファームウェア更新していると思うので、その場合はこの限りではありませんが、必要に応じて設定をしてください。
親機側はM5Stack Basicを使用しますので、子機である、M5Stamp Picoとはいつも通り(?)EspNowを使用してM5Stamp Picoとは通信することにします。
EspNowのブロックは、「高度なブロック」の中にあります。
子機のプログラミング
「init」のブロックで初期化処理をします。チャンネル1、データタイプはSTRINGがデフォルトです。そのままで構いません。
![](https://assets.st-note.com/img/1690803868190-gGHrYeWfSE.png)
「add」ブロックでpeerに、親機であるM5Stack BasicのMacアドレスを指定します。あとはそのままで構いません。
![](https://assets.st-note.com/img/1690803890947-kRS58sPoap.png)
また、ピンの初期化も行います。ピン番号(GPIO)0 をpin0として初期化します。入力を検知するので、モードはIN、ピンの状態はPULL UPのままでよいです。
![](https://assets.st-note.com/img/1690804023639-2oSVjDBGRn.png)
![](https://assets.st-note.com/img/1690803977996-gd9mvjqLZR.png)
以上が初期化処理です。結局、peer以外はデフォルトのままから変更しないので、ブロックを置くだけです。
ピンポンブザー内部のICの8番ピンは、常時3V「1」が出力されており、基板上のボタンが押されると、0V「0」が出力されます。そのため、ICの8番ピンに繋がっているGPIO 0が「0」になったことを判定して、「押したよ」ということを親機に伝えるため、id「1」に対して文字列「Push」を送信します。
![](https://assets.st-note.com/img/1690801109504-olUxY3OZOz.png)
ただし、これだとプログラム的には不完全です。
実際には、複数回この信号が送られることになります(動作確認の際、LEDは点滅していたため、1、0、1、0となっていたはず)。
押したときの最初に0になったときの1回だけ送信するようにするため、変数「PushSend」を用意して、falseを入れる処理を初期化処理に追加、falseだったら信号を送ってPushSendをtrueにする処理を入れることで、次のGPIOの変化を無視するようにします。
また、これにより、ボタンを複数回押しても意味はなくなります。
修正後は以下のとおりです。
![](https://assets.st-note.com/img/1690802350173-5XPhozOFnN.png)
このままだと、本当に最初の1回しか送信しなくなるので、「recieve callback」ブロックにより、親機からの信号を受けたときにPushSendをFalseに戻す処理をいれ、再び送信できるようにします。
![](https://assets.st-note.com/img/1690802582379-w8E5N9wwnH.png)
「recieve callback」では、送ってきた個体の「Macアドレス」と「実データ」を「mac」と「data」として受け取ることができるので、それぞれ変数を用意して格納し、送ってきたのが親機だった場合に限るため、「もし」の処理を入れ、親のmacアドレスと一致しているか調べています。
プログラムの全体としてはこのようになります。
![](https://assets.st-note.com/img/1690802497495-p2cQwGGwx9.png)
親機のプログラミング
次に親機側です。
EspNowの初期化処理はほぼ同じ。違うのはpeerを「FFFFFFFFFFFF」にすることで、ブロードキャスト通信(相手を限らない通信)にしているところです。変数「Push」を用意して、「0」に初期化します。
ラベル上には自機のmacアドレスと、このPushを表示しておきます。(自機のmacアドレスの表示は必須ではない)
誰かから通信が送られてきた場合(recieve callback)、この変数「Push」をその送られてきた対象のmacアドレスにします。
M5Stack BasicのAボタンでリセットするため、Pushを0に戻し、Reset信号を送ります(内容はなんでもよく、現状、親機がデータを送る、ということがリセットになります)。
![](https://assets.st-note.com/img/1690803478044-h8rKuEPaLn.png)
これで、一応複数の子機がボタンを押したときでも、最初にデータを送ってきた子機のmacアドレスだけが表示されることになります。(親機の表示が変わるのは1回だけのため)
最低限早押しを判定するプログラムは組めました。
次回は、更にブラッシュアップしていきます。
この記事が気に入ったらサポートをしてみませんか?