
別シリーズにて数珠繋ぎに多数個シリアル接続可能なフルカラーLED、OST4ML5B32Aの点灯実験実施。今度はTinyGo+micro:bit v2 でも接続試験を行ってみました。よくあるNeoPixelとは違って「3値論理」の信号使ってます。中間電位を積極的に使うロジックIFにヤバさを感じつつ、Let’s go的な。
※「GoにいればGoに従え」Go関連記事の総Index
使用したフルカラーLED OST4ML5B32A については以下をご覧ください。
部品屋根性(97) OST4ML5B32A、シリアル制御カラーLED、Neopixelと違う
1本のシリアル信号線にダラダラと何個でも「カスケード接続」できる(今のところ1個しか実験してないけど)フルカラー(24ビットカラー)のLEDです。
人気者のNeoPixelと似たトポロジーで制御できますが、NeoPixelが0/1をパルス幅でエンコードしているのに対し、こちらはVDD/2を含む3レベルの電圧でエンコードしてます。ちょっと過激。
micro:bit v2 との接続
上記別シリーズ記事では Arduino UNO機をホストにOST4ML5B32Aを接続していました。本シリーズでは現在 micro:bit v2機をターゲットにしています。論理的にはGPIOを使っての制御となるのでハード的には難しいことは何もないのですが、問題は電源電圧です。5V電源のArduino UNOでは問題ないのですが、
OST4ML5B32AのVDDはMIN 3.5V
なので3.3V電源の micro:bit v2機では「定格割れ」てます。0.2Vくらいなんとかなるんじゃないかしら、ということで無理やりArduino UNOで動作していたブレッドボードをmicro:bit v2機に移設してみました。観察したところ、通信そのものは問題なさそうですが、肝心のLEDが
赤と緑はいいけれど、青が暗くて見えない
状態でした。そこで以下回路図のR1の抵抗値をArduino UNOの100Ωから20Ωへと調整しました。そしたらば青色も元気になった感じ。
本当は定格を0.2Vくらい割れてるけど、光るからいいか。いい加減な。
実験に使用したソース
実験に使用したソースは以下の2ファイルです。同じディレクトリにならべておいてあります。
- 
- mbost4ml5b32a.go
- main.go
 
以下のソースは部品購入先の秋月電子通商殿の通販サイトにあるArduino用の「スケッチ」(C++コンパイラでコンパイルされる)をちらちら見ながら、Go言語に勝手移植してみたものです。
- 
- mbost4ml5b32a.go(LEDの制御信号生成用)
 
package main
import (
    "machine"
    "time"
)
var cHpin = machine.P16
var cLpin = machine.P0
func InitOST4ML5B32A() {
    cHpin.Configure(machine.PinConfig{Mode: machine.PinOutput})
    cLpin.Configure(machine.PinConfig{Mode: machine.PinOutput})
    cHpin.Low()
    cLpin.High()
    time.Sleep(10 * time.Millisecond)
}
func SetLED() {
    cHpin.Low()
    cLpin.High()
    time.Sleep(1000 * time.Millisecond)
}
func setHigh() {
    cHpin.High()
    cLpin.High()
    time.Sleep(1 * time.Microsecond)
    cHpin.Low()
    cLpin.High()
    time.Sleep(1 * time.Microsecond)
}
func setLow() {
    cHpin.Low()
    cLpin.Low()
    time.Sleep(1 * time.Microsecond)
    cHpin.Low()
    cLpin.High()
    time.Sleep(1 * time.Microsecond)
}
func setByte(arg byte) {
    var pos byte = 0x80
    for i := 0; i < 8; i++ {
        if (pos & arg) != 0 {
            setHigh()
        } else {
            setLow()
        }
        pos >>= 1
    }
}
func SetColor(r byte, g byte, b byte) {
    setByte(r)
    setByte(g)
    setByte(b)
}
- 
- main.go(メインプログラム)
 
package main
import (
    "fmt"
    "time"
)
func setLEDs(lmax int, r byte, g byte, b byte) {
    for i := 0; i < lmax; i++ {
        SetColor(r, g, b)
    }
    SetLED()
    time.Sleep(800 * time.Millisecond)
}
func main() {
    fmt.Printf("OST4ML5B32A Color LED test.\r\n")
    ledMax := 1
    InitOST4ML5B32A()
    for {
        setLEDs(ledMax, 0xf1, 1, 1)
        setLEDs(ledMax, 1, 0xf1, 1)
        setLEDs(ledMax, 1, 1, 0xf1)
    }
}
動作確認
まあ、動いとります。スペック的には0.2V割れているけれども。
