前回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を比べてみました。テストに使った回路が以下のようです。端子にスイッチ直結してます。
テストに使った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を受け取るようにスイッチ設定した場合の結果が以下に。
P8、P9、P13の全てがFalseを受け取るようにスイッチ設定した場合の結果が以下に。
だめじゃん、P8とP9。
GPIO出力動作確認
確認用の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はダメね。物皆何時かは壊れるとはいえトホホ。。。