PICOでフルカラーLEDを制御する機能をモジュール化して使います。
モジュール化するファイルをつくります。
# NeoPixelControl.py import array import time from machine import Pin import rp2 # NeoPixel WS2812Bの指定 NUM_LEDS = 1 # NeoPixelの数 LED_PIN = 0 # NeoPixel信号接続端子 # NeoPixcel WS2812の制御タイミングに合わせたパルスを生成するための設定をアセンブラで指定 @rp2.asm_pio(sideset_init=rp2.PIO.OUT_LOW, out_shiftdir=rp2.PIO.SHIFT_LEFT, autopull=True, pull_thresh=24) def ws2812(): T1 = 2 T2 = 5 T3 = 3 wrap_target() label("bitloop") out(x, 1) .side(0) [T3 - 1] jmp(not_x, "do_zero") .side(1) [T1 - 1] jmp("bitloop") .side(1) [T2 - 1] label("do_zero") nop() .side(0) [T2 - 1] wrap() # クラスStateMachineを使用して、正確なパルスを出力するための設定を行う sm = rp2.StateMachine(0, ws2812, freq=8_000_000, sideset_base=Pin(LED_PIN)) # 設定したクラスStateMachineを有効にして使えるようにする。 sm.active(1) # LEDのRGBの値を指定する24bit(8bit x 3)の配列をNeoPixelの数で準備 ar = array.array("I", [0 for _ in range(NUM_LEDS)]) # NeoPixel点灯処理関数 def drawpix(num, r, g, b): ar[num] = g << 16 | r << 8 | b # NeoPixel制御パルス用の24bitデータを左ビットシフトとORで生成 def clearpix(num): drawpix(num, 0, 0, 0) # RGB値を0に設定してLEDを消灯させる
NeoPixelControl.pyで保存します。
モジュール化したファイルを呼び出して実行します。
呼び出すファイルを作ります。
# ライブラリをインポート import NeoPixelControl as npc #ここでライブラリーファイルを呼び出します。 import time # timeモジュールをインポート # 複数のRGB値を含むリストを作成 colors = [[255, 0, 0], # 赤 [0, 255, 0], # 緑 [0, 0, 255]] # 青 for color in colors: npc.drawpix(0,*color) # LEDの色を設定 npc.sm.put(npc.ar, 8) # 点灯実行 time.sleep_ms(1000) # 100ミリ秒待機
実行します。
テンテン
繰り返し点灯させるにはどうしたらいいでしょうか。
点灯の間隔と色を変えてみると面白いですね。