複数LEDをパッケージ化した部品を使う:3D Xmas Tree for Raspberry Pi
ここでは、The Pi Hut社の3D Xmas Tree for Raspberry Piの使い方を説明します。これは小さなクリスマス・ツリーで、25個のLEDをひとつにまとめた部品です。The Pi Hut社はイギリスの会社で、イギリスから国際便で発送すると5〜10ドルの送料だと思います。アメリカ国内では PiShop.usで売られています。「Pre-soldered Kit」と「Soldering Kit」というバージョンがありますが、前者の方が手軽に使えます(おすすめです)。後者を買うと、自分で半田づけをする作業があります(前者にはありません)。
この部品は、「複数LEDをパッケージ化した部品を使う:Christmas Tree Programmable Kit」で紹介したもののアップブレード版です。LEDの数が倍以上になっていて、それぞれのLEDのサイズが小さくなっています。
組み立てと接続
購入したばかりの段階では、この部品は以下の写真のような状態になっています。
ここから、クリスマスツリーの3つの部分を切り出します(以下の写真参照)。ニッパーなどを使ってください。
そして、7本のピンを7つのピン穴に差し込んで、以下のようにツリーを組み立ててください。
ツリーの下の部分には合計40個の穴があいています。これをラズパイのGPIOのピン40本に差し込みます。差し込む向きが重要です。以下の写真の赤く囲った部分に注意しながら、差し込んでください。
ツリーをラズパイに接続すると、ツリー頂上部分のLEDが(自動的に)黄色く点灯するはずです。
プログラミング
このクリスマスツリーには合計25個のLEDがついています:
- ツリーの頂上部分に1個(黄色)
- 頂上以外の部分に24個(赤色)
この25個のLEDそれぞれが特定のGPIO番号に割り当てられます。そして、そのGPIOに電流を流すと対応するLEDが点灯します。各LEDとGPIO番号の対応は以下のとおりです:
- ツリー頂上部分LED:GPIO 2番
- 頂上以外の部分のLED:GPIO 4番から27番
上記のGPIOピンに電流を流せば点灯します。電流を止めれば消えます。電流の流し方、止め方は、ワークショップでやった方法と全く同じです。
まずはstar-on.pyを実行してください。このプログラムは、ツリーの頂上部分にあるLED(GPIO番号は2)を3秒点灯して、その後消します。
star = LED(2)
star.on()
time.sleep(3)
star.off()
次のプログラムがall-on.pyです。これは、25個すべてのLEDを点滅させます。以下のようにして、LED25個分のGPIO番号をリストにして、そのリストを変数allLightsに入れています。
star = 2
lights = [4, 15, 13, 21, 25, 8, 5, 10, 16, 17,
27, 26, 24, 9, 12, 6, 20, 19, 14, 18,
11, 7, 23, 22]
allLights = [star] + lights
[star] + lightsの部分は、[2] + [4, 15, …, 22]となっています。このようにリストの足し算をすると、それぞれのリストの中身がひとつのリストにまとまります。
次に、変数allLightsを使って、以下のようにGPIOのセットアップをし、その後電気を流します、これによりすべてのLEDが点灯します。
GPIO.setup(allLights, GPIO.OUT)
GPIO.output(allLights, GPIO.HIGH)
次にall-on-off.pyを動かしてください。このプログラムの全体構造は以下のようになっています。
while True:
try:
ここに繰り返す作業を書く
except KeyboardInterrupt:
break
GPIO.output(allLights, GPIO.LOW)
whileから始まる部分は「whileループ」と呼ばれ、while Trueから始まる場合には特に「無限ループ(infinite loop)」と呼ばれます。無限ループは、インデントされている部分を無限に(ずっと)繰り返し実行します。上の例では、tryのブロック(try以下インデントされている部分)を繰り返します。
プログラムを止めたくなったら、Ctrl-Cして下さい。Ctrl-Cすると、プログラムは繰り返し作業をやめてexcept …のブロック(except …以下インデントされている部分)を実行します。上の例では、このブロックにbreakという一文が書かれています。breakというのは、「現在実行中のループを抜けて、ループ以降の作業をしろ」という意味です。上の例で「ループ以降の作業」とは、GPIO.output()を呼ぶことです。したがって、プログラム実行中にCtrl-Cすると、繰り返し作業が止まり、すべてのLEDが消えて、プログラムが終了します。
さて、このプログラムの繰り返し作業(tryブロックの中)には以下の4行が含まれています。
GPIO.output(lights, GPIO.LOW)
time.sleep(interval)
GPIO.output(lights, GPIO.HIGH)
time.sleep(interval)
先頭行で、「lights」というリストに入っているGPIO番号に電気を流すのをやめます。これは、ツリーの頂上部分以外のLEDに対応したGPIO番号です。なので、ツリーの頂上部分以外のLEDが消えます。その後time.sleep()を使って(2行目)しばらく消えたままになり、再度点灯します(3行目)。
このように、このプログラムは最初にすべてのLEDを点灯させ、そのあと頂上部分以外のLEDを点滅させます(頂上部分のLEDはずっと点灯したまま)。
次のサンプル・プログラムがon-sequence.pyです。これは、25個のLEDをひとつづつ順番に点灯していって、最後にすべてのLEDを点灯させます。「ひとつづつ順番に点灯」をやっているのが以下の部分です。
for light in allLights:
GPIO.output(light, GPIO.HIGH)
time.sleep(interval)
forから始まるこの部分は「forループ」とよばれ、インデントされている部分を繰り返し実行します。ここではGPIO.output()とtime.sleep()を繰り返し呼びます。
ループの先頭行は「リストallLightsの各要素を変数lightで表す」と理解します。リストallLightsには2, 4, 15, 13, 21, … 22という数字が並んでいます。したがってループの実行過程は次のようになります。
- ループを最初に実行するときには、allLightsの最初の要素「2」を変数lightに格納し、ループ内のプログラム2行を実行する。つまり以下のプログラムが実行される。
GPIO.output(2, GPIO.HIGH) time.sleep(interval)
- ループを2回目に実行するときには、allLightsの2個目の要素「4」を変数lightに格納し、ループ内のプログラム2行を実行する。つまり以下のプログラムが実行される。
GPIO.output(4, GPIO.HIGH) time.sleep(interval)
同様に、ループの3回目、4回目の実行時には、リストallLightsの3番目、4番目の要素(15と13)が使われます。リストallLightsの要素は25個なので、ループは25回実行されます。つまり、25個のLEDがひとつづつ順番に点灯します。
on-sequence.pyに少し変更を加えたものがon-off-sequence.pyです。説明は省略しますが、プログラムを読んで、動かしてみて、何が起きるか(そしてなぜそれが起きるのか)を理解してください。
次がon-off-random.pyです。これは、最初にすべてのLEDを点灯します。その後ランダムに選んだLEDを消灯し、さらにランダムに選んだLEDを点灯し・・・をくり返します。以下のように、リストallLightsに入っているGPIO番号のうち1つをランダムに選んでいます。
light = random.choice(allLights)
リストの要素からランダムにひとつ選ぶ方法については「複数のLEDを点滅させる(複数のGPIOピンを使う)」参照してください。
on-off-random2.pyは、最初にすべてのLEDを点灯し、次にランダムに12個のLEDを選んで消灯し、またすべてのLEDを点灯・・・をくり返します。12個のLEDをランダムに選んでいるのが以下の部分です。
offLightsCount = 12
offLights = []
for i in range(offLightsCount):
offLight = random.choice(lights)
offLights.append(offLight)
GPIO.output(offLights, GPIO.LOW)
この「forループ」は、インデントされている部分(2行)を12回くり返します。このように、「くり返しの回数」を指定する場合、forループは以下のように書きます(この例でくり返し回数は5回)。
for i in range(5):
くり返す作業をここに書く
最後のプログラムがflickering.pyです。LEDをランダムに選んで、選ばれたLEDの光量をランダムに変える、をくり返します。これによりチラチラと揺らめくような光り方をします。LEDの光量を変える方法については、「LEDの光の強弱を調節する(PWMを使う)」を参照してください。