マイクロビット(e_32)ZIP Halo 使い方(1)
ZIP Halo 動作確認
kitronikのZIP Haloを使ってみました。
「ZIP Halo」は24個のRGB-LEDが周縁に配置されています。micro:bitを4つのネジで簡単に装着できます。
3.5~5.0Vの電源で動作します。そのため単三3直の電池ボックスを使うと良いようです。
※詳細はkitronikのHPなど参照ください。
基本的にNeoPixcelと同じです。e_25の記事等を参照ください。※thonny-microbitのMicroPythonを使っています。
外観
micro:bitを4つのネジでZIP Haloに装着した外観写真です。それぞれ表面、裏面、点灯した例です。
動作確認
NeoPixcelの記事で記載したスクリプトを転用して動作を確認して見ます。
neopixelモジュールを使った場合
8色のリストを使って時計回りで順次点灯、全点灯後に反時計周りで消灯する動作をしてみます。
スクリプト例は以下のようにしました。
halo_02_circle_01.py
#!/usr/bin/env python
# -*- coding: utf-8 -*-
from microbit import *
import neopixel # neopixelモジュールを使います
# 色データ
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)
#Colors=[RED,GREEN,RED,GREEN,RED,GREEN,RED,GREEN]
#Colors=[RED,YELLOW,GREEN,BLUE,RED,YELLOW,GREEN,BLUE]
Colors=[RED,ORANGE,YELLOW,GREEN,CYAN,BLUE,PURPLE,WHITE]*3 # 24pcs
np = neopixel.NeoPixel(pin0,24) # pin0で24pcs RGB-LED 24pcsを操作
np.clear()
div=16 # 明るさ(PWM値)調整 電流抑制 4以上?
# 時計回りにColorsデータを点灯 24LED
for i in range(8*3):
pwm=[[0]*3]*8*3
for s in range(3):
pwm[i][s]=int(Colors[i][s]/div) #PWM値を1/div
np[i]=pwm[i]
np.show()
sleep(100)
sleep(1000)
# 反時計回りに消灯
for i in range(8*3):
np[-i]=NON
np.show()
sleep(100)
sleep(1000)
np.clear()
実行結果
動作しました。実際にはもっと鮮やかな感じです。
neopixelモジュールを使わない場合
e_26の記事のスクリプトneopixel_test_21_05b.py を転用して neopixel_test_21_05b_helo.pyとしました。Colorsリストを順次点灯します。
Haloの制御pinがpin0のためspi.initのパラメータmosi=pin15をmosi=pin0に変更が必要です。
右側にコメントアウトして変更点を示しました。LEDの個数が8個からHaloでは24個になったので、その部分を修正しました。
neopixel_test_21_05b_helo.py
#!/usr/bin/env python
# -*- coding: utf-8 -*-
from microbit import *
# 8Mbbs default(baudrate=1Mbbs mode=0) mosi=pin15>>pin0
spi.init(baudrate=8000000, bits=8, mode=1, sclk=pin13, mosi=pin0, miso=pin14)
sleep(100)
# NeoPixel分のSPIデータを操作(N_LED_24xpwm3x8bit) N_LED_24
# 全て'0'の'0xc0'のデータ 送信するとクリア
def N_cls(num=8*3): # (num=8)>>(num=8*3)
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
# HIGH 0xf8 *0xfc 0xfe 0xff NG>>-f0 8MHz
else: # 最上位'0'の部分なら以下を送信
buf[bit]=0xc0
# LOW 0x80 0xc0 *0xe0 0xf0 NG>>0xf8- 8MHz
b <<= 1 # shift next bit return buf # まぶしいのでPWMデータを1/dにして戻す 電流制限 d>=4?
def d_rgb(rgb,d):
r=int(rgb[0]/d)
g=int(rgb[1]/d)
b=int(rgb[2]/d)
return (r,g,b)
# 1個のLED 24bitのMOSI送信データ化
def sig_sbuf(rgb):
sig_buf=sendByte(rgb[1])+sendByte(rgb[0])+sendByte(rgb[2]) # 送信はg,r,bの順番
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)
ALL=(255,255,255)
# LED 0 ~ 7 の色を設定
#Colors=[RED,GREEN,RED,GREEN,RED,GREEN,RED,GREEN]
Colors=[RED,YELLOW,GREEN,BLUE,RED,YELLOW,GREEN,BLUE]*3 # *3
#Colors=[RED,ORANGE,YELLOW,GREEN,CYAN,BLUE,PURPLE,WHITE]
N_cls()
send_buf=bytearray()
for i in range(8*3): # (8) >> (8*3)
# 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
print('LED OFF')
N_cls() # OFF
実行結果
問題無く動作しました。
neopixelモジュールを使わない場合でもspi.initのパラメータをmosi=pin0にすれば問題無く動作しました。
まとめ
kitronikのZIP Haloの動作確認をしました。neopixelモジュールを使わずMOSI端子で制御する場合はspi.initのパラメータをmosi=pin0にする必要があります。NeoPixcelの記事との兌換を確認しました。