GoにいればGoに従え(23) TinyGo、シリアル接続LED、micro:bit v2

Joseph Halfmoon

別シリーズにて数珠繋ぎに多数個シリアル接続可能なフルカラー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Ωへと調整しました。そしたらば青色も元気になった感じ。MB20_OST4ML5B32A_test_schematicUPD

 

本当は定格を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割れているけれども。

MB20_OST4ML5B32A

GoにいればGoに従え(22) TinyGo、SPI接続、micro:bit v2の場合 へ戻る

GoにいればGoに従え(24) TinyGo Driversを使ってNeoPixel接続 へ進む