今回はスイッチエデュケーションから発売されているテープLEDモジュールキットを使ってイルミネーションに挑戦します。マイクロビットで手軽にイルミネーションを作れるのは便利です。なお、テープLEDモジュールキットを動作させるためには電池モジュールキットも必要になります。LEDの電源供給が電池モジュールキットから行われるためです。また、電池モジュールキットには単4乾電池3本が必要です。

・micro:bit用テープLEDモジュールキット
https://switch-education.com/products/microbit-led-tape-module-kit/
・micro:bit用電池モジュールキット
https://switch-education.com/products/microbit-battery-module-kit/
【注意】新しいブロックエディタと旧ブロックエディタ
マイクロビットの開発環境は10月26日から新しいブロックエディタになりました。機能変更については以下が参考になります。
https://tech.e3factory.com/microbit_craft/187

新しいブロックエディタは旧ブロックエディタとは異なる部分があります。特にボードで拡張機能を読み込んで利用している場合、うまく動作しないことがあります。そのような場合は旧ブロックエディタを使用してください。旧ブロックエディタを利用する場合はブラウザのアドレスバーに以下のURLを入力します。今回説明している画面も旧ブロックエディタのものを利用しています。
https://makecode.microbit.org/v0/

テープLEDモジュールキットの組み立て

テープLEDモジュールキットには基板とネジが入っています。

電池ボックスモジュールにも基板とネジが入っていますが、今回は組み立てず線をつなぐだけです。

テープLEDモジュールキットは以下のように組み立てます。テープLEDの端子は基板上にある色と一致するように繋いでください。

最後に電池ボックスを繋ぎます。電池ボックスには単4乾電池を3本入れておいてください。また、電池ボックスには電源のON/OFFスイッチがあります。実際にテープLEDを光らせる時以外はOFFにしておいてください。

これで準備完了です。

テープLEDのテスト

動作確認も含めてLEDの各色を点灯させてみます。テープLEDは各端子からデジタル出力で1にすると点灯し、0にすると消えます。各色のLEDと端子は以下のように対応しています。

P0端子が緑LED
P1端子が赤LED
P2端子が青LED

3秒ごとに青、赤、緑の順番で点灯・消灯を繰り返してみます。プログラムは以下のように組み合わせます。

JavaScriptコードだと以下のようになります。

basic.forever(() => {
    pins.digitalWritePin(DigitalPin.P0, 0)
    pins.digitalWritePin(DigitalPin.P1, 0)
    pins.digitalWritePin(DigitalPin.P2, 1)
    basic.pause(2000)
    pins.digitalWritePin(DigitalPin.P0, 0)
    pins.digitalWritePin(DigitalPin.P1, 1)
    pins.digitalWritePin(DigitalPin.P2, 0)
    basic.pause(2000)
    pins.digitalWritePin(DigitalPin.P0, 1)
    pins.digitalWritePin(DigitalPin.P1, 0)
    pins.digitalWritePin(DigitalPin.P2, 0)
    basic.pause(2000)
})

プログラムができたらマイクロビットに転送して動作を確認してみましょう。2秒ごとに青、赤、緑とテープLEDが点灯していきます。

テープLEDは青、赤、緑のLEDが1つにまとまっているため、様々な色を光らせることができます。青、赤、緑は光の三原色なので、人間が見える色を表現することができます。ただ、明るさ(輝度)は指定できないので、実際に発色できる色は以下の7色になります。何も光らせない場合も含めると8色になります。

1:青色
2:赤色
3:紫色
4:緑色
5:青色
6:黄色
7:白色

今度はこれらの色を順番に光らせてみましょう。プログラムは以下のように組み合わせます。

JavaScriptコードだと以下のようになります。

