稼働中

マイクロビット(e_27)NeoPixelをライブラリー無しで動かす(2)

モジュール無しでNeoPixelを動かす

前回の記事(e_26)でモジュール無しでNeoPixelの点灯が出来ました。今回はシフト動作や点滅などを試してみようと思います。記事(e_26)に載せた「neopixel_test_21_05b.py」を改良してみました。

1.LED(0)だけを赤点灯

1ケのLEDを点灯するだけです。LED(0)を赤で点灯させます。括弧内の(数字)はNeoPixelのRGB LEDの0~7のアドレス番号です。

スクリプト

記事(e_26)に載せた「neopixel_test_21_05b.py」
# Color データに
NON=(0,0,0)
# LED 0 ~ 7 の色を設定
Colors=[RED,NON,NON,NON,NON,NON,NON,NON]
を追加しただけです。

「neopixel_test_21_06b.py」
# 8Mbbs default(baudrate=1Mbbs mode=0) 
spi.init(baudrate=8000000, bits=8, mode=1, sclk=pin13, mosi=pin15, miso=pin14)
sleep(100)
# NeoPixel分のSPIデータを操作(N_LED_8xpwm3x8bit=192byte)
# 全て'0'の'0xc0'データ 送信するとクリア
def N_cls(num=8):
    buf=bytearray(b'\xc0'*(num*3*8))
    #0xc0 # bit L data
    sleep(100)
    spi.write(buf)
    sleep(100)
    return buf
# バイトデータのビットごとにSPI化したデータを戻す
def sendByte(b):
    buf=bytearray(8)      # 8bit >> SPI Date
    for bit in range(8):       
        if (b & 0x80):    # 最上位'1'の部分なら以下を送信
            buf[bit]=0xfc
        else:            # 最上位'0'の部分なら以下を送信
            buf[bit]=0xc0
        b <<= 1          # shift next bit
    return buf
# PWMデータを1/dにして戻す
def d_rgb(rgb,d):
    r=int(rgb[0]/d)
    g=int(rgb[1]/d)
    b=int(rgb[2]/d)
    return (r,g,b)
# データrgbの並び、送信はg,r,bの順番
def sig_sbuf(rgb): #rgb=(r,g,b)    
    sig_buf=sendByte(rgb[1])+sendByte(rgb[0])+sendByte(rgb[2])
    sleep(10)
    return sig_buf
# Color データ
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)
NON=(0,0,0)
# LED 0 ~ 7 の色を設定
#Colors=[RED,ORANGE,YELLOW,GREEN,CYAN,BLUE,PURPLE,WHITE]
Colors=[RED,NON,NON,NON,NON,NON,NON,NON]
# Colorsのデータを点灯
N_cls()
send_buf=bytearray()
for i in range(8):
    # d_rgb(rgb,d) で明るさ調整 PWMデータを1/5にする
    rgb=d_rgb(Colors[i],5)
    send_buf+= sig_sbuf(rgb)
print('LED ON')
sleep(100)
spi.write(send_buf)
sleep(3000)      # ON 3sec 
N_cls() # OFF
print('LED OFF')

実行結果

実行結果です。LED(0)が赤色で点灯しました。
LED(0)に赤色点灯

2.シフト移動

シフト移動させます。右に10>>左に10移動させます。シフトしながら点灯します。

スクリプト

先の「neopixel_test_21_06b.py」に以下を追加しました。

追加分
# ***************************************************** shift
# send_buf[:-24] 0 ~ 170(194-24) = [:170]と同じ 
def r_shift():
    # 後ろから24個 後ろ24を残して0から0 ~ 170(194-24)
    buf=send_buf[-24:]+send_buf[:-24]
    sleep(1)
    return buf
def l_shift():
    # 24から後ろ(24~194) 24を残して0から(0~23まで)
    buf=send_buf[24:]+send_buf[:24]
    sleep(1)
    return buf
# 右シフト>左シフト
print('shift test')
for i in range(10):       # r-shift
    send_buf=r_shift()
    spi.write(send_buf)
    sleep(500)            # LED_ON msec
for i in range(10):       # l-shift
    send_buf=l_shift()
    spi.write(send_buf)
    sleep(500)            # LED_ON msec
sleep(1000)              # LED_ON
print('LED OFF')
N_cls()                  # LED OFF

実行結果

Colors=[RED,NON,NON,NON,NON,NON,NON,NON]をシフト

