GoにいればGoに従え(8) TinyGoでmicro:bitにAQM1602をI2C接続

Joseph Halfmoon

前回、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Ωで外でもプルアップしてます。mbAQM1602schematic

実験に使用した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にオブジェクトを書き込み、動作させたところが以下に。mbAQM1602DUT

LCDにHello world!してますな。あたりまえか。

GoにいればGoに従え(7) TinyGoのmicro:bit向けI2C関数の挙動を観察 へ戻る

GoにいればGoに従え(9) TinyGo、micro:bitでは不在、v2では使えるAD へ進む