モダンOSのお砂場(11) MicroPython、GPIO入出力

JosephHalfmoon
JosephHalfmoon

AIカメラと銘打って販売されているM5StickV(RISC-Vコア+AIアクセラレータKPU搭載のKendryte K210搭載機)ですが、カメラの横にはかなり強力なLEDが搭載されています。近くのものならこれで照明しながら撮影できそうです。このLED、色が変えられます。照明の光の波長を変えて撮影すると何かいいことあるかも。LED点灯色など制御しているのがGPIOの端子群です。ついでにキー入力もやってしまいましょう。

今回、使用する端子とその接続先をまず列挙しておきます。

  • GPIO1 Aボタン(LCD画面の横)
  • GPIO2 Bボタン(本体側面、SDカードの無い側)
  • GPIO3 白色LED
  • GPIO4 赤色LED
  • GPIO5 緑色LED
  • GPIO6 青色LED

キー入力の場合、該当の端子をプルアップ抵抗付きの入力端子に設定します。キーが押されてなければプルアップのお陰でハイ(1)が読め、キーを押すとロー(0)が読めるという塩梅です。LEDに対しては、該当の端子を出力端子に設定し、ロー(0)出力で電流を引けて点灯、ハイ(1)出力で消灯です。

大昔、「カクテル光線で光の波長を変えながら」写真とりたいという件に関わったことがあったのを思い出します。単純なON/OFF制御なので、あまり微妙な色合いは出せないものの、R,G,Bそろっているので色合いを変えた撮影が可能でしょう。実際、点灯しているところの写真を並べましょう。人の目で見るともっと鮮やかな色に見えるのだけれど、私の写真だと色合いがイマイチ。まずは赤。

お次は緑

そして青。

この3色の組み合わせに加えて、別系統で白色があるので、全部で16通り(非点灯の1通り含む)が可能です。

そこで、キーAを押したらば、16通りをひとつづつ試していくようなプログラムを作ってみました。キーBを押したら終了です。メインルーチンはこんな感じにしてみました。実際のGPIOの操作はmylibというクラスの中に押し込めてしまったので、簡単。キーボードとLEDを初期化した後は、キーBとキーAを監視して処理を行い、100ms待ってこれを繰り返すだけのものです。LEDの点灯は、ledという変数に入れた0~15までの値で制御しています。(15で消灯)

def main():
    ml = mylib()
    ml.initKey()
    ml.initLed()
    led = 15
    while(True):
        ml.updateKey()
        if ml.wasButtonBpressed():
            break
        if ml.wasButtonApressed():
            led = (led - 1) if led > 0 else 15
            ml.setLed(led)
        time.sleep_ms(100)

クラスの中に押し込んだLedの点灯制御関数もごく簡単なものです。

    def setLed(self, b4):
        self.LedW.value( (b4 & 0x8) >> 3 )
        self.LedR.value( (b4 & 0x4) >> 2 )
        self.LedG.value( (b4 & 0x2) >> 1 )
        self.LedB.value( (b4 & 0x1) )

LED出力ピンの初期化は、4ピンとも同じなので、赤の1ピンのみ記します。

fm.register(board_info.LED_R, fm.fpioa.GPIO4)
self.LedR = GPIO(GPIO.GPIO4, GPIO.OUT)
self.LedR.value(1)

キーボードの初期化もGPIOなので、LEDと似たり寄ったりですが、こちらは初期値の設定不要な代わり、プルアップを指定しておかないとなりません。

fm.register(board_info.BUTTON_A, fm.fpioa.GPIO1)
self.buttonA = GPIO(GPIO.GPIO1, GPIO.IN, GPIO.PULL_UP)

チャタリングなどで続けざまにキー入力されてしまうと嫌なので、updateKey()という関数内でキーのmake,releaseを観測(その間に無限ループ内の100msのウエイトが1回以上挟まる)してから、その結果を読み取っています。

    def updateKey(self):
        if (self.buttonA.value() == 0) and (not self.buttonApressed):
            self.buttonApressed = True
        if (self.buttonA.value() == 1) and self.buttonApressed:
            self.buttonApressed = False
            self.buttonAFlag = True
        if (self.buttonB.value() == 0) and (not self.buttonBpressed):
            self.buttonBpressed = True
        if (self.buttonB.value() == 1) and self.buttonBpressed:
            self.buttonBpressed = False
            self.buttonBFlag = True

    def wasButtonApressed(self):
        if self.buttonAFlag:
            self.buttonAFlag = False
            return True
        return False

こんな程度で、カチカチ、キーを押したらその度にLEDの色が変わるMicropythonのスクリプトが出来ました。いやはやお手軽。

モダンOSのお砂場(10) MicroPython、モジュールとhelp へ戻る

モダンOSのお砂場(12) M5StickC, UIFlowとMicroPython へ進む