稼働中

マイクロビット(e_28)NeoPixel用にNeo_myClassを作成

Neo_myClassを作成

NeoPixelを操作するために作成してきた関数から素人ながらNeo_myClassを自作してみました。
Classにするとスクリプトが簡単になって見やすいです。主に使い方だけ記載します。
※改良した部分を含んでいるので作成してきたコードと異なる部分があります。
※thonny-microbitのMicroPythonを使っています。

class NeoPix()

class NeoPixは以下ような形式でインスタンスを作成するようにしました。


n=NeoPix(8,Colors) #(RGB-LED数,LED数分の色コードリスト)

※以降の説明は、LED数=8の場合で記載しています。

Colors

リストColors (LED点灯のR,G,BのPWMデータ)はLED(0),LED(1)・・・LED(7)の色に対応します。
例えば、[RED,ORANGE,YELLOW,GREEN,CYAN,BLUE,PURPLE,WHITE]でNeoPixelを点灯させるには、
Colors=[(255, 0, 0), (255, 250, 0), (255, 150, 0), (0, 255, 0), (0, 255, 255), (0, 0, 255), (180, 0, 255), (255, 255, 253)]になります。
以下の「neo_colours.py」でColorsのリストデータを作ります。コピペして使います。


#!/usr/bin/env python
# -*- coding: utf-8 -*-
# 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 の色を設定
Colors1=[RED,ORANGE,YELLOW,GREEN,CYAN,BLUE,PURPLE,WHITE]
Colors2=[RED,GREEN,RED,GREEN,RED,GREEN,RED,GREEN]
Colors3=[RED,NON,NON,NON,NON,NON,NON,NON]
# Colorsのデータを生成 表示
print(Colors1)
print(Colors2)
print(Colors3)

実行結果
ThonnyのShellに表示されます。所望のColorsリストをコピペして使います。


>>> %Run neo_colours.py
[(255, 0, 0), (255, 250, 0), (255, 150, 0), (0, 255, 0), (0, 255, 255), (0, 0, 255), 
(180, 0, 255), (255, 255, 253)]    # Colors1
[(255, 0, 0), (0, 255, 0), (255, 0, 0), (0, 255, 0), (255, 0, 0), (0, 255, 0),
 (255, 0, 0), (0, 255, 0)]    # Colors2
[(255, 0, 0), (0, 0, 0), (0, 0, 0), (0, 0, 0), (0, 0, 0), (0, 0, 0), (0, 0, 0), 
(0, 0, 0)]    # Colors3

メソッド

以下のメソッドを含んでいます。
N_cls()
NeoPixelをOFFします。全消灯します。

S_DAT(dec=32)
明るさを調整します。Colorsの各データ(PWM)をdecで割った数値で送信データを作成します。
decの初期値は32です。元送信データを作成します。

D_ON(tms)
NeoPixelを送信データでONします。全点灯します。tmsで点灯時間(msec)を設定します。

P_ON(tms)
Colors[0],Colors[1]・・Colors[7]の順番でLED(0)点灯後に順次移動して行きます。tmsで点灯時間(msec)を設定します。元の送信データは変わりません。

R_ON(tms)
Colors[7],Colors[6]・・Colors[0]の順番でLED(0)点灯後に順次移動して行きます。tmsで点灯時間(msec)を設定します。元の送信データは変わりません。

r_Shift(sh=1)
設定した数で右にシフトします。シフト数の初期値は1です。元の送信データもシフトします。

l_Shift(sh=1)
設定した数で左にシフトします。シフト数の初期値は1です。元の送信データもシフトします。

T_ON(tms)
Colorsリストの逆順で1ケづつ
Colors[0],Colors[1]・・Colors[7]の順番で点灯します。tmsで点灯時間(msec)を設定します。元の送信データは変わりません。

B_ON(tms)
Colorsリストの逆順で1ケづつ
Colors[7],Colors[6]・・Colors[0]の順番で点灯します。tmsで点灯時間(msec)を設定します。元の送信データは変わりません。

スクリプト Neo_myClass.py

「Neo_myClass.py」のコードは以下のようにしました。


