マイクロビット(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のインストールが必要です。
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 順逆点灯・移動、シフト点灯のメソッド作成しました。その動作を確認しました。