稼働中

マイクロビット(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に装着した外観写真です。それぞれ表面、裏面、点灯した例です。

ZIP Halo 表 ZIP Halo 裏 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の記事との兌換を確認しました。