稼働中

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