basic.forever(() => {
    pins.digitalWritePin(DigitalPin.P0, 0)
    pins.digitalWritePin(DigitalPin.P1, 0)
    pins.digitalWritePin(DigitalPin.P2, 1)
    basic.pause(2000)
    pins.digitalWritePin(DigitalPin.P0, 0)
    pins.digitalWritePin(DigitalPin.P1, 1)
    pins.digitalWritePin(DigitalPin.P2, 0)
    basic.pause(2000)
    pins.digitalWritePin(DigitalPin.P0, 0)
    pins.digitalWritePin(DigitalPin.P1, 1)
    pins.digitalWritePin(DigitalPin.P2, 1)
    basic.pause(2000)
    pins.digitalWritePin(DigitalPin.P0, 1)
    pins.digitalWritePin(DigitalPin.P1, 0)
    pins.digitalWritePin(DigitalPin.P2, 0)
    basic.pause(2000)
    pins.digitalWritePin(DigitalPin.P0, 1)
    pins.digitalWritePin(DigitalPin.P1, 0)
    pins.digitalWritePin(DigitalPin.P2, 1)
    basic.pause(2000)
    pins.digitalWritePin(DigitalPin.P0, 1)
    pins.digitalWritePin(DigitalPin.P1, 1)
    pins.digitalWritePin(DigitalPin.P2, 0)
    basic.pause(2000)
    pins.digitalWritePin(DigitalPin.P0, 1)
    pins.digitalWritePin(DigitalPin.P1, 1)
    pins.digitalWritePin(DigitalPin.P2, 1)
    basic.pause(2000)
})

プログラムができたらマイクロビットに転送して動作を確認してみましょう。2秒ごとに青、赤、紫、緑、水色、黄、白とテープLEDが点灯していきます。

好きな色で順番に光らせる

それでは好きな色で順番に光らせるようにプログラムを作成します。ここでは、どのように光らせるかを示す色の名前を配列に入れておくことにします。色の名前は以下のように1文字にします。なお、黒色の場合は何も点灯しない状態とします。








発光する順番を入れてある配列の名前は「発光パターン」にします。配列のデータを順番に取り出すためにカウンターとなる変数を用意します。カウンターは1つ光らせるたびに1加算していきます。加算したときに配列の長さを超える場合は0に戻します。これで、指定した発光パターンを永遠に繰り返すことになります。 このプログラムは以下のように組み合わせます。

JavaScriptコードだと以下のようになります。

let カウンター = 0
let データ = ""
let 発光パターン: string[] = []
発光パターン = ["赤", "白", "緑", "黄", "水", "黒", "青", "黄", "紫", "白"]
カウンター = 0
basic.forever(() => {
    データ = 発光パターン[カウンター]
    if (データ == "黒") {
        pins.digitalWritePin(DigitalPin.P0, 0)
        pins.digitalWritePin(DigitalPin.P1, 0)
        pins.digitalWritePin(DigitalPin.P2, 0)
    }
    if (データ == "青") {
        pins.digitalWritePin(DigitalPin.P0, 0)
        pins.digitalWritePin(DigitalPin.P1, 0)
        pins.digitalWritePin(DigitalPin.P2, 1)
    }
    if (データ == "赤") {
        pins.digitalWritePin(DigitalPin.P0, 0)
        pins.digitalWritePin(DigitalPin.P1, 1)
        pins.digitalWritePin(DigitalPin.P2, 0)
    }
    if (データ == "紫") {
        pins.digitalWritePin(DigitalPin.P0, 0)
        pins.digitalWritePin(DigitalPin.P1, 1)
        pins.digitalWritePin(DigitalPin.P2, 1)
    }
    if (データ == "緑") {
        pins.digitalWritePin(DigitalPin.P0, 1)
        pins.digitalWritePin(DigitalPin.P1, 0)
        pins.digitalWritePin(DigitalPin.P2, 0)
    }
    if (データ == "水") {
        pins.digitalWritePin(DigitalPin.P0, 1)
        pins.digitalWritePin(DigitalPin.P1, 0)
        pins.digitalWritePin(DigitalPin.P2, 1)
    }
    if (データ == "黄") {
        pins.digitalWritePin(DigitalPin.P0, 1)
        pins.digitalWritePin(DigitalPin.P1, 1)
        pins.digitalWritePin(DigitalPin.P2, 0)
    }
    if (データ == "白") {
        pins.digitalWritePin(DigitalPin.P0, 1)
        pins.digitalWritePin(DigitalPin.P1, 1)
        pins.digitalWritePin(DigitalPin.P2, 1)
    }
    カウンター += 1
    if (カウンター == 発光パターン.length) {
        カウンター = 0
    }
    basic.pause(2000)
})

