※なにか気になる点がありましたらコメント欄からお伝えください。また、回路を製作する場合には電源を切るなど、注意を払って行うようお願いいたします。
目次
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
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文で表示をして終了します。
5.まとめ
Neopixelを用いて遊ぶ記事を書きました。今回は以下のような内容でした。
- 押しボタンswのエッジを検出するために割り込み処理を導入した
- Neopixelの色を7色、表示した
以上です。