12. APA102 LED の制御
APA102 LED は DotStar LED とも呼ばれ、個別にアドレス指定できるフルカラーの RGB LED で、一般にはストリップ状につながっています。NeoPixel との違いは、制御にクロックとデータの2本のピンが必要な点です。NeoPixel よりもはるかに高いデータ周波数と PWM 周波数で動作でき、残像効果 (persistence of vision) を使った表現に向いています。
APA102 オブジェクトを作成するには、次のようにします:
>>> import machine, apa102
>>> strip = apa102.APA102(machine.Pin(5), machine.Pin(4), 60)
これは、GPIO5 をクロック、GPIO4 をデータとする 60 ピクセルの APA102 ストリップを設定します。ピン番号とピクセル数は、必要に応じて調整できます。
RGB の色データと輝度は、決まった順序で APA102 に送られます。通常これは (Red, Green, Blue, Brightness) です。新しい APA102C LED を使っている場合は緑と青が入れ替わるので、順序は (Red, Blue, Green, Brightness) になります。APA102 のレンズは四角に近く、APA102C は丸みを帯びています。APA102C のストリップを使っていて、RBG ではなく RGB の順で色を指定したい場合は、次のようにタプルの色順をカスタマイズできます:
>>> strip.ORDER = (0, 2, 1, 3)
ピクセルの色を設定するには次のようにします:
>>> strip[0] = (255, 255, 255, 31) # 白、最大輝度に設定
>>> strip[1] = (255, 0, 0, 31) # 赤、最大輝度に設定
>>> strip[2] = (0, 255, 0, 15) # 緑、半分の輝度に設定
>>> strip[3] = (0, 0, 255, 7) # 青、1/4 の輝度に設定
write() メソッドを使って色を LED に出力します:
>>> strip.write()
デモ:
import time
import machine, apa102
# 60 個の LED を備えた 1m のストリップ
strip = apa102.APA102(machine.Pin(5), machine.Pin(4), 60)
brightness = 1 # 0 は消灯、1 は暗め、31 が最大
# 0〜255 のオフセットを色のタプルに変換するヘルパー
def wheel(offset, brightness):
# 色は r - g - b - r へと遷移します
offset = 255 - offset
if offset < 85:
return (255 - offset * 3, 0, offset * 3, brightness)
if offset < 170:
offset -= 85
return (0, offset * 3, 255 - offset * 3, brightness)
offset -= 170
return (offset * 3, 255 - offset * 3, 0, brightness)
# デモ1: RGB RGB RGB
red = 0xff0000
green = red >> 8
blue = red >> 16
for i in range(strip.n):
colour = red >> (i % 3) * 8
strip[i] = ((colour & red) >> 16, (colour & green) >> 8, (colour & blue), brightness)
strip.write()
# デモ2: 虹のすべての色を表示
for i in range(strip.n):
strip[i] = wheel((i * 256 // strip.n) % 255, brightness)
strip.write()
# デモ3: 全ピクセルを虹色でフェードさせ、ピクセルごとにずらす
for r in range(5):
for n in range(256):
for i in range(strip.n):
strip[i] = wheel(((i * 256 // strip.n) + n) & 255, brightness)
strip.write()
time.sleep_ms(25)
# デモ4: 同じ色で輝度を変える
for b in range(31,-1,-1):
strip[0] = (255, 153, 0, b)
strip.write()
time.sleep_ms(250)
# 終了: すべての LED を消灯
strip.fill((0, 0, 0, 0))
strip.write()