前回はUIFlow2版MicroPythonをつかってM5Stackの表示に触ってみました。今回はディスプレイ下部に並んでいる3個のボタンを使ってみます。前回同様M5モジュールの中のクラスや関数を使うので、ついでにM5モジュール内の「細々」したところにも触っていきたいと思います。API多すぎ。とても触り切れませぬ。
※「MicroPython的午睡」投稿順 Indexはこちら
※M5Stack Grayに書き込んだUIFlow2.0 (Alpha-27)対応のMicroPython処理系とWindowsパソコン上で動作しているThonny 4.0.1で動作確認しています。
M5.BOARD
前回、M5Stackのハードウエアに特有の制御などは「M5」というモジュールにまとめられている(既にインスタンス化されているハードウエア制御用のクラスも含まれている)ことを見ました。またハード特有な値を保持するtype定数(列挙型的な)を含んでいるオブジェクトもあるようです。以下はM5.BOARDクラスの先頭付近です。この後沢山の機種名が出てきます。こんなに多数の機種があるのね(そしてUIFlowも対応)。。。
さて、これを実行している現物の情報は以下の関数で読み取れるみたいです。
1ということは、一番上のM5Stackね。実際は「Grayバージョン」だけれども。
マルチディスプレイ?
前回、LCD周りを探ったときに「マルチディスプレイのため?」と思われるようなクラスや関数があるのを見ました。実機上で以下の関数を実行してみると。
1ね。素のままで表示画面は1個しかないし。別画面を接続して複数画面化もできるのかしら?またそのうち。
ハードウエアボタン
M5Stack Grayの表示の下部には、3個のハードウエア・ボタンが並んでおります。左からA、B、Cとな。ボタンAのHelpを見てみると以下の如し。
どうも、上記M5モジュールに含まれているBtnAというオブジェクトは、以下のhardware.buttonモジュール内で定義されている Button というクラスをボタンAのハードウエアのためにインスタンス化したものみたいです。
実際にコールバック関数のタイプなどは上記モジュール内のCB_TYPEクラス内で定義されているみたい。こんな感じ。
また、上記hardware.buttonクラス内にはハードウエアピンそのものを制御するためのClassも含まれており。多分フツーのGPIO制御から使えるものと結局は同じなのだと想像しますが(後で確かめます。)
今回実験のスクリプト
上記のようにハードウエアボタンを制御するためのオブジェクト、関数等が判明したので「前回スクリプト」をチョイ直しで作成した「ボタンを使ってみる」スクリプトが以下に。機能は以下の如し。
-
- ボタンA、ボタンBが押されたら「押されていた」と画面に表示(これはコールバック関数による)
- ボタンCが押されたら上記の画面表示を消去(これはメイン・ループ内でのポーリング処理)
import M5 import time from M5 import * title0 = None labelA = None labelB = None def btnA_wasClicked(state): global labelA labelA.setText("Clicked A") def btnB_wasClicked(state): global labelB labelB.setText("Clicked B") def main(): global title0, labelA, labelB M5.begin() Widgets.fillScreen(0x222222) title0 = Widgets.Title("Btn A/B/C Trial 0", 20, 0xFFFFFF, 0x0000FF, Widgets.FONTS.DejaVu24) labelA = Widgets.Label("-", 20, 24, 1.0, 0x222222, 0xFFFFFF, Widgets.FONTS.DejaVu24) labelB = Widgets.Label("-", 20, 48, 1.0, 0x222222, 0xFFFFFF, Widgets.FONTS.DejaVu24) BtnA.setCallback(type=BtnA.CB_TYPE.WAS_CLICKED, cb=btnA_wasClicked) BtnB.setCallback(type=BtnB.CB_TYPE.WAS_CLICKED, cb=btnB_wasClicked) while True: M5.update() if BtnC.wasSingleClicked(): labelA.setText("-") labelB.setText("-") time.sleep_ms(100) if __name__ == "__main__": main()
実機実行結果
上記のスクリプトを実行し、ボタンAを押し、そしてボタンBを押したところが以下に。
勿論ボタンCを押すと Clicked A、Clicked B表示は消えます。