複数LEDをパッケージ化した部品を使う:PiGlow
LEDを点滅させる最も基本的な方法は、LEDとジャンパーワイヤをブレッドボードに差し込んで、ラズパイとつなげて・・・という風に自分で回路を作るやり方です(ワークショップでやった作業そのものです)。実はこれに加えて、もう少し手軽な方法もあります。複数のLEDをひとつにまとめてラズパイに簡単に接続できる部品がたくさん売られているので、それを使うやり方です。回路を作る手間、抵抗を使う手間が省けることが多いです。
ここでは、Pimoroni社のPiGlow(PiShop.us、PiShop.ca)を使ってみます。これは18個のLEDが星雲(台風の目?)のように並んでいる部品です。LEDの色は中心部分から白、青、緑、黄、オレンジ、赤というふうに並んでいます。この部品では各LEDの色は固定です。
準備
この部品には2x13の穴が開いているので、それをラズパイのGPIOピンに差し込みます。差し込む場所と方向が重要です。以下の写真のように差し込んでください。
次にラズパイのTerminalで以下のコマンドを実行して下さい。
curl -sS https://get.pimoroni.com/piglow | bash
しばらくすると、以下のように聞かれます。
Do you wish to continue? [y/N]
キーボードの「Y」を押してEnterキーを押してください。またしばらくすると以下のように聞かれます。再度キーボードの「Y」を押してEnterキーを押してください。
Do you wish to perform a full install? [y/N]
プログラムからLEDを点滅させる
PiGlowのLEDを点滅させるプログラを書くときには、プログラムの先頭行を以下のようにしてください。
import piglow
最初のプログラムがall-on.pyです。これは、18個すべてのLEDを点灯させます。
piglow.all(126)
piglow.show()
time.sleep(3)
piglow.off()
関数piglow.all()を使うとすべてのLEDを点灯できます。この時に光の明るさ(brightness)を数字で指定します。この数字は0から255の間の整数で、255が一番明るく、0は消灯と同じ意味です。最大の明るさ(255)にすると目がチカチカするほどの強さで点灯するので、半分程度の明るさ(126前後)がよいと思います。
点灯させるLEDとその明るさを指定したら、piglow.show()という関数を呼んで実際にLEDを点灯させます。blinkt.show()を使わないとLEDは点灯しないので注意が必要です。
点灯中のLEDをすべて消すにはpiglow.off()という関数を使います。上記の例では、piglow.show()を呼んでから3秒間プログラムの実行が止まり、その後にpiglow.off()を呼んでいます。結果として、LEDは3秒間点灯します。
プログラムの最後でpiglow.off()を呼ぶようにしてください。そうでないと、プログラムの実行が終了してもLEDが点灯したままになります。
次のプログラムがcolor-by-color.pyです。これは、以下のように白、青、緑、黄、オレンジ、赤のLEDを順番に点灯していきます。
onBrightness = 126
piglow.white(onBrightness)
piglow.blue(onBrightness)
piglow.green(onBrightness)
piglow.yellow(onBrightness)
piglow.orange(onBrightness)
piglow.red(onBrightness)
すべてのLEDが点灯したら、逆順に(赤、オレンジ、黄、緑、青、白の順で)LEDを消します。
offBrightness = 0
piglow.red(offBrightness)
piglow.orange(offBrightness)
piglow.yellow(offBrightness)
piglow.green(offBrightness)
piglow.blue(offBrightness)
piglow.white(offBrightness)
色順にON-OFFするのを1回だけやるのではなく、何度もくり返すのがcolor-by-color-loop.pyです。プログラムの全体像は以下のようになっています。
while True:
try:
色順に点灯
色順に消灯
except KeyboardInterrupt:
break
piglow.off()
whileから始まる部分は「whileループ」と呼ばれ、while Trueから始まる場合には特に「無限ループ(infinite loop)」と呼ばれます。無限ループは、インデントされている部分を無限に(ずっと)繰り返し実行します。上の例では、tryのブロック(try以下インデントされている部分)を繰り返します。
プログラムを止めたくなったら、Ctrl-Cして下さい。Ctrl-Cすると、プログラムは繰り返し作業をやめてexcept …のブロック(except …以下インデントされている部分)を実行します。上の例では、このブロックにbreakという一文が書かれています。breakというのは、「現在実行中のループを抜けて、ループ以降の作業をしろ」という意味です。上の例で「ループ以降の作業」とは、blinkt.clear()とblinkt.show()を呼ぶことです。したがって、プログラム実行中にCtrl-Cすると、繰り返し作業が止まり、すべてのLEDが消えて、プログラムが終了します。
色別にLEDをON、OFFするには、piglow.colour()という関数を使うこともできます。以下のように、色と明るさを指定します。
piglow.colour("red", 126)
色は文字で”red”、”orange”、”yellow”、”green”、”blue”、”white”のいずれかを指定可能です。この関数を使って点灯、消灯するLEDをランダムに決めるのがcolor-by-color-random.pyです。このプログラムでは、色の選択肢を以下のようにリストにして、それを変数colorsに入れています。
colors = ["red", "orange", "yellow", "green", "blue", "white"]
そして、このcolorsに入っている色の中からひとつをランダムに選んで点灯、消灯させます。リストの中から要素をひとつランダムに選ぶには、以下のようにします。
color = random.choice(colors)
random.choice(リスト)というプログラムは、与えられたリストから要素をランダムに選びます。ここでは、colorsの中から要素(色)を選んで、それを変数colorに入れています。
次のプログラムがleg-by-leg.pyです。これは、中心部分から外へ向けて伸びている「足」ごとに点灯、消灯します。足は3本あり、それぞれID番号(0、1、2)を持っています。このIDを使ってpiglow.leg()という関数を呼びます。
onBrightness = 126
interval = 1
piglow.leg(0, onBrightness)
piglow.show()
time.sleep(interval)
piglow.leg(1, onBrightness)
piglow.show()
time.sleep(interval)
piglow.leg(2, onBrightness)
piglow.show()
time.sleep(interval)
どの足を点灯、消灯するかをランダムに決めるプログラムがleg-by-leg-random.pyです。
legId = random.randint(0, 2)
brightness = random.randint(0, onBrightness)
piglow.leg(legId, brightness)
random.randint()という関数は、ランダムに選ばれた整数値を返します。上の例では、0以上2以下の整数をランダムに選んで変数legIdに入れています。また、0以上126以下の整数をランダムを選んで変数brightnessに入れています。
最後のプログラムがled-by-led.pyです。PiGlowに付いている18個のLEDはそれぞれID番号を持っています(0、1、2、・・・17)を持っています。以下、足別、色別にID番号をまとめました。
足のID番号 | 赤 | オレンジ | 黄色 | 緑 | 青 | 白 |
---|---|---|---|---|---|---|
0 | 0 | 1 | 2 | 3 | 4 | 5 |
1 | 6 | 7 | 8 | 9 | 10 | 11 |
2 | 12 | 13 | 14 | 15 | 16 | 17 |
この表にもとづいて、足ごとにLEDのID番号をまとめたのが以下の部分です。led0は、0番目の足に属しているLED(のID番号)をリストにしています。
leg0 = [0, 1, 2, 3, 4, 5]
leg1 = [6, 7, 8, 9, 10, 11]
leg2 = [12, 13, 14, 15, 16, 17]
allLeds = leg0 + leg1 + leg2
ledId = random.choice(allLeds)
piglow.set(ledId, brightness)
leg0 + leg1 + leg2
の部分はリストの足し算で、これはリストの要素をまとめて1つのリスト(ledId)に入れることを意味します。
関数piglow.set()には、LEDのID番号をひとつ、あるいは複数のID番号をリストにしたものを渡すことができます。
Pimoroni社が公開しているサンプル・プログラムはここにあります。興味があれば動かして、読んでみて下さい。