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

NeoPixel NeoBSTc.py
NeoPixelはDriver IC(WS2811等)を搭載したRGB LED(WS2812B等)を連結したアドレッサブルLEDです。※詳細はWS2812Bなどのデータシートを参照ください。
Raspberry Pi Picoで machine.bitstream を使ってNeoPixelを動作させます。
LED点灯の左右にシフト、LED連結数分のリストデータで点灯、などの関数を追加した自作の’NeoBSTc.py’を作成しました。記事d_38を元に作成しています。’NeoBSTc.py’は末尾にあります。
使い方だけを記載します。
使い方
■ ファイル転送
Raspberry Pi Picoへ’NeoBSTc.py’を送った後でimportして使います。
※NeoBSTc.pyの末尾に、使用例(NeoBSTc_ex.py)の## example以降をコピペ追加しても動作確認できます。
■ メソッド
‘NeoBSTc’をimportすると「nLed、cLed、Rsh、Lsh、cls、d_send、d_on、d_off、r_data」が使えるようになります。
また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
NeoBST(gpin=16,leds=8,dc=0.2))で初期化します。
gpin:出力に使うGP番号です。デフォルトはGP16です。
leds:NeoPixelの連結LED数です。デフォルトは8です。
dc:発光させる割合です。pwm値に掛ける値です。デフォルトは0.2です。
(01)nLed(num,dat=[0,0,0])
個別のLedデータを設定します。
num:連結RGB-LED番号(位置)
dat:[r,g,b]のPWMデータ
(02)cLed(clist,tms=0)
連結数分のPWMデータを設定します。
clist:NeoPixel LEDの個数分のRGB PWM値のリストデータ
tms:待機時間です。単位はmsecです。0なら実質データ送信だけです。
(03)Rsh(n=1,tms=0)
右側(上)にシフトします。
n:シフト数
tms:シフト間隔の時間です。単位はmsecです。0なら実質データ送信だけです。
(04)Lsh(n=1,tms=0)
左側(下)にシフトします。
n:シフト数
tms:シフト間隔の時間です。単位はmsecです。0なら実質データ送信だけです。
(05)cls()
PWMデータをクリアします。LEDをoffします。
(06)d_on()
現在データでLEDをonします。
(07)d_off()
元のデータは残してLEDをoffします。
(09)r_data()
Ledsに設定されたpwm値を返します。([r,g,b],[r,g,b]・・)のリストで返ります。
使用例
RGB LED 8連のNeoPixelを動作させています。
接続等は記事d_38を参照ください。動作もほぼ同じです。
個別点灯確認>Colors list点灯確認>シフト確認>>off、cls確認>バッファデータ確認
バッファデータ確認の結果はThonnyのShellに表示されます。
NeoBSTc_ex.py
#!/usr/bin/env python
# -*- coding: utf-8 -*-
from machine import Pin
import time
from NeoBSTc import NeoBST
## example
a=NeoBST(16,8,0.05)
# nLed(num,dat=[0,0,0]) test 個別LED点灯
# led pos0 RED
a.nLed(0,a.RED)
a.d_send(a.abuf)
time.sleep(1)
# led pos2 ORANGE>RED>ORANGE
a.nLed(2,a.ORANGE)
#a.d_send(a.abuf)
a.d_send(a.abuf)
time.sleep(1)
a.nLed(2,a.RED)
a.d_send(a.abuf)
time.sleep(1)
a.nLed(2,a.ORANGE)
a.d_send(a.abuf)
time.sleep(1)
# led pos5,6,7 RED,GREEN,BLUE
a.nLed(5,a.RED)
a.nLed(6,a.GREEN)
a.nLed(7,a.BLUE)
a.d_send(a.abuf)
time.sleep(1)
a.d_off()
time.sleep(1)
# cLed(clist,tms) test Colors listで点灯 2sec
wt=1500 #wait msec
a.cLed(a.C0,wt)
a.d_off();time.sleep_ms(500)
a.cLed(a.C1,wt)
a.d_off();time.sleep_ms(500)
a.cLed(a.C2,wt)
a.d_off();time.sleep_ms(500)
# Rsh(n,tms=0) test
a.cls()
a.nLed(0,a.RED)
a.d_send(a.abuf)
time.sleep(1)
a.Rsh(3,500) # 右に3シフト500ms間隔
#time.sleep(1)
a.Rsh(2) # 右に2
time.sleep_ms(500)
a.Rsh(2) # 右に2
time.sleep_ms(500)
a.d_off()
# Lsh(n,tms=0) test
a.cls()
a.nLed(7,a.GREEN)
a.d_send(a.abuf)
time.sleep(1)
a.Lsh(3,500) # 左に3シフト500ms間隔
#time.sleep(1)
a.Lsh(2) # 左に2
time.sleep_ms(500)
a.Lsh(2) # 左に
time.sleep_ms(500)
# off() cls() test
a.nLed(3,a.BLUE)
a.nLed(4,a.BLUE)
a.d_send(a.abuf)
time.sleep(1)
a.d_off()
time.sleep(1)
a.d_send(a.abuf) # LED ON (Undo Data)
time.sleep(1)
a.cls()
time.sleep(1)
a.d_send(a.abuf) # Not ON (Reset Data)
time.sleep(1)
# r_data(buf) test
a.nLed(0,a.RED)
a.nLed(1,a.GREEN)
a.nLed(2,a.BLUE)
a.d_send(a.abuf)
time.sleep(1)
print(a.r_data(a.abuf)) #現在のdata
a.d_off()
print(a.r_data(a.abuf)) #同じdata
a.cls()
print(a.r_data(a.abuf)) #全て'0'deta (Reset)
実行結果
実行すると以下のようになりました。発光動作は記事d_38を参照ください。
Ledsに設定されたpwm値[r,g,b]は以下でした。Thonnyのshellに表示されます。
>>> %Run -c $EDITOR_CONTENT
[[12, 0, 0], [0, 12, 0], [0, 0, 12], [0, 0, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0]]
[[12, 0, 0], [0, 12, 0], [0, 0, 12], [0, 0, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0]]
[[0, 0, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0]]
>>>
NeoPixel モジュール bitstream
NeoBSTc.py
#!/usr/bin/env python
# -*- coding: utf-8 -*-
from machine import Pin
import time, machine # machine.bitstream(p0, 0 ,tm ,buf)
class NeoBST:
# 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)
self.dec=dc
self.leds=leds
self.tm=(400, 850, 800, 450) #timing
self.abuf=bytearray(leds*3)
def d_send(self,data):
machine.bitstream(self.p0, 0 ,self.tm ,data)
# cls adat wa kienai disp off
def d_off(self):
buf=bytearray(self.leds*3)
self.d_send(buf)
def cls(self):
self.abuf=bytearray(self.leds*3)
self.d_send(self.abuf)
return self.abuf
def d_on(self):
self.d_send(self.abuf)
# 個別データを設定 N-1番目のdata bytearray(3)を書き換える
def nLed(self,num,dat=[0,0,0]):
#d=[0x06,0x05,0x04]
self.abuf[num*3]=int(dat[1]*self.dec) #G
self.abuf[num*3+1]=int(dat[0]*self.dec) #R
self.abuf[num*3+2]=int(dat[2]*self.dec) #B
## Colorリストデータを設定
def cLed(self,clist,tms=0):
i=0
for d in clist:
self.nLed(i,d)
i=i+1
self.d_send(self.abuf)
time.sleep_ms(tms)
# shift n shift value tms(msec)点灯しながら移動 tms=0 シフト後点灯
def Rsh(self,n=1,tms=0):
for i in range(n):
sbuf=self.abuf[-3:]
sbuf.extend(self.abuf[0:-3])
self.abuf=sbuf
if tms !=0:
self.d_send(self.abuf)
time.sleep_ms(tms)
else:
self.d_send(self.abuf)
# shift n shift value tms(msec)点灯しながら移動 tms=0 シフト後点灯
def Lsh(self,n=1,tms=0):
for i in range(n):
sbuf=self.abuf[3:]
sbuf.extend(self.abuf[:3])
self.abuf=sbuf
if tms !=0:
self.d_send(self.abuf)
time.sleep_ms(tms)
else:
self.d_send(self.abuf)
# read pwm data
def r_data(self,buf):
c_list=[]
num=len(buf)
for i in range(int(num/3)):
pos=[]
#ORDER -- (1, 0, 2, 3) G R B W
pos.append(buf[i*3+1])#R
pos.append(buf[i*3+0])#G
pos.append(buf[i*3+2])#B
c_list.append(pos)
return c_list











