稼働中

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