プログラマ探偵の事件簿:Raspberry Piのポート番号の謎
いろいろな環境(ハードウェアやソフトウェア)に対応できるライブラリ(パッケージ)は良いことも多いが、ライブラリ毎の独自の定義が時にはプログラマーを混乱に陥れることがある。今回は、Raspberry PiのGPIOのポート番号の謎を助手の猫と共に解いた事件の話である。
事件の始まり
Raspberry PiにLEDを接続して点滅させるプログラムをGO言語で作っていた時の話である。
のようなプログラムである。助手の猫は水を飲みながら考えているはずである。決して水を飛ばして私の実験を邪魔しているわけではない。
で公開されているC言語のサンプルプログラムは問題なくLEDを点滅させた。
GO言語でもこのくらい簡単に動くだろうと、
と
のサンプルを試してみた。
何ということか、どちらも点滅しない!
助手の猫が「触ってないよ!」と言っている。怪しいがC言語版は点滅するので配線を壊してないようだ。
コメントにヒントがあった
GO言語のサンプルに
var (
// Use mcu pin 10, corresponds to physical pin 19 on the pi
pin = rpio.Pin(10)
)
のコメントがあった。C言語のサンプルは、
#define ledPin 0 //define the led pin number
だったので、GO言語でもpin = rpio.Pin(0)に変えてみたが変わらない。
そもそも mcu pin、physical pinとは何?
そこで、すかさず助手の猫が「ちゃんと調べろ!」
ポート番号の考えはライブラリで違う
Raspberry PiのGPIOのポート番号について学習キットのマニュアルなどを調べると、
にポート番号(PIN番号)の説明を発見した。画像を引用すると
ポート番号(PIN番号)には、WiringPi Pi, BMC(mcu pin)、Header(physical pin)があることがわかった。
C言語版で使っているライブラリ
では、WiringPi Piの番号を使う。
GO言語のパッケージ
では、BCM Pinを使う。
GO言語のプログラムを
pin = rpio.Pin(17)
のように変更すると、あっけなくLEDの点滅を開始した。
gobotの方は、もう少し複雑だった。このパッケージは、Raspberry Pi以外にも対応しているのでポート番号(PIN番号)が汎用的になっているようで、
のように、gobotの世界のポート番号からBMC PIN番号へ変換している。
"11": {
"*": 17,
},
の行から逆算して、
led := gpio.NewLedDriver(r, "11")
のようにポート番号を11にすることでLEDが点滅した。
この事件を振り返って
汎用性とか共通化はプログラムがとても好きなことであるが、その結果シンプルなことが難しくなることのあるように思う。
猫は、シンプルに机の上の水が新鮮だと思っているようだ。
開発のための諸経費(機材、Appleの開発者、サーバー運用)に利用します。 ソフトウェアのマニュアルをnoteの記事で提供しています。 サポートによりnoteの運営にも貢献できるのでよろしくお願います。