Raspberry Pi Pico を使ってみた [2] – Micro Python で GPIO 入出力


前回は Micro Python を使って Raspberry Pi Pico 基板上の LED を制御してみました.開発環境のセットアップと、プログラム作成~基板への書き込み手順が分かりましたので、これからは外部ヘッダに引き出されている I/O 端子経由で Raspberry Pi Pico の各種ペリフェラルを使ってみたいと思います.

LED 点灯とタクトスイッチの ON/OFF 検出

まずは GPIO の制御例として、LEDの点灯制御(GPIO 出力)と外部スイッチの ON/OFF 検出(GPIO 入力)をしてみます.また、GPIO 入力では割り込みを利用した検出も試してみます.

ハードウェア接続
下に Raspberry Pi Pico の I/O 端子と LED、タクトスイッチの配線を示します.基板上のピンヘッダ端子には、RP2040 IC の GPIO 端子 30ピンのうちの 26本(GP0~GP28)が引き出されていますので、どの端子を使っても同様の制御が可能です.
回路

接続
ソフトウェア(Micro Python コード)
前回と同様、Micro Python を使用します. MicroPython ライブラリのドキュメントを参照し、I/O ピン制御に使う Pin クラスの使用例を確認しながらコーディングしていきます. 主に下記のような機能を使用して I/O ピンのモード設定や出力の駆動、入力値の検出ができます.
# GP3 を出力、GP26 を入力に設定
led_b = Pin(3, Pin.OUT)
button = Pin(26, Pin.IN)

# 出力値を L, H に設定
led_r.value(0)
led_y.value(1)

# IRQ コールバック(割り込み発生時に呼ばれる関数処理)を設定
button.irq(irq_handle, Pin.IRQ_FALLING)

下記は、GP26 の入力値を読み込み、その値によって LED の点灯パターンを変えています.
from machine import Pin
import time

led = Pin(25, Pin.OUT)

led_r = Pin(0, Pin.OUT)
led_y = Pin(1, Pin.OUT)
led_g = Pin(2, Pin.OUT)
led_b = Pin(3, Pin.OUT)

button = Pin(26, Pin.IN)

led_r.value(0)
led_y.value(0)
led_g.value(0)
led_b.value(0)

while True:
    if (button.value() == 1) :
        led_r.value(1)
        led_y.value(0)
        led_g.value(0)
        led_b.value(0)
        time.sleep_ms(500)
        led_r.value(0)
        led_y.value(1)
        led_g.value(0)
        led_b.value(0)
        time.sleep_ms(500)
        led_r.value(0)
        led_y.value(0)
        led_g.value(1)
        led_b.value(0)
        time.sleep_ms(500)
        led_r.value(0)
        led_y.value(0)
        led_g.value(0)
        led_b.value(1)
        time.sleep_ms(500)
    else :
        led_r.value(0)
        led_y.value(0)
        led_g.value(0)
        led_b.value(0)
        time.sleep_ms(500)
        led_r.value(1)
        led_y.value(1)
        led_g.value(1)
        led_b.value(1)
        time.sleep_ms(500)

下記は GP26 の入力をトリガに割り込みを設定し、GP26 が Low になったことを検出し、その間だけ LED の点灯パターンを変えています.
from machine import Pin
import time

led = Pin(25, Pin.OUT)

led_r = Pin(0, Pin.OUT)
led_y = Pin(1, Pin.OUT)
led_g = Pin(2, Pin.OUT)
led_b = Pin(3, Pin.OUT)

button = Pin(26, Pin.IN)

# IRQ handle function
def irq_handle(p): 
    print('Pin state changed', p)
    led_r.value(1)
    led_y.value(1)
    led_g.value(1)
    led_b.value(1)
    time.sleep_ms(1000)

led_r.value(0)
led_y.value(0)
led_g.value(0)
led_b.value(0)
button.irq(irq_handle, Pin.IRQ_FALLING)

while True:
        led_r.value(1)
        led_y.value(0)
        led_g.value(0)
        led_b.value(0)
        time.sleep_ms(500)
        led_r.value(0)
        led_y.value(1)
        led_g.value(0)
        led_b.value(0)
        time.sleep_ms(500)
        led_r.value(0)
        led_y.value(0)
        led_g.value(1)
        led_b.value(0)
        time.sleep_ms(500)
        led_r.value(0)
        led_y.value(0)
        led_g.value(0)
        led_b.value(1)
        time.sleep_ms(500)


実行結果
実行結果の波形を確認してみました.D0~D3 が LED の各出力端子の波形を表し、プログラム通り点灯パターンが正しく遷移していることが確認できました.
Pulse View 波形
下記の図でカーソルの A – B の期間はタクトスイッチが押された状態のもので、割り込みがかかりテントパターンが変化していることが分かります.
Pulse View 波形

参考

MicroPython ライブラリのドキュメント
Raspberry Pi Pico スイッチの操作を割り込みで処理 備忘録

返信を残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です