見出し画像

プログラマ探偵の事件簿: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番号)の説明を発見した。画像を引用すると

画像1

ポート番号(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の運営にも貢献できるのでよろしくお願います。