PICOでフルカラーLEDを制御する機能をモジュール化

PICOでフルカラーLEDを制御する機能をモジュール化して使います。

モジュール(module)
機能単位、交換可能な構成部分などを意味する英単語。 機器やシステムの一部を構成するひとまとまりの機能を持った部品のことです。
モジュール化することで他のプログラムからでも共通の処理を呼び出せるのが最大のメリットです。 プログラムは作れば作りこむほど、複雑になっていきます。 モジュール化することで、プログラムが複雑になるのを防ぐことができ作り替えも楽になります。

モジュール化するファイルをつくります。

# 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で保存します。

モジュール化したファイルを呼び出して実行します。

回路は「PICOでフルカラーLEDを制御」で使ったものと同じです。

呼び出すファイルを作ります。

# ライブラリをインポート
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ミリ秒待機

 実行します。

緑・赤・青を100ms間隔で点灯します。
最後は青のままになります。

テンテン
テンテン

繰り返し点灯させるにはどうしたらいいでしょうか。
点灯の間隔と色を変えてみると面白いですね。