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