Raspberry Pi Pico(s_33)NeoPixel 用モジュール

NeoPixel NeoPc.py
NeoPixelはDriver IC(WS2811等)を搭載したRGB LED(WS2812B等)を連結したアドレッサブルLEDです。
※詳細はWS2812Bなどのデータシートを参照くださいね。
Raspberry Pi Picoでclass ‘NeoPixel’を使ってNeoPixelを動作させます。
LED点灯の左右にシフト、LED連結数分のリストデータで点灯、などの関数を追加した自作の’NeoPc.py’を作成しました。
記事d_37を元に作成しています。’NeoPc.py’は末尾にあります。
使い方だけを記載します。
使い方
■ ファイル転送
Raspberry Pi Picoへ’NeoPc.py’を送った後でimportして使います。
※NeoPc.pyの末尾に、使用例(NeoPc_ex.py)の## example以降をコピペ追加しても動作確認できます。
■ メソッド
‘NeoPc’をimportするとclass ‘NeoPixel’のメソッドに追加して「cls、CLed、Rshf、Lshf、d_off」が使えるようになります。
またLED発光色に関する定数が使えます。
RED、ORANGE、YELLOW、GREEN、CYAN、BLUE、PURPLE、WHITE、ALL、C0~C1のカラーリストデータ(LED数が8)
C0=[RED,GREEN,RED,GREEN,RED,GREEN,RED,GREEN] #1
C1=[RED,YELLOW,GREEN,BLUE,RED,YELLOW,GREEN,BLUE] #2
C2=[RED,ORANGE,YELLOW,GREEN,CYAN,BLUE,PURPLE,WHITE] #3
NeoP(gpin=16,leds=8,dc=0.2))で初期化します。
gpin:出力に使うGP番号です。デフォルトはGP16です。
leds:NeoPixelのLED数です。デフォルトは8です。
dc:発光させる割合です。pwm値に掛ける値です。デフォルトは0.2です。
(01)cls()
PWMデータをクリアします。
(02)CLed(Cdat,tms=0)
Cdat:NeoPixel LEDの個数分のRGB PWM値のリストデータ
tms:待機時間です。単位はmsecです。0なら実質データ送信だけです。
(03)Rshf(n=1,tms=0)
右側(上)にシフトします。
n:シフト数
tms:シフト間隔の時間です。単位はmsecです。0なら実質データ送信だけです。
(04)Lshf(n=1,tms=0)
左側(下)にシフトします。
n:シフト数
tms:シフト間隔の時間です。単位はmsecです。0なら実質データ送信だけです。
(05)d_off()
元のデータは残してLEDをoffします。
(06)r_data()
Ledsに設定されたpwm値を返します。([r,g,b],[r,g,b]・・)のリストで返ります。
使用例
RGB LED 8連のNeoPixelを動作させています。
接続等は記事d_37を参照ください。動作もほぼ同じです。
8連LEDのColor-listデータを点灯させます。順次3パターンを点灯。
左右にシフト動作させます。Pos0の赤を左に7、その後右に15シフト。
データは残したままLEDをoffします。元データで再点灯。
設定されたpwm値をThonnyのShellに表示。
NeoPc_ex.py
#!/usr/bin/env python
# -*- coding: utf-8 -*-
from machine import Pin
import neopixel, time
from NeoPc import NeoP
## example
a=NeoP(16,8,0.05) # GP16、8連LEDs、発光率
a.cls() # データクリア
# Colors listで点灯
a.CLed(a.C0,2000)
a.CLed(a.C1,2000)
a.CLed(a.C2,2000)
a.cls()
## シフト動作確認
a.np[0]=a.xdat(a.RED) #Pos0-RED on
a.np.write()
time.sleep_ms(1000)
# 右(上)シフト 移動7、点灯500ms
a.Rshf(7,500)
time.sleep(1)
# 左(上)シフト 移動15、点灯300ms
a.Lshf(15,300)
a.cls()
time.sleep(2)
## LED OFF動作
a.CLed(a.C2,1000)
a.d_off() # OFF
time.sleep(1)
a.np.write() # 元データC2でLED-on
time.sleep(1)
## Pos data list
print(a.r_data()) #Ledsに設定されたpwm値[r,g,b]を表示
a.cls()
実行結果
実行すると以下のようになりました。発光動作は記事d_37を参照ください。
Ledsに設定されたpwm値[r,g,b]は以下でした。Thonnyのshellに表示されます。
>>> %Run -c $EDITOR_CONTENT
[[12, 0, 0], [12, 12, 0], [12, 7, 0], [0, 12, 0], [0, 12, 12], [0, 0, 12],
[9, 0, 12], [12, 12, 12]]
>>>
NeoPixel モジュール用
NeoPc.py
#!/usr/bin/env python
# -*- coding: utf-8 -*-
from machine import Pin
import neopixel, time
class NeoP:
# Colorデータ RGB-PWM data
RED=(255, 0, 0)
ORANGE=(0xff,0xfA,0)
YELLOW=(255, 150, 0)
GREEN=(0, 255, 0)
CYAN=(0, 255, 255)
BLUE=(0, 0, 255)
PURPLE=(180, 0, 255)
WHITE=(0xff,0xff,0xfd)
ALL=(255,255,255)
# Color-list data LED 0 ~ 7 の色設定用
C0=[RED,GREEN,RED,GREEN,RED,GREEN,RED,GREEN] #1
C1=[RED,YELLOW,GREEN,BLUE,RED,YELLOW,GREEN,BLUE] #2
C2=[RED,ORANGE,YELLOW,GREEN,CYAN,BLUE,PURPLE,WHITE] #3
def __init__(self,gpin=16,leds=8,dc=0.2):
#OUT GPIO-Pin
self.p0=Pin(gpin,Pin.OUT)
#neopixel.NeoPixel(pin, leds) ORDER -- (1, 0, 2, 3)
self.np=neopixel.NeoPixel(self.p0, leds)
self.dec=dc
# 明るさ減 pwm data x dec
def xdat(self,ldat=[0,0,0]):
self.da=[]
for d in ldat:
self.da.append(int(d*self.dec))
return self.da
# data clear
def cls(self):
self.np.fill((0,0,0))
self.np.write()
# Colors list data, LED on-time(msec)
def CLed(self,Cdat,tms=0):
i=0
for d in Cdat:
self.np[i] = self.xdat(d)
i=i+1
self.np.write()
time.sleep_ms(tms)
# 右(上)シフト 移動数、点灯時間
def Rshf(self,n=1,tms=0):
a=self.np.buf # np.buf bytearray(leds*3)
#print(a)
for i in range(n):
# right shift
mdat=a[-3:] # move data
cdat=a[:-3] # clipped data
#print(mdat,cdat)
mdat.extend(cdat)
a=mdat
if tms !=0:
self.np.buf=mdat
self.np.write()
time.sleep_ms(tms)
else:
self.np.buf=mdat
self.np.write()
# 左(下)シフト 移動数、点灯時間
def Lshf(self,n=1,tms=0):
a=self.np.buf # np.buf bytearray(leds*3)
#print(a)
for i in range(n):
# right shift
mdat=a[3:] # move data
cdat=a[:3] # clipped data
#print(mdat,cdat)
mdat.extend(cdat)
a=mdat
if tms !=0:
self.np.buf=mdat
self.np.write()
time.sleep_ms(tms)
else:
self.np.buf=mdat
self.np.write()
#print(mdat)
# LED Off 元Dataは残っている
def d_off(self):
cbuf=self.np.buf #current buf-data
dbuf=bytearray(8*3) # delete all 0x00 data
self.np.buf=dbuf
self.np.write()
self.np.buf=cbuf # undo buf-data
# read pwm data
def r_data(self):
c_list=[]
num=len(self.np.buf)
for i in range(int(num/3)):
pos=[]
#ORDER -- (1, 0, 2, 3) G R B W
pos.append(self.np.buf[i*3+1])#R
pos.append(self.np.buf[i*3+0])#G
pos.append(self.np.buf[i*3+2])#B
c_list.append(pos)
return c_list