プログラムができたらマイクロビットに転送して動作を確認してみましょう。2秒ごとに指定した発光パターンでテープLEDが光ればOKです。

これで今回は完成です。点灯する時間などを調節して好きなイルミネーションパターンを作ってみてください。

プログラムを短くする

ここから先はやや中級者向けの内容になります。特に読まなくても支障はありません。 さて、先ほど作成したプログラムは、かなり長いものでした。ここでは、発光データに一工夫してプログラムが短くなるように工夫します。前のプログラムの発光データは漢字になっていて分かりやすいものでした。ここでは漢字ではなく数値と色を以下のように対応させます。

0 黒色(発光しない)
1 青色
2 赤色
3 紫色
4 緑色
5 水色
6 黄色
7 白色
ビット0:1
ビット1:2
ビット2:4

ビット0が1でビット2が1の場合は「1+4」で「5」 5は水色になります。 ビット1が1でビット2が1の場合は「2+4」で「6」 6は黄色になります。 すべてのビットが1なら「1+2+4」で「7」 つまり白色になります。 ビットが3つあれば全ての色を指定できることになります。そして、このビットとP0〜P2端子が対応しているため、色のビットに応じた値を出力すれば指定した色が発光することになります。

特定のビットが0か1かを調べるには論理積を使います。JavaScriptで論理積をとる記号は&です。あいにく、マイクロビットのブロックには論理積のブロックがありません。そこで、JavaScriptエディタで直接入力します。 また、単に論理積をとってP0〜P2端子に出力するだけでは動作しません。値を0か1にする必要があるからです。4なら1に、2なら1に調整しなけばいけません。このような場合に便利なのがビット演算です。ビットをずらす>>記号を使うと簡単に調整することができます。

実際のプログラムは以下のようになります。なお、発光データの数値をマイクロビットのLEDに表示するようにしているので、どの数値がどのように発光するかがわかるようになっています。

let 発光パターン: number[] = []
let カウンター = 0
let データ = 0
発光パターン = [1, 2, 3, 4, 5, 6, 7, 0]
カウンター = 0
データ = 0
basic.forever(() => {
    カウンター += 1
    if (カウンター == 発光パターン.length) {
        カウンター = 0
    }
    データ = 発光パターン[カウンター]
    basic.showNumber(データ)
    pins.digitalWritePin(DigitalPin.P0,  (データ & 4) >> 2)
    pins.digitalWritePin(DigitalPin.P1,  (データ & 2) >> 1)
    pins.digitalWritePin(DigitalPin.P2,  データ & 1)
    basic.pause(2000)
})

ブロックエディタで表示すると以下のようになります。

かなり短くなったのがわかります。プログラムは工夫次第で長くなったり短くなったりします。また、複雑なプログラムもアイデアや考え方を変えることで、シンプルになったり、短いプログラムになることもあります。プログラムは正解は1つではないので、いろいろ考えて作ってみると勉強になるでしょう。

著者 古籏一浩
プログラミングをベースにして面白そうなものはとりあえずやってみるというスタンス。複雑なものよりシンプルで楽しめるものが好み。最近は30年前に移植したゲーム(mz-700版 SPACE HARRIER)の話などを書いたりしています。
著者サイト:http://www.openspc2.org/