前回、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!してますな。あたりまえか。