Colors=[RED,ORANGE,YELLOW,GREEN,CYAN,BLUE,PURPLE,WHITE]をシフト

3.色を送り出す

Colors=[RED,ORANGE,YELLOW,GREEN,CYAN,BLUE,PURPLE,WHITE]で設定した順番の色で送り出し、全点灯します。以下のように送り出されます。
LED(0)_RED
LED(0)_ORANGE LED(1)_RED
LED(0)_YELLOW LED(1)_ORANGE LED(2)_RED
・・
LED(0)_WHITE LED(1)_PURPLE ・・・・LED(6)_ORANGE LED(7)_RED  #全点灯

スクリプト

「import random」を追加します。「neopixel_test_21_06b.py」にある「# Colorsのデータを点灯」から下を削除して、以下に書き換えました。


# *****************************************************************
# num個目のバッファデータを書き換える
def chang_sbuf(num,rgb):#rgb=(r,g,b)
    chg_buf=sendByte(rgb[1])+sendByte(rgb[0])+sendByte(rgb[2])
    n_ch=num*24
    for i in chg_buf:
        #print(i)
        send_buf[n_ch]=i
        n_ch += 1
    return send_buf
def rgb_chg():
    rgb=[]
    rgb=random.choice(Colors)
    return rgb
# NeoPixel分のSPIデータを操作(N_LED_8xpwm3x8bit=192byte)
# 0,1,2,3--7 jyunnzi tentou zenn tenntou >> Clear
# バッファー兼消去
send_buf=N_cls()
for _ in range(3): # 繰返し回数
    N_cls()
    send_buf=N_cls()
    #rgb=rgb_chg()  # ---------------------------- PTN-2(random.choice)
    for i in range(8): # 1個づづシフトしながら8個 点灯
        # d_rgb(rgb,d) でPWMデータを1/5にする
        # 1回づつ色を変える>>8色が表示される
        #rgb=d_rgb(rgb_chg(),5) # ---------------- PTN-2(random.choice)
        rgb=d_rgb(Colors[i],5) # --------------- PTN-1
        # send_buf[:-24] 0 ~ 170(194-24) = [:170]と同じ 
        send_buf=sig_sbuf(rgb)+send_buf[:-24]
        sleep(10) # 0.5 color fuantei 
        spi.write(send_buf)
        sleep(100)              # -------------- 点灯時間
    sleep(2000)
    gc.collect()
print('END')
N_cls()

実行結果

実行結果です。
Colors=[RED,ORANGE,YELLOW,GREEN,CYAN,BLUE,PURPLE,WHITE]を順番に送り出して点灯します。

#PTN-1 行をコメントアウト、PTN-2 アンコメントにするとリスト内の色をランダムに選択して送りだします。

4.明るさを変えて送り出す

Colorsで設定した色の明るさを変えて送り出します。
明るさはdx=[120,100,80,60,40,20,10,5] の値でPWM値を割って変更しています。

スクリプト

「neopixel_test_21_06b.py」にある「# LED 0 ~ 7 の色を設定」から下を削除して、以下に書き換えました。点灯時間を短くしています。光が流れるような感じになりました。


Colors=[RED,NON,GREEN,NON,RED,NON,GREEN,NON]
dx=[120,100,80,60,40,20,10,5]

# *****************************************************************
N_cls()
send_buf=N_cls()
for i in range(8): # 1個づづシフトしながら8個 点灯
    for d in range(8):
        #print(dx[d])
        # d_rgb(rgb,d) でPWMデータを1/5にする
        # 1回づつ色を変える>>8色が表示される
        rgb=d_rgb(Colors[i],dx[d]) # -----------明るさ変更
        #print(d,dx[d],rgb)
        # send_buf[:-24] 0 ~ 170(194-24) = [:170]と同じ
        #sleep(100)
        send_buf=sig_sbuf(rgb)+send_buf[:-24]
        sleep(10) # 0.5 color fuantei 
        spi.write(send_buf)
        sleep(100)              # -------------- 点灯時間
N_cls()
sleep(1000)
print('END')

実行結果

実行結果です。Colors=[RED,NON,GREEN,NON,RED,NON,GREEN,NON]を明るさを変えて順次送り出されています。

まとめ

neopixelモジュール(ライブラリー)無しでNeoPixelを動かしてみました。左右のシフトや明るさの変更などができました。もっといろんなパターンでNeoPixelの操作ができそうです。