前回は 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 の点灯パターンを変えています.
下記は 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) 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)
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 の各出力端子の波形を表し、プログラム通り点灯パターンが正しく遷移していることが確認できました. 下記の図でカーソルの A – B の期間はタクトスイッチが押された状態のもので、割り込みがかかりテントパターンが変化していることが分かります.参考
MicroPython ライブラリのドキュメントRaspberry Pi Pico スイッチの操作を割り込みで処理 備忘録