複数LEDをパッケージ化した部品を使う:Blinkt!
LEDを点滅させる最も基本的な方法は、LEDとジャンパーワイヤをブレッドボードに差し込んで、ラズパイとつなげて・・・という風に自分で回路を作るやり方です(ワークショップでやった作業そのものです)。実はこれに加えて、もう少し手軽な方法もあります。複数のLEDをひとつにまとめてラズパイに簡単に接続できる部品がたくさん売られているので、それを使うやり方です。回路を作る手間、抵抗を使う手間が省けることが多いです。
ここでは、Pimoroni社のBlinkt!(Adafruit、PiShop.us、PiShop.ca、Pi Hut)を使ってみます。これは8個のRGB LEDが一列に並んだ部品です。
準備
この部品には2x20の穴が開いているので、それをラズパイのGPIOピン(40本)に差し込みます。差し込む方向が重要です。以下の写真のように差し込んでください。
この部品の角が丸まっている側が、ラズパイの端の方を向くようにして下さい。逆向きに差し込むとLEDは点灯しません。
次にラズパイのTerminalで以下のコマンドを実行して下さい。
curl https://get.pimoroni.com/blinkt | bash
プログラムからLEDを点滅させる
LEDを点滅させるプログラムを書くときには、プログラムの先頭行を以下のようにしてください。
import blinkt
最初のプログラムがwhite.pyです。Blinkt!のLEDを点灯させるには、以下のようにblinkt.set_pixel()という関数を使います。
blinkt.set_pixel(0, 255, 255, 255)
blinkt.show()
blinkt.set_pixel()に渡す最初の値は、どのLEDを点灯させるかを示します。Blinkt!の8つのLEDにはそれぞれID番号が付けられています。一番左のLEDから順番に0, 1, 2, …, 7です。上の例では0を使っているので、一番左のLEDを点灯させようとしています。
blinkt.set_pixel()に渡す残りの値は、LEDを何色で点灯させるかを示します。色の指定には、RGB値を使います。Rの値、Gの値、Bの値の順です。上の例では、R、G、Bの値はいずれも255になっています。つまり白色を指定しています。
blinkt.set_pixel()を使ってLEDと色の指定をしたら、blinkt.show()という関数を呼んで実際にLEDを点灯させます。blinkt.show()を使わないとLEDは点灯しないので注意が必要です。
色の指定に使うRGB値について少し補足します。色には(厳密にいうと「光」には)3つの根本的な色があります。赤(Red)、緑(Green)、青(Blue)です。光の三原色とよばれます。この3つを混ぜあわせると(人間が認識できるほぼ)すべての色を表現できます。このページを使って、三原色を混ぜあわせた結果がどんな色になるかを調べてみてください。
赤(Red)、緑(Green)、青(Blue)のそれぞれには、0から255までの256レベルを指定できます。この値は所定の色の「含有量」を表しています。例えば、R値は「赤っぽさ」がどの程度かを表しており、最大値の255は「真っ赤」を意味します。R値が小さくなると、「赤っぽさ」が減ってだんだん暗い色になります。R値が0になると黒色になります。
さてプログラムの説明に戻ります。点灯しているLEDを消す(消灯する)には、以下のように関数blinkt.clear()を呼び、その後blinkt.show()を呼びます。
blinkt.clear()
blinkt.show()
blinkt.clear()は、8つすべてのLEDを消灯します。blinkt.show()を呼ばないとLEDは点灯しないので注意が必要です。
white.pyには、LEDを点灯する部分と消灯する部分の間に以下の1行があります。つまり、このプログラムはLEDを2秒間点灯します。
time.sleep(2)
また、このプログラムは以下のように関数blinkt.set_all()も呼んでいます。
blinkt.set_all(255, 255, 255)
blinkt.show()
blinkt.set_all()は、すべてのLEDを同じ色で点灯させます。点灯させる色はRGB値で指定します。上の例では白を指定しています。
プログラムの最後で、以下のようにすべてのLEDを消灯しています。
blinkt.clear()
blinkt.show()
なお「消灯」というのは、色を黒にするというのと同じ意味です。黒色というのは、RGB値で表現するとR=0, G=0, B=0となります。したがって、すべてのLEDを消灯するには以下のようにすることもできます。
blinkt.set_all(0, 0, 0)
blinkt.show()
また、一番左のLEDを消灯するには以下のようにすることもできます。
blinkt.set_pixel(0, 0, 0, 0)
blinkt.show()
2つめのサンプル・プログラムがrainbow.pyです。このプログラムは、8つのLEDそれぞれを違う色で点灯させます。以下のように、個々のLEDに対して関数blinkt.set_pixel()を呼んで異なる色を指定します。
blinkt.set_pixel(0, 255, 0, 0)
blinkt.set_pixel(1, 255, 191, 41)
blinkt.set_pixel(2, 128, 255, 0)
...
blinkt.set_pixel()を合計8回呼んだ後にblinkt.show()を呼びます。こうすることで、8つのLEDが異なる色で同時に点灯します。
複数LEDを点滅させる
ここまででは、LEDを1つだけ、あるいは全部のLEDを点滅させました。ここからは、それ以外の点滅方法を説明します。
white4n4.pyは、8つのLEDのうち左側4つを点灯させ、その後右側4つを点灯させます。まずは、以下のようにして一番左のLED(IDが0番)から4つのLEDに白色を設定します。
for led in range(4):
blinkt.set_pixel(led, 255, 255, 255)
forから始まるこの部分は「forループ」とよばれ、インデントされている部分を繰り返し実行します。ここではblinkt.set_pixel()を繰り返し呼びます。
range(4)というのは「0以上4未満の整数の並び」を意味します。つまり、0、1、2、3のことです。この数が、先頭から順番にひとつづつ変数ledに入りながら繰り返し作業をします。つまり、最初は0が変数ledに入り、その上でblinkt.set_pixel()を呼びます。いま変数ledには0が入っているので、
blinkt.set_pixel(0, 255, 255, 255)
が実行されます。このループの2回目には、変数ledに1が入り、その上でblinkt.set_pixel()を呼びます。つまり、
blinkt.set_pixel(1, 255, 255, 255)
が実行されます。同様に、変数ledに2、3、4が順番に入ってblinkt.set_pixel()を呼びます。変数ledに4を入れてblinkt.set_pixel()を呼んだら繰り返しをやめます。
つまり、上記のforループは、以下の4行を実行するのと同じことです。どちらの方法でも結果は同じですが、ループを使う方が少しプログラムが短くなります。
blinkt.set_pixel(0, 255, 255, 255)
blinkt.set_pixel(1, 255, 255, 255)
blinkt.set_pixel(2, 255, 255, 255)
blinkt.set_pixel(3, 255, 255, 255)
white4n4.pyには、もうひとつforループがあります:
for led in range(4, 8):
blinkt.set_pixel(led, 255, 255, 255)
range(4)というのは、「4以上8未満の整数の並び」を意味します。つまり、4、5、6、7のことです。この数が、先頭から順番にひとつづつ変数ledに入りながら繰り返し作業をします。つまり、このforループは、以下の4行を実行するのと同じことです。
blinkt.set_pixel(4, 255, 255, 255)
blinkt.set_pixel(5, 255, 255, 255)
blinkt.set_pixel(6, 255, 255, 255)
blinkt.set_pixel(7, 255, 255, 255)
次のサンプル・プログラムがwhite2.pyです。ここまで説明してきたことが分かれば読んで理解できるはずなので説明は省略します。ひとつだけ新しいのは以下の部分です。
for led in reversed(range(8)):
range(8)は「0以上8未満の整数の並び」を意味します。つまり、0、1、2、3、4、5、6、7のことです。この数字の並びを関数reversed()に渡すと、並び方が逆になって返されます。つまり、7、6、…、1、0になります。
ランダムに点滅させる
次のサンプル・プログラムはrandom-white.pyです。このプログラムの全体構造は以下のようになっています。
while True:
try:
ここに繰り返す作業を書く
except KeyboardInterrupt:
break
blinkt.clear()
blinkt.show()
whileから始まる部分は「whileループ」と呼ばれ、while Trueから始まる場合には特に「無限ループ(infinite loop)」と呼ばれます。無限ループは、インデントされている部分を無限に(ずっと)繰り返し実行します。上の例では、tryのブロック(try以下インデントされている部分)を繰り返します。
プログラムを止めたくなったら、Ctrl-Cして下さい。Ctrl-Cすると、プログラムは繰り返し作業をやめてexcept …のブロック(except …以下インデントされている部分)を実行します。上の例では、このブロックにbreakという一文が書かれています。breakというのは、「現在実行中のループを抜けて、ループ以降の作業をしろ」という意味です。上の例で「ループ以降の作業」とは、blinkt.clear()とblinkt.show()を呼ぶことです。したがって、プログラム実行中にCtrl-Cすると、繰り返し作業が止まり、すべてのLEDが消えて、プログラムが終了します。
さて、このプログラムの繰り返し作業(tryブロックの中)には以下の行が含まれています。
blinkt.set_pixel(random.randint(0, 7),
255, 255, 255)
ここで新しいのは、
random.randint(0, 7)
という部分です。random.randint()という関数は、ランダムに選ばれた整数値を返します。上の例では、0以上7以下の整数をランダムに選んで返します。ですから、ここではLEDのIDが0以上7以下のどれかをランダムに選んで、そのLEDに白色を設定しています。
次のサンプル・プログラムがrandom-colors.pyです。ひとつ前のプログラムとほとんど同じですが、blinkt.set_pixel()の呼び方が少し違います:
blinkt.set_pixel(random.randint(0, 7),
random.randint(0, 255),
random.randint(0, 255),
random.randint(0, 255))
ここでは、点灯するLEDをランダムに選ぶだけでなく、色(RGBの値)もランダムに選んでいます。
その他の便利な関数
blinktを使うための関数をいくつか追加で紹介します。まずはLEDの(光の)明るさを調節する関数について。
これまでblinkt.set_pixel()を呼ぶときには、以下のように4つ値を渡してきました。最初がLEDのIDで、残りがRGB値です。
blinkt.set_pixel(0, 255, 255, 255)
実は、blinkt.set_pixel()には5つの値を渡すことも可能で、その場合は最後の値で光の明るさを指定します。0と1の間の数で表し(小数、分数可)、大きい数ほど明るい光を意味します。
blinkt.et_pixel(0, 255, 255, 255, 0.5)
この例では、光の明るさは0.5と指定しています。なお、この関数に4つの値しか渡さない場合は(光の明るさを指定しない場合は)、デフォルトの明るさが使われます(約0.2)。
デフォルトの明るさ(約0.2)を使えばLEDは十分明るく光ると思います。あまりに高い明るさを指定してLEDを見つめると目がチカチカと痛くなってきます。おそらく目によくないと思いますので、明るすぎない程度の値を使って下さい。明るさに強弱をつけたい場合には、0から0.5の間くらいで値を上下させるのがよいかと思います。
また、blinkt.set_pixel()と同様に、blinkt.set_all()を呼ぶときにも明るさの指定が可能です:
blinkt.set_all(255, 255, 255, 0.5)
ここでは、すべてのLEDを明るさ0.5で白色に設定しています。
次に紹介する関数がblinkt.get_pixel()です。LEDの設定されている色と明るさを、4つの値で返します。LEDが今どのように光っているかをプログラムで調べたいときに便利です。
r, g, b, brightness = blinkt.get_pixel(0)
この例では、IDが0のLEDに設定されている色と明るさが返され、それぞれ変数r、g、b、brightnessに入ります。
Blinkt!をワイヤーでラズパイと接続する
Blinkt!には2x20の穴が開いてい流ので、それをラズパイのGPIOピン(40本)に差し込むのが最も簡単な接続方法です。この接続方法が好ましくない場合には、ジャンパーワイヤーを使ってラズパイと接続することもできます。実際のところ、Blinkt!はGPIOのピンを全部使っているわけではなく、そのうち4本しか使っていません。なので、ジャンパーワイヤーを4本使ってラズパイと接続できます。この接続方法だと、Blinkt!以外の部品もGPIOに接続することができます。例えば、気温、湿度、二酸化炭素などのセンサーをラズパイに接続し、センサーの値に応じてBlinkt!の光らせ方(光らせるLEDの個数と色)を変えることができます。
このページに書いてあるように、Blinkt!が使うGPIOピンは以下の4つです。
- 5V
- GND (Ground)
- GPIO 23
- GPIO 24
この4本のGPIOピンを、対応するBlinkt!の穴とワイヤーで接続して下さい。なお、ラズパイに5Vピンは2つあります。一番端のピンではなく、端から2番目のものを使って下さい。