LEDを点滅させてみた。(Raspberry Pi Pico)

つぶやき

Raspberry pi PicoでLチカしてみた。

Raspberry Pi PicoのオンボードLEDを machineモジュールのPinクラスとtimeモジュールのsleep関数を使い、1秒間隔で点滅させます。無限ループでLEDを点滅させ、Ctrl+Cで中断するとLEDを消灯して終了します。

# main.py

# このプログラムは、Raspberry Pi PicoのオンボードLEDをMicroPythonで制御する
# 簡単なデモです。
# Pinクラスを使ってLED用のピンオブジェクトを作成し、sleep関数でLEDの点灯・
# 消灯の間に遅延を作ります。
# このプログラムは、ユーザーがCtrl+Cで割り込むまで無限に実行されます。
# 1秒ごとにLEDを点滅させ、LEDの状態をコンソールに表示します。

# 必要なモジュールをインポート
from machine import Pin  # machineモジュールからPinクラスをインポート
from time import sleep   # timeモジュールからsleep関数をインポート

led = Pin("LED", Pin.OUT)  # オンボードLEDを出力モードで初期化
interval = 1  # 点滅間隔(秒)

# LEDを点滅させる関数
def blink_led(led, interval):
    led.on()  # LEDを点灯
    print("LED ON")  # 点灯状態を表示
    sleep(interval)  # 点灯状態を維持

    led.off()  # LEDを消灯
    print("LED OFF")  # 消灯状態を表示
    sleep(interval)  # 消灯状態を維持

try:
    while True:
        blink_led(led, interval)  # LEDを繰り返し点滅させる

except KeyboardInterrupt:
    # Ctrl+Cが押されたらプログラムを終了
    pass

finally:
    led.off()  # プログラム終了時にLEDを消灯
    print("LED OFF")  # 消灯状態を表示
    print("プログラムを終了します")  # プログラム終了を表示

Timer を使ってLED点滅させてみた。

このプログラムは、Raspberry Pi PicoのオンボードLEDをTimerを使って1秒ごとに点滅させるものです。Timerはバックグラウンドで動作するため、メインループは空でもLEDは自動的に点滅します。
これにより、他の処理に影響を与えずにLEDの点滅が可能になります。

# blink_LED.py
# LED を点滅させるプログラム

from machine import Pin, Timer  # PinクラスとTimerクラスをインポート

class Blinker(object):
    def __init__(self, pin_name="LED", interval=1000):
        """
        Blinkerクラスの初期化処理
        :param pin_name: 使用するGPIOピンの名前(デフォルトはオンボードLED)
        :param interval: 点滅間隔(ミリ秒単位)
        """
        self.led = Pin(pin_name, Pin.OUT)  # LEDピンを出力モードで初期化
        self.timer = Timer()               # タイマーのインスタンスを作成
        self.interval = interval           # 点滅間隔を保存
        self.timer.init(period=self.interval, mode=Timer.PERIODIC, callback=self.toggle)
        # タイマーを初期化し、指定間隔でLEDの状態を切り替える

    def toggle(self, timer):
        """
        LEDの状態を切り替えるコールバック関数
        """
        self.led.toggle()  # LEDのON/OFFを反転

# LED点滅を開始するためのクラスインスタンスを作成
blinker = Blinker(interval=1000)

# メインループ(プログラムが終了しないように空ループを維持)
while True:
    pass

BOOTSELボタンでLEDを点灯させてみた。

# この例は、Raspberry Pi Pico の BOOTSEL ボタンを使って LED を制御。
# ボタンが押されている間は LED が点灯し、離すと消灯する。

import time
import machine  # → machine モジュールを使う必要があります
import rp2      # → rp2 モジュールも BOOTSEL 読み取りに必要

led = machine.Pin('LED', machine.Pin.OUT)

