
別シリーズにて数珠繋ぎに多数個シリアル接続可能なフルカラー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割れているけれども。
