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

Joseph Halfmoon

いつかは壁に当たると思っていましたが早かったです。TinyGoからmicro:bitのADCを使おうとするとエラーになります。ところが同じコードをmicro:bitでもv2をターゲットにすると通ります。TinyGoのmachineのソースをちらちら眺めてみると、どうもnRF51系のADCは未サポートっす。残念。

※「GoにいればGoに従え」Go関連記事の総Index

BBC micro:bitのサポート状況、勝手まとめ

以下の BBC micro:bitのdeveloper community様の

Hardware

のページを参照すると分かりますが、「似たような顔」をしているBBC micro:bitには4種のバージョンが存在することがわかります。

    • V2.2X
    • V2.0
    • V1.5
    • V1.3X

因みに「似たような顔」ですが、ボードをよくみると見分けることができます。手元に持っているのは、V2.0機とV1.5機です。そしてこのところTinyGoで実験してきたのは、古い方のV1.5機でした。まあ、TinyGoがmicro:bitを完璧にサポートしてはいないということは分かっていたので、そろりそろりと使ってきたわけです。今回ADC(アナログデジタル変換器)を使ってみようとしてとうとうV1.5がサポートされていないところを踏んづけてしまいました。

まとめるとこんな感じっす。

    • TinyGoの以下の machine パッケージのドキュメント上はADC関係の関数などがサポートされている。

Documentation / Reference / Microcontrollers / Machine package / microbit

ただし上記のページには micro:bitのバージョンの違いなどに対して言及はない。なお、TinyGoのtargetとして独立にサポートされている microbit と microbit-v2 に対して上記のページしかみあたらない。

    • TinyGoのmachineパッケージのソースをちらちら眺めるに nRF528xx系デバイス用のファイルにはADCを制御する関数類が定義されている
    • TinyGoのmachineパッケージのソースをちらちら眺めるに nRF51系デバイスに対してはADCを制御する関数類が見当たらない

そしてボードのバージョンとMCUの関係は以下のようです。

micro:bit version MCU
v1.x Nordic nRF51822
v2.x Nordic nRF52833

つまり、nRF52833搭載している micro:bit v2であればADC関係の関数がmachineパッケージ内に「見える」(ドキュメント通りに)けれども、micro:bit v1.xであればADC関係はmachineパッケージ内に不在、となる筈。

今回実験のコード

今回実験のコードは書きかけ途中のもので、実機に動かすものではありませぬ。ビルドしてエラーになるか否かを確かめただけのもの。

package main

import (
    "fmt"
    "machine"
    "time"
)

var drivepin1 = machine.P8
var drivepin2 = machine.P2
var drivepin3 = machine.P16

func initRingSensor() {
    drivepin1.Configure(machine.PinConfig{Mode: machine.PinOutput})
    drivepin1.High()
    drivepin2.Configure(machine.PinConfig{Mode: machine.PinOutput})
    drivepin2.High()
    drivepin3.Configure(machine.PinConfig{Mode: machine.PinOutput})
    drivepin3.High()
}

func main() {
    machine.InitADC()
    sensepin := machine.ADC{Pin: machine.P0}
    sensepin.Configure(machine.ADCConfig{})
    initRingSensor()

    for {
        val := sensepin.Get()
        fmt.Printf("%d\r\n", val)
        time.Sleep(time.Second * 5)
    }
}

まずは、以下のように v2 をターゲットにビルドかけてみます。

$ tinygo build -target microbit-v2

ビルド成功、ちゃんと .elfファイルが生成されておりますぞ。

さて、以下のようにターゲットを microbit (v1.x系向け)に切り替えてみます。

$ tinygo build -target microbit

すると、mbERROR

エラーを受領。

どうするかな~ もう少しv1.5機で「頑張り」たかったんだけれど。v2機に乗り換える?それともv1.5機で「危ない」方へ向かう?読むもの読んでなかったんで、少し考えます。

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

GoにいればGoに従え(10) TinyGo、micro:bit v2でのADC動作確認 へ進む