while True:
    # BOOTSELボタンが押されているか確認(1 = 押されている)
    if rp2.bootsel_button() == 1:
        led.on()
    else:
        # ボタンが押されていないときはLEDを消灯
        led.off()

    # 100ミリ秒待機(無限ループが速くなりすぎるのを防ぐ)
    time.sleep(0.1)

短いコードに挑戦してみた。

#基本のプログラム
import machine
import time
led = machine.Pin("LED", Pin.OUT)  # 内蔵LEDを出力として設定
while True:
    led.on()         # LEDをON
    time.sleep(1)    # 1秒待つ
    led.off()        # LEDをOFF
    time.sleep(1)    # 1秒待つ
import machine, time       # モジュールをインポート
l = machine.Pin("LED", 1)  # 内蔵LEDを出力として設定(1はPin.OUTと同じ)
while 1:                   # 無限ループ(while Trueと同じ)
    l.toggle()             # LEDの状態を反転(ONならOFF、OFFならON)
    time.sleep(1)          # 1秒待機
from machine import Pin, Timer
led = Pin("LED", 1)
Timer().init(freq=2, mode=Timer.PERIODIC, callback=lambda _: led.toggle())

フェードイン・フェードアウトさせてみた。

from machine import Pin, PWM, Timer  # GPIOピン制御、PWM、タイマー用のモジュールをインポート


pwm = PWM(Pin(25))   # GPIO25ピンにPWM出力を設定      
pwm.freq(1000)       # PWMの周波数を1kHzに設定(ちらつき防止)

# タイマーオブジェクトを作成(一定時間ごとに割り込み処理を実行するために使用)
tim = Timer()

# PWMのコールバック関数を生成する関数(クロージャ)
def get_pwm_callback(duty, direction):
    """
    duty: デューティ比(0〜255)でPWMの強さを決定
    direction: dutyの増減方向(+1または-1)
    """
    def pwm_callback(_):
        nonlocal duty, direction  # 外側スコープの変数を更新可能にする

        # デューティ比を増減
        duty += direction

        # dutyが上限/下限を超えたら方向を反転
        if duty >= 255:
            direction = -1  # 減少方向へ
        elif duty <= 0:
            direction = 1   # 増加方向へ

        # PWMのデューティ比を更新(非線形にするためにdutyの2乗を使用)
        pwm.duty_u16(duty * duty)  # 0〜65535の範囲で設定

    return pwm_callback  # コールバック関数を返す

# 初期値 duty=0, direction=1 でコールバック関数を生成
pwm_callback = get_pwm_callback(0, 1)

# タイマーを初期化(200Hzで周期的にpwm_callbackを呼び出す)
tim.init(
    freq=200,                   # 200回/秒の周期
    mode=Timer.PERIODIC,        # 周期モード(1回限りではない)
    callback=pwm_callback       # 実行する関数を指定
)

参考にさせていただいたサイトです。

【Raspberry Pi Pico入門⓪】無料シミュレータ【WOKWi】
近年、組み込み系プログラミングの入門として安価なRaspberry Pi Picoがよく扱われます。 学習キットや文献も多く販売されており,学習のハードルはかなり低いです。 近年インターネットブラウザ
【Raspberry Pi Pico入門⓪】Raspberry Pi Pico Wのセットアップ【Thonny】
この講座では、Raspberry Pi Pico W を使ってマイコン制御を学んでいきます。 初回のテーマは、電子工作の定番「Lチカ(LEDの点滅)」。 マイコンの基本的な使い方を学びながら、自分でプ
【Raspberry Pi Pico入門①】出力制御の基礎【LED】
前回は学習のための環境を構築しました。
【Raspberry Pi Pico】ロボット制御入門⓪~RaspiPicoの概要と環境構築~【Python】
本コースではマイコンのRaspberry Pi Picoを使って、ロボット制御の基礎を学習します。 LEDを光らせる通称Lチカに始まり、Raspberry Pi Picoで動くロボットを使い、ライント

コメント