AIカメラと銘打って販売されているM5StickV(RISC-Vコア+AIアクセラレータKPU搭載のKendryte K210搭載機)ですが、カメラの横にはかなり強力なLEDが搭載されています。近くのものならこれで照明しながら撮影できそうです。このLED、色が変えられます。照明の光の波長を変えて撮影すると何かいいことあるかも。LED点灯色など制御しているのがGPIOの端子群です。ついでにキー入力もやってしまいましょう。
※「モダンOSのお砂場」投稿順Indexはこちら
今回、使用する端子とその接続先をまず列挙しておきます。
- 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のスクリプトが出来ました。いやはやお手軽。