Neo_myClass.py
#!/usr/bin/env python
# -*- coding: utf-8 -*-
from microbit import *
# Neo_myClass.py
class NeoPix():
    # 
    def __init__(self,num,Colors):
        self.num=num
        self.Colors=Colors
        # 8Mbbs default(baudrate=1Mbbs mode=0) 
        spi.init(baudrate=8000000, bits=8, mode=1, sclk=pin13, mosi=pin15, miso=pin14)
        sleep(100)
    # 全て'0'の'0xc0'データ 送信するとクリア
    def N_cls(self):
        buf=bytearray(b'\xc0'*(self.num*3*self.num))
        #0xc0 # bit L data
        sleep(100)
        spi.write(b'/0xff')
        spi.write(buf)
        sleep(100)
        return 
    # バイトデータのビットごとにSPI化したデータを戻す
    def sendByte(self,b):
        self.buf=bytearray(8)      # 8bit >> SPI Date
        for bit in range(8):       
            if (b & 0x80):    # 最上位'1'の部分なら以下を送信
                self.buf[bit]=0xfc
            else:            # 最上位'0'の部分なら以下を送信
                self.buf[bit]=0xc0
            b <<= 1 # shift next bit return self.buf # PWMデータを1/dにして戻す 
    def d_rgb(self,rgb,d):
        self.r=int(rgb[0]/d) self.g=int(rgb[1]/d)
        self.b=int(rgb[2]/d)
        return (self.r,self.g,self.b)

    # pwm-data>>sendByteで変換 rgbの並び、送信はg,r,bの順番
    def sig_sbuf(self,rgb): #rgb=(r,g,b)    
        self.sig_buf=self.sendByte(rgb[1])+self.sendByte(rgb[0])+self.sendByte(rgb[2])
        sleep(10)
        return self.sig_buf
    # send_bufデータの生成 Colorsのデータ>>send_buf(MOSIデータ)に変換する
    def S_DAT(self,dec=32):
        self.send_buf=bytearray()
        for i in range(self.num):
            # d_rgb(rgb,d) で明るさ調整 PWMデータを1/decにする
            rgb=self.d_rgb(self.Colors[i],dec)
            #print(rgb)
            self.send_buf+= self.sig_sbuf(rgb)
        #spi.write(self.send_buf)
        return self.send_buf

    # send_bufデータを送信(一斉に点灯)
    def D_ON(self,tms):
        spi.write(b'/0xff')
        spi.write(self.send_buf)
        sleep(tms)
        return

    # Colors順で順次移動>>LED 76543210
    def P_ON(self,tms):
        buf=bytearray()
        for i in range(self.num):
            buf=(self.send_buf[i*24:(i+1)*24])+buf
            spi.write(b'/0xff')
            spi.write(buf)
            sleep(tms)
    # Colors逆順で順次移動>>LED 01234567
    def R_ON(self,tms):
        buf=bytearray()
        for i in range(self.num):
            buf=(self.send_buf[-24*(i+1):24*(self.num-i)])+buf
            spi.write(b'/0xff')
            spi.write(buf)
            sleep(tms)
    # shift left(down) right(up)
    def r_Shift(self,sh=1):
        # 後ろから24個+前(0 ~ 170=194-24)sh:シフト数
        self.send_buf=self.send_buf[-24*sh:]+self.send_buf[:-24*sh]
        sleep(1)
        spi.write(b'/0xff')
        spi.write(self.send_buf)
         
    def l_Shift(self,sh=1):
        # 後ろ(24~194)+前(0~23まで)sh:シフト数
        self.send_buf=self.send_buf[24*sh:]+self.send_buf[:24*sh]
        sleep(1)#atta houga dandenn anteisuru
        spi.write(b'/0xff')
        spi.write(self.send_buf)

    # Colors順で点灯
    def T_ON(self,tms):
        for i in range(self.num):
            spi.write(b'/0xff')
            spi.write(self.send_buf[:24*(i+1)])
            sleep(tms)

    # Colors逆順で点灯
    def B_ON(self,tms):
        for i in range(self.num):
            spi.write(b'/0xff')
            spi.write(self.send_buf[-24*(i+1):]) # bottom
            sleep(tms)

ファイルを送る

