GoにいればGoに従え(35) P8/P9が動かなかった理由は端子破損? TinyGo

Joseph Halfmoon

前回HC-SR04超音波センサを動かしたときに「v2であれば使える筈の P8とP9 を使おうとしましたがダメでした」と書きました。前回はP0とP1を使って動かしたのですが、P8とP9で動かない理由が不明だったので今回はその原因を追究してみます。まさかの端子破損?いつ壊しちまったのか。トホホ。

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

※実機動作確認は Arm Cortex-M4FコアのNordic nRF52833チップ搭載、みんな大好き BBC micro:bit v2 機にTinyGoのオブジェクトを書き込んで行っています。

注意力は散漫、目は老眼の年寄デス。ちょくちょくピンを指し間違えて慌てふためいております。その割に壊れたことはそれほど多くないです(今年に入って2回目、もしかするともっと壊れているのに気が付いてないダケかもしれんけど。)

micro:bit v1/v2 カードエッジ端子の機能とピン割り当て

最初、P8/P9が動作しないのには理由があるのかと思って、micro:bitのカードエッジコネクタに出ている端子の機能と搭載マイコンの端子の表を作ってしまいました。折角作ったので掲載しておきます。

Edge欄はカードエッジ上の端子名です。v2はmicro:bit v2の場合の端子に割り当てられている特殊機能。v1.5はmicro:bit v1.5の場合の特殊機能です。機能欄がブランクの場合は単なるGPIOです。なおLEDと書かれている端子はオンボードのLEDマトリクスの点灯用に割り当てられている端子です。v1.5とv2でLEDの接続はまったくの別ものなのですが、カードエッジ端子的な見てくれとしてはv1.5とv2はほぼ一致してます。

ただし、マイコンチップの端子割り当て的には差異が大きいです。v1系のnRF51822とv2系のnRF52833の端子名を横に書き添えました。

TinyGoの場合、カードエッジ端子名でもマイコン端子名からでもプログラム可能みたいです。

Edge v2 v1.5 nRF52833(v2) nRF51822(v1)
P20 SDA SDA P1_00 P1_30
P19 SCL SCL P0_26 P0_00
P16 P1_02 P0_16
P15 MOSI MOSI P0_13 P0_21
P14 MISO MISO P0_01 P0_22
P13 SCK SCK P0_17 P0_23
P2 AIN AIN(10Mpullup) P0_04 P0_01
P12 (Reserved) (Reserved) P0_12 P0_20
P11 BUTTON B BUTTON B P0_23 P0_26
P10 LED LED P0_30 P0_06
P9 LED P0_09 P0_10
P8 P0_10 P0_18
P1 AIN AIN(10Mpullup) P0_03 P0_02
P7 LED LED P0_11 P0_11
P6 LED LED P1_05 P0_12
P5 BUTTON A BUTTON A P0_14 P0_17
P4 LED LED P0_28 P0_05
P0 AIN AIN(10Mpullup) P0_02 P0_03
P3 LED LED P0_32 P0_04

今回「問題になっている」P8/P9端子は、v2では単なるGPIO扱いで、特殊機能がアサインされていないので、何か接続の実験するというと好んで使って来た気がします。そのどこかでやっちまった可能性が高いっす。

やっちまった証拠

前回の超音波センサのプログラムを端子を変えて動かした結果が以下です。ソース中の端子をアサインする行に、成功すればOK、失敗すればNG、動作しているようにも見えるけれど値がダメダメな場合を??としてコメント化してます。なお端子名はカードエッジ端子名です。

//OK sensor := hcsr04.New(machine.P0, machine.P1)
//NG sensor := hcsr04.New(machine.P0, machine.P8)
//NG sensor := hcsr04.New(machine.P0, machine.P9)
//OK sensor := hcsr04.New(machine.P0, machine.P2)
//?? sensor := hcsr04.New(machine.P8, machine.P1)
//?? sensor := hcsr04.New(machine.P9, machine.P1)
//OK sensor := hcsr04.New(machine.P2, machine.P1)
//OK sensor := hcsr04.New(machine.P2, machine.P13)
//OK sensor := hcsr04.New(machine.P14, machine.P13)

上記をみれば明らかにP8、P9が絡むとヤバイです。他の端子では問題なく動いているような。

GPIO入力動作確認

正常に動いているように見えるP13と、異常なP8、P9を比べてみました。テストに使った回路が以下のようです。端子にスイッチ直結してます。TestInputDUT

テストに使ったTinyGoプログラムが以下に。

package main

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

func main() {
    P8 := machine.P8
    P9 := machine.P9
    P13 := machine.P13
    P8.Configure(machine.PinConfig{Mode: machine.PinInput})
    P9.Configure(machine.PinConfig{Mode: machine.PinInput})
    P13.Configure(machine.PinConfig{Mode: machine.PinInput})

    for {
        p8v := P8.Get()
        p9v := P9.Get()
        p13v := P13.Get()
        fmt.Printf("P8: %t P9: %t P13: %t \r\n", p8v, p9v, p13v)
        time.Sleep(time.Second * 2)
    }
}

P8、P9、P13の全てがTrueを受け取るようにスイッチ設定した場合の結果が以下に。P13true

P8、P9、P13の全てがFalseを受け取るようにスイッチ設定した場合の結果が以下に。

P13false

だめじゃん、P8とP9。

GPIO出力動作確認

同様に出力動作確認に使った回路が以下に。TestOutputDUT

確認用のTinyGoプログラムが以下に。

package main

import (
    "machine"
    "time"
)

func main() {
    P8 := machine.P8
    P9 := machine.P9
    P13 := machine.P13
    P8.Configure(machine.PinConfig{Mode: machine.PinOutput})
    P9.Configure(machine.PinConfig{Mode: machine.PinOutput})
    P13.Configure(machine.PinConfig{Mode: machine.PinOutput})

    for {
        P13.High()
        P8.High()
        P9.High()
        time.Sleep(time.Second * 1)
        P13.Low()
        P8.Low()
        P9.Low()
        time.Sleep(time.Second * 1)
    }
}

3端子がそろって点滅すれば出力試験成功ですが、点滅するのはP13端子のみでした。P8、P9はダメね。物皆何時かは壊れるとはいえトホホ。。。

GoにいればGoに従え(34) DevicesでHCSR04センサを動かす、TinyGo に戻る

GoにいればGoに従え(36) 吉例Lチカ、WindowsからラズパイPicoでTinyGo へ進む