(4)M5Stack BasicとM5Stamp Pico 、UIFlowでダイソー「ピンポンブザー」を早押し対応にする - プログラミング
前回はこちら
さて、ハードウェア的な改造は済みましたので、あとはプログラミングです。プログラミング環境は、UIFlowを使用してブロックプログラミングを行います。
M5Stamp PicoをUIFlowとつなげる
M5Stamp Picoは、API keyが自身のMacアドレスになっています。
また、ディスプレイがないので、搭載されているLEDでUIFlowとの接続状態を確認します。SSIDやパスワードなどのWiFi設定がきちんとされ、LEDが緑色になっていればWiFiを通じてインターネットに出ていけています。
買ってきたばかりのデフォルトはWiFi設定モードのようです。
だいたいファームウェア更新していると思うので、その場合はこの限りではありませんが、必要に応じて設定をしてください。
親機側はM5Stack Basicを使用しますので、子機である、M5Stamp Picoとはいつも通り(?)EspNowを使用してM5Stamp Picoとは通信することにします。
EspNowのブロックは、「高度なブロック」の中にあります。
子機のプログラミング
「init」のブロックで初期化処理をします。チャンネル1、データタイプはSTRINGがデフォルトです。そのままで構いません。
「add」ブロックでpeerに、親機であるM5Stack BasicのMacアドレスを指定します。あとはそのままで構いません。
また、ピンの初期化も行います。ピン番号(GPIO)0 をpin0として初期化します。入力を検知するので、モードはIN、ピンの状態はPULL UPのままでよいです。
以上が初期化処理です。結局、peer以外はデフォルトのままから変更しないので、ブロックを置くだけです。
ピンポンブザー内部のICの8番ピンは、常時3V「1」が出力されており、基板上のボタンが押されると、0V「0」が出力されます。そのため、ICの8番ピンに繋がっているGPIO 0が「0」になったことを判定して、「押したよ」ということを親機に伝えるため、id「1」に対して文字列「Push」を送信します。
ただし、これだとプログラム的には不完全です。
実際には、複数回この信号が送られることになります(動作確認の際、LEDは点滅していたため、1、0、1、0となっていたはず)。
押したときの最初に0になったときの1回だけ送信するようにするため、変数「PushSend」を用意して、falseを入れる処理を初期化処理に追加、falseだったら信号を送ってPushSendをtrueにする処理を入れることで、次のGPIOの変化を無視するようにします。
また、これにより、ボタンを複数回押しても意味はなくなります。
修正後は以下のとおりです。
このままだと、本当に最初の1回しか送信しなくなるので、「recieve callback」ブロックにより、親機からの信号を受けたときにPushSendをFalseに戻す処理をいれ、再び送信できるようにします。
「recieve callback」では、送ってきた個体の「Macアドレス」と「実データ」を「mac」と「data」として受け取ることができるので、それぞれ変数を用意して格納し、送ってきたのが親機だった場合に限るため、「もし」の処理を入れ、親のmacアドレスと一致しているか調べています。
プログラムの全体としてはこのようになります。
親機のプログラミング
次に親機側です。
EspNowの初期化処理はほぼ同じ。違うのはpeerを「FFFFFFFFFFFF」にすることで、ブロードキャスト通信(相手を限らない通信)にしているところです。変数「Push」を用意して、「0」に初期化します。
ラベル上には自機のmacアドレスと、このPushを表示しておきます。(自機のmacアドレスの表示は必須ではない)
誰かから通信が送られてきた場合(recieve callback)、この変数「Push」をその送られてきた対象のmacアドレスにします。
M5Stack BasicのAボタンでリセットするため、Pushを0に戻し、Reset信号を送ります(内容はなんでもよく、現状、親機がデータを送る、ということがリセットになります)。
これで、一応複数の子機がボタンを押したときでも、最初にデータを送ってきた子機のmacアドレスだけが表示されることになります。(親機の表示が変わるのは1回だけのため)
最低限早押しを判定するプログラムは組めました。
次回は、更にブラッシュアップしていきます。