「Neo_myClass.py」をインポートできるようにファイルをmicro:bitに送ります。ufs(記事m_20参照)を使います。
Thonnyとmicro:bitがシリアル接続されている場合は、メニュー>Deviceから「Close serial connection」を選択して接続を閉じます。
メニュー>Toolsから「Open system shell」を選択してターミナル(コマンドプロンプト)を開きます。


ufs put Neo_myClass.py

で「Neo_myClass.py」をmicro:bitのファイルシステムに送ります。※Pythonにmicrofsのインストールが必要です。
ターミナル ufs


C:\Py>ufs ls                    # micro:bitのファイルリストを調べる
                                # 何も無い
C:\Py>ufs put Neo_myClass.py    # micro:bitにファイルを送る

C:\>ufs ls                      # ファイルを調べる
Neo_myClass.py                  # micro:bitに保存された

動作確認

以下にメソッドなどの動作確認の結果を記載します。

① P_ON(tms)、R_ON(tms)

D_ON(tms)、N_cls() 全点灯、全消灯
P_ON(tms)、R_ON(tms) Colors 順逆点灯・移動 の動作を以下のスクリプトで確認しました。


#!/usr/bin/env python
# -*- coding: utf-8 -*-
from microbit import spi,sleep

# micro:bitに送ったNeo_myClass.pyからNeoPixをインポート
from Neo_myClass import NeoPix

# Color データ LED 0 ~ 7 の色を設定
# Colors1=[RED,ORANGE,YELLOW,GREEN,CYAN,BLUE,PURPLE,WHITE]
Colors=[(255, 0, 0), (255, 250, 0), (255, 150, 0), (0, 255, 0),
(0, 255, 255), (0, 0, 255), (180, 0, 255), (255, 255, 253)]

# Colorsのデータを点灯
n=NeoPix(8,Colors)    # __init__ LED_num,Colors
n.N_cls()
sleep(3000)
print('<<< LED ON') 
n.S_DAT(64) # Colorsデータから送信データを生成 明るさ1/64 print('D_ON') 
n.D_ON(2000) # 全点灯 2sec 
n.N_cls() # 全消灯 
sleep(2000) ##-----------------------------------この間を差し替えて動作確認 
print('P_ON>>')
n.P_ON(500)         # Colors順点灯 移動 500msec間隔
n.N_cls()
sleep(1000)

print('R_ON<<')
n.R_ON(500)         # Colors逆点灯 移動 500msec間隔
n.N_cls() # OFF
sleep(1000)
##---------------------------------------------ここまで差し替え
print('<< LED OFF')

実行結果


>>> %Run neo_mytest_b11.py
<<< LED ON D_ON P_ON>>
R_ON<<
<< LED OFF

① T_ON(tms)、B_ON(tms)

T_ON(tms)、B_ON(tms) Colors順逆点灯の動作を以下のスクリプト(差し替え部)で確認しました。


print('T_ON >>')
n.T_ON(500)         # Colors順点灯 500msec間隔
n.N_cls()
sleep(1000)

print('B_ON <<')
n.B_ON(500)         # Colors逆点灯 500msec間隔
n.N_cls()
sleep(1000)

実行結果


>>> %Run neo_mytest_b12.py
<<< LED ON D_ON T_ON >>
B_ON <<
<< LED OFF

②r_Shift(sh)、l_Shift(sh)

r_Shift(sh)、l_Shift(sh)のシフト動作を以下のスクリプト(差し替え部)で確認しました。シフト動作が分かりやすいように、Colors=[RED,NON,NON,NON,NON,NON,NON,NON]のデータに変更しています。


print('Shift_R>')
for i in range(n.num):      # n.mun=8回繰返し
    n.r_Shift(1)            #右へシフト
    sleep(500)

sleep(1000)    
print('Shift_L<')
for i in range(n.num):
    n.l_Shift(1)            #左へシフト
    sleep(500)

実行結果


>>> %Run neo_mytest_b13.py
LED ON---
D_ON
Shift_R>
Shift_L<
LED OFF---

classを試したのは初めてです。素人なので間違いがあるかも知れません。とりあえず動いているようです。

まとめ

class NeoPix()を作成しました。class NeoPixにNeoPixelの全点灯、全消灯、Colors順逆点灯、Colors 順逆点灯・移動、シフト点灯のメソッド作成しました。その動作を確認しました。