親子IoTワークショップ

マイコンとクラウドを使ってIoTとプログラミングを学ぼう

[ トップ | 開催予定・概要 | 2024-12開催 | お知らせ | Facebook ]

複数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がついています:

この25個のLEDそれぞれが特定のGPIO番号に割り当てられます。そして、そのGPIOに電流を流すと対応するLEDが点灯します。各LEDとGPIO番号の対応は以下のとおりです:

上記の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という数字が並んでいます。したがってループの実行過程は次のようになります。

同様に、ループの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を使う)」を参照してください。

自習プロジェクトの目次に戻る