MicroPython的午睡(129)M5Stack UIFlow2、「Btn」を押してみる

Joseph Halfmoon

前回は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も対応)。。。

M5_BOARD

さて、これを実行している現物の情報は以下の関数で読み取れるみたいです。M5_getBoard

1ということは、一番上のM5Stackね。実際は「Grayバージョン」だけれども。

マルチディスプレイ?

前回、LCD周りを探ったときに「マルチディスプレイのため?」と思われるようなクラスや関数があるのを見ました。実機上で以下の関数を実行してみると。M5_getDisplayCount

1ね。素のままで表示画面は1個しかないし。別画面を接続して複数画面化もできるのかしら?またそのうち。

ハードウエアボタン

M5Stack Grayの表示の下部には、3個のハードウエア・ボタンが並んでおります。左からA、B、Cとな。ボタンAのHelpを見てみると以下の如し。M5_Button

どうも、上記M5モジュールに含まれているBtnAというオブジェクトは、以下のhardware.buttonモジュール内で定義されている Button というクラスをボタンAのハードウエアのためにインスタンス化したものみたいです。hardware_button

実際にコールバック関数のタイプなどは上記モジュール内のCB_TYPEクラス内で定義されているみたい。こんな感じ。hardware_button_CB_TYPE

また、上記hardware.buttonクラス内にはハードウエアピンそのものを制御するためのClassも含まれており。多分フツーのGPIO制御から使えるものと結局は同じなのだと想像しますが(後で確かめます。)hardware_pin

 

 

今回実験のスクリプト

上記のようにハードウエアボタンを制御するためのオブジェクト、関数等が判明したので「前回スクリプト」をチョイ直しで作成した「ボタンを使ってみる」スクリプトが以下に。機能は以下の如し。

    • ボタン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を押したところが以下に。BtnTest

勿論ボタンCを押すと Clicked A、Clicked B表示は消えます。

MicroPython的午睡(128)M5Stack UIFlow2、Displayを探る? へ戻る

MicroPython的午睡(130)M5Stack UIFlow2、microSDマウント へ進む