Tanuki_Bayashin’s diary

電子工作を趣味としています。最近はラズベリーパイPicoというマイコンを使って楽しんでいます

【ラズベリーパイPico】フルカラーLEDで遊ぶ その2

※なにか気になる点がありましたらコメント欄からお伝えください。また、回路を製作する場合には電源を切るなど、注意を払って行うようお願いいたします。

目次

1.はじめに

 今回もNeopixelを用いて遊んでみたので、ここに書きとどめておこうと思います。今回は押しボタンswのエッジに反応するように、割り込み処理を用いました。そちらの実用例としての意味合いもあります。
ラズベリーパイPico:
https://www.raspberrypi.com/products/raspberry-pi-pico/
Neopixel(adafruit):
https://www.adafruit.com/category/168

2.構成

 構成は以下の記事に書かれているものと同じです。
【ラズベリーパイPico】フルカラーLEDで遊ぶ - Tanuki_Bayashin’s diary

ネオピクセルを用いて遊ぶ
図1 全体構成図

3.ラズベリーパイPico内のコード

3.1 ソースコード

 以下に今回組み込んだソースコードを示します。

リスト1

import utime
from machine import Pin
from Oct_2021 import Class_ws2812b_Ver2

# WS2812B Setting
# Configure the number of WS2812 LEDs.
NUM_LEDS = 16
# Create the StateMachine with the ws2812 program, outputting on Pin(0).
ws = Class_ws2812b_Ver2.Class_WS2812B()
# StateMachine(0, ws2812, freq=8MHz, sideset_base=Pin(16))
ws.init_ws2812b(0, 8000000, 16, NUM_LEDS)

red = 0
green = 0
blue = 0

def callback_red(p):
    utime.sleep(0.3)
    global red

    if red == 0:
        red = 100
    elif red == 100:
        red = 0

def callback_green(p):
    utime.sleep(0.3)
    global green

    if green == 0:
        green = 100
    elif green == 100:
        green = 0

def callback_blue(p):
    utime.sleep(0.3)

    global blue
    if blue == 0:
        blue = 100
    elif blue == 100:
        blue = 0

# インスタンスの取得 Red-GP13, Green-GP14, Blue-GP15
Red_On   = machine.Pin(13, machine.Pin.IN, machine.Pin.PULL_DOWN)
Green_On = machine.Pin(14, machine.Pin.IN, machine.Pin.PULL_DOWN)
Blue_On  = machine.Pin(15, machine.Pin.IN, machine.Pin.PULL_DOWN)

# 割り込み処理への設定。エッジを検出している
Red_On.irq(trigger=Pin.IRQ_RISING, handler=callback_red)
Green_On.irq(trigger=Pin.IRQ_RISING, handler=callback_green)
Blue_On.irq(trigger=Pin.IRQ_RISING, handler=callback_blue)

# メインルーティン開始
if __name__ == '__main__':
    # Process arguments
    print('Press Ctrl-C to quit.')

    try:
        while True:
            ws.ar_color_all(red, green, blue) 
            utime.sleep(0.1)

    except KeyboardInterrupt:
        #### clear ws2812b
        ws.clear_all()
        print('program is finished')

3.2 解説

 1~3行目: ライブラリを呼んでいます。
 5~11行目: Neopixel が使えるように初期設定をしています。ライブラリ”Class_ws2812b_Ver2”の内容や、その使用例は2章のリンク先を参照してください。

 13~15行目: Neopixel表示用の変数red、green、blueを初期化しています。
 17~24行目: 変数redに関する関数です。redが0なら100に、100なら0にしています。0.3秒間、待っているのはスイッチのチャタリング防止のためです。

 26~42行目: 変数green、変数blueについても上の関数と同様のことをしています。これら3つの関数は割り込み処理のときに呼び出されます。

 44~47行目: 変数Red_On、Green_On、Blue_On をラズベリーパイPico(以下Picoと記述)の端子に入力用として割り当てています(クラスPinのインスタンスを得ています)。また、ここでPico内のプルダウン抵抗に接続するように指定しています。

 49~52行目: 割り込み処理の設定。赤、緑、青のそれぞれのスイッチが押されると、それぞれに割り振られた関数へと処理が飛びます。処理が終わったら、元の処理へと復帰します。

 54~67行目: メインルーティンです。
   57行目: Ctrl+Cが押されるとプログラムが終了することを出力します。
 59~62行目: まずここへ処理が飛びます。while文(無限ループ)内で、red、green、blueの値に応じた色をNeopixelで表示しています。処理を安定させるために待ち時間を設けています。

 64~67行目: Ctrl+Cが押されるとこちらの処理へ回ります。Neopixelを消去してprint文で表示をして終了します。

4.動画

 動作確認のために、動画を載せておきます。赤+緑 →黄色、緑+青 →シアン、青+赤 →マゼンタ、赤+緑+青 →白 と色が変わります。(単色もあります)

youtu.be

5.まとめ

 Neopixelを用いて遊ぶ記事を書きました。今回は以下のような内容でした。

  • 押しボタンswのエッジを検出するために割り込み処理を導入した
  • Neopixelの色を7色、表示した

以上です。