信号機風にLEDを点灯させてみよう

code

ラズパイ Picoを買ってLチカに挑戦してみたけど、正直この先何をすればいいんだろう…?」そんな初心者のあなた、自分のことだと思いましたか?

一つのLEDを点滅させることに成功したら、次のステップとして複数のLEDを制御してみましょう。例えば、赤・黄・緑の3つのLEDを使ってミニ信号機を再現するのは、どうでしょう?

本記事では、Raspberry Pi Pico(※Pico WやPico 2など新しいモデルでもOK)を使って3つのLEDを順番に点灯させる方法を、MicroPythonの基本コードから順に解説します。
LED1個の点滅コードから比較して何を変更すればよいか、初心者にも分かるよう丁寧に説明するので、一緒にチャレンジしてみましょう!

3つのLEDでミニ信号機を再現しよう

今回は、外付けのLEDを3つ使ってPico上で「緑 → 黄 → 赤」と順番に点灯させます。

まずは、1つのLEDのLチカからステップアップして、3つのLEDを使った**ミニ信号機**を作ってみます。必要なものと回路の準備から始めましょう。

◆ 用意するもの

  • Raspberry Pi Pico 本体 (pice wでもOK)
  • LED 3個(赤・黄・緑など3色がおすすめ)
  • 抵抗 3本(各LEDに1本ずつ。目安は330Ω〜470Ω程度)
  • ブレッドボードジャンパーワイヤー(配線に使用)
  • PCとPicoを接続するMicro USBケーブル

配線図

各LEDの長いリード(足)がプラス側のアノード、短いリードがマイナス側のカソードです。
アノード側にPicoのGPピン(GPIO)につなぎます。今回は13,14,15ピンに接続します。
そして各LEDのカソード側は抵抗を直列で接続してPicoのGNDピン(グランド)へ接続します。
例えば、緑LEDをGPIO13番ピンへ、黄LEDをGPIO14番ピンへ、赤LEDをGPIO15番ピンへつなぐ、といった具合です。3本の抵抗はそれぞれ対応するLEDのアノード側に入れてください(。複数のLEDのカソードはブレッドボード上でまとめて一本のGNDラインに接続し、そのラインをPicoのGNDピンに接続するとスッキリします。

ピコさん
ピコさん
LEDには必ず電流制限用の抵抗をつけてね!抵抗なしで直接つなぐと、LEDが壊れたりPico本体に負荷がかかっちゃうこともあるの。安全のために330Ω~470Ωくらいの抵抗を各LEDにシリーズで入れておこう。

パーツの準備と配線ができたら、いよいよプログラミングに移ります。最初にMicroPythonで3つのLEDを順番に点灯させる基本のコードを書いてみましょう。

基本プログラム (3つのLEDを順番に点灯させる)

それでは、実際に3つのLEDを順に点滅させるプログラムを書いてみます。1つのLEDを点滅させるコードと比較**すると、必要なのは「複数のGPIOピンを使うこと」と「各LEDを順番に制御すること」です。
以下に基本的なコード例を示します。

from machine import Pin
from time import sleep

LED_G_PIN = 13      # 緑LEDをつないだGPIOピン番号
LED_Y_PIN = 14      # 黄LEDをつないだGPIOピン番号
LED_R_PIN = 15      # 赤LEDをつないだGPIOピン番号

SLEEP_SECONDS = 0.5  # 点灯間隔(秒)

# LEDピンを出力モードに設定
led_g = Pin(LED_G_PIN, Pin.OUT)
led_y = Pin(LED_Y_PIN, Pin.OUT)
led_r = Pin(LED_R_PIN, Pin.OUT)

# 順番にLEDを点灯させる無限ループ
while True:
    led_g.value(1)   # 緑LED ON
    led_y.value(0)   # 黄LED OFF
    led_r.value(0)   # 赤LED OFF
    sleep(SLEEP_SECONDS)  # 一定時間待つ

    led_g.value(0)   # 緑LED OFF
    led_y.value(1)   # 黄LED ON
    led_r.value(0)   # 赤LED OFF
    sleep(SLEEP_SECONDS)  # 一定時間待つ

    led_g.value(0)   # 緑LED OFF
    led_y.value(0)   # 黄LED OFF
    led_r.value(1)   # 赤LED ON
    sleep(SLEEP_SECONDS)  # 一定時間待つ

このプログラムでは、まず3つのGPIOピン番号(13, 14, 15)をそれぞれ緑・黄・赤のLEDに割り当てています。Pin(…, Pin.OUT)で各ピンを出力モードに設定し、led_g, led_y, led_rという3つの変数(Pinオブジェクト)を用意しました。while Trueの無限ループ内では、3つのLEDを順にON(1)にして他をOFF(0)にする処理を繰り返しています。

具体的には、まず緑LEDだけをvalue(1)で点灯し、他の黄・赤LEDはvalue(0)で消灯します。sleep(0.5)で0.5秒待ちます。
次に緑を消して黄LEDを点灯、また待つ。
最後に赤LEDを点灯して同様に待つ――これで「緑→黄→赤」と一つずつLEDが点灯するサイクルが完成です。このサイクルはwhile Trueループによって永遠に繰り返されるため、3つのLEDが順番に点滅し続ける仕組みです。

このコードを見ると分かるように、やっていること自体は1つのLEDを点滅させる場合とほとんど同じですよね。違いは、扱うピンが増えた分、LEDごとにvalue(1)/value(0)する箇所が増えているだけです。初心者のうちは、このようにベタに書いて仕組みを理解するのが一番です。3つのLEDが順番に光る様子を見られたら大成功!自分で配線した複数のLEDが思い通りに制御できると感動しますよ。

ピコさん
ピコさん
「あれ、赤LEDが点かない…?」そんなときは配線を再チェック!コードで指定したGPIO番号と、実際にLEDを差し込んだピンの番号がちゃんと対応しているか確認してみてね。Picoのピン配置は一見わかりづらいから、ピン配置図を見ながらつなぐと安心よ👌

ここまでで、3つのLEDを順番に点滅させる基本プログラムが完成しました。動作を確認できたら、いろいろ**応用**してみましょう。例えば、SLEEP_SECONDSの値を変えてLEDが切り替わる速度を調整したり、点灯時間を色ごとに変えて本物の信号機っぽくしても面白いですよ(緑を長め、黄は短め、赤は中くらいの長さにする等)。では次に、このコードを少し改良して**スマート**にしてみます。

コードを整理してシンプルにしよう Let’s リファクタリング!

先ほど書いた基本コードは、動作はしますが同じような処理を何度も繰り返し記述していました。3つ程度ならまだしも、LEDの数が増えたりロジックが複雑になると、コードが長くなってミスのもとになります。そこで、プログラムを**リファクタリングして、スッキリさせましょう。

from machine import Pin
from time import sleep

# 複数LEDのGPIOピン番号をリストで定義
LED_PINS = [13, 14, 15]   # [緑, 黄, 赤]それぞれ接続したピン番号
SLEEP_SECONDS = 0.5       # 点灯間隔(秒)
LED_ON  = 1
LED_OFF = 0

# Pinオブジェクトをリスト内包表記でまとめて初期化
leds = [Pin(pin, Pin.OUT) for pin in LED_PINS]

# ループで順番にLEDを点灯
while True:
    for led in leds:
        # まず全てのLEDを消灯
        for l in leds:
            l.value(LED_OFF)

        # 現在のLEDを点灯
        led.value(LED_ON)
        sleep(SLEEP_SECONDS) # 一定時間待つ

このコードでは、最初にLED_PINSというリストにGPIO番号をまとめて定義しています(緑=13, 黄=14, 赤=15)。
[Pin(pin, Pin.OUT) for pin in LED_PINS]というリスト内包表記を使い、LEDピンそれぞれに対応するPinオブジェクトを自動的に生成してledsリストに格納しています。
結果、ledsリストには3つのPinオブジェクト
  leds[0]が緑LED
  leds[1]が黄LED
  leds[2]が赤LED
が入ります。

あとはwhile Trueループ内で、for led in leds:と記述することで、リストledsの中身(各LED)を順番にledという変数に取り出して処理を繰り返すことができます。ループの中ではまず全LEDを消灯するためにもう一つforを回し、次に現在のled(取り出されたLED一つ)だけを点灯しています。そして一定時間sleep()したら、また次のLEDに進みます。こうすることで、先ほどは手書きで何度も書いていたON/OFF処理をコンパクトに表現できました。

このリファクタリング版のコードは、LEDの数を増やしたり変更したいときにも便利です。例えばLEDをもう1個追加して4つにしたければ、LED_PINSリストに新しいGPIO番号を1つ足すだけでOKです。ループ処理は自動的にその数だけ繰り返されるので、コードの他の部分を修正する必要はありません。さらに、待ち時間を変更したい場合もSLEEP_SECONDSの値を1箇所変えるだけで全体に反映されます。このようにDRY(Don’t Repeat Yourself)の原則、つまり「コードの繰り返しを減らす」書き方を意識すると、プログラムがスッキリ読みやすくなりミスも減ります。

ピコさん
ピコさん
この書き方なら、あとからLEDを増やしたくなっても簡単ですよ!例えば青LEDを追加したいときは、LED_PINSリストにそのピン番号をひとつ足すだけ。コードの他の部分はそのままで、LEDが4つ順番に点灯するようになります。

コードを整理すると、一見難しそうに感じるかもしれませんが中身の動きは同じです。最初は無理に短く書かず、理解優先でOK。慣れてきたら少しずつ今回のようなテクニックも取り入れてみてくださいね。

まとめ

今回はRaspberry Pi Picoを使って、3つのLEDを信号機のように順番に点灯させる方法を紹介しました。**Lチカ**(LED点滅)から一歩進んで複数のLEDを扱ってみることで、GPIOピンを複数使う方法や、プログラムでの繰り返し処理の書き方を学べたと思います。最初は配線が増えて戸惑うかもしれませんが、「やること自体はLED1個のときと同じなんだ」と理解できれば怖くありませんでしたよね?

実際にやってみて「思ったより簡単かも!」と感じられたなら幸いです。ぜひ今回のコードをベースに、電子工作とプログラミングの創作を楽しんでください。例えば、LEDの点滅パターンを変えてみたり、ボタンを追加して押したら切り替わるようにする等、工夫次第でプロジェクトの幅が広がります。また、MicroPythonを使ったPicoの制御は、Raspberry Pi Pico 2など新しいモデルでも基本は同じなので、学んだスキルはこれからもずっと役立ちます。

もし今回の内容が難しいと思ったら、 Raspberry Pico Lチカ(MicroPython) に戻って見ましょう。じっくり焦らず理解しましょう。

次回予告

LEDの明るさを変えてみよう。

コメント