
前回、TinyGoからみたmicro:bitのI2Cインタフェース関数の挙動を確認。今回は外部デバイスを接続してみます。まずはAQM1602LCD表示器(秋月電子製)を接続します。16文字x2行の文字表示ができるもの。以前にもmicro:bitに接続してますがそのときはMakeCode(JavaScript)でした。
※「GoにいればGoに従え」Go関連記事の総Index
AQM1602とBBC micro:bitの接続
2年近く前、以下の別シリーズ記事にて BBC micro:bit とAQM1602ディスプレイ(秋月製)の接続はやってみています。たかだか16文字x2行ですが、文字表示が自由にできるといろいろお楽。
ブロックを積みながら(28) BBC micro:bit、外付けLCDをI2C接続
ただし、上記記事では BBC micro:bit らしく、「ブロックを積んでいく」MakeCodeエディタを使っての実験でした。裏で動いているコードはJavaScriptです。
念のため、BBC micro:bit にAQM1602を接続する場合の回路が以下に。多分micro:bitボードの内部でSCLとSDAはプルアップされているのではないかと思ったのですが、念のため「弱め」10kΩで外でもプルアップしてます。
実験に使用したGoプログラム
上記の過去記事の中には、MakeCodeの「ビジュアル言語」のプログラムだけでなく、その裏側にあるJavaScriptのコードも掲げておりました。動作時にはJavaScriptコードを「コンパイル」して得られた実行コードがmicro:bit上で走っていた筈。今回は、その「自動生成」JavaScriptコードを参照しながら、Goのコードに置き換えてみました。ただし、元のコードは無限ループで表示しつづけますが、今回の表示は1回だけ。
実験に使用したGoのソースが以下に。
package main
import (
"machine"
"time"
)
const AQM1602 = 0x3E
var i2c = machine.I2C0
func writeAQM1602Data(dat byte) {
i2c.WriteRegister(AQM1602, 0x40, []byte{dat})
time.Sleep(1 * time.Millisecond)
}
func writeAQM1602Command(cmd byte) {
i2c.WriteRegister(AQM1602, 0x00, []byte{cmd})
time.Sleep(20 * time.Millisecond)
}
func initAQM1602() {
time.Sleep(100 * time.Millisecond)
writeAQM1602Command(0x38)
writeAQM1602Command(0x39)
writeAQM1602Command(0x14)
writeAQM1602Command(0x73)
writeAQM1602Command(0x56)
writeAQM1602Command(0x6C)
writeAQM1602Command(0x38)
writeAQM1602Command(0x01)
writeAQM1602Command(0x0C)
}
func main() {
i2c.Configure(machine.I2CConfig{
Frequency: machine.TWI_FREQ_100KHZ,
SCL: machine.SCL_PIN,
SDA: machine.SDA_PIN,
})
initAQM1602()
writeAQM1602Command(1)
writeAQM1602Command(0)
var msg []byte = []byte("Hello world!")
for i := 0; i < len(msg); i++ {
writeAQM1602Data(msg[i])
}
}
実験結果
実機Flashにオブジェクトを書き込み、動作させたところが以下に。
LCDにHello world!してますな。あたりまえか。