Raspberry Piの GPIO についてちょっと気になったことがあったので色々試してみた。
Raspberry Piの GPIO2 と GPIO3 は物理的にプルアップされているそうだ。これは実物を見れば抵抗につながっているのが確認できる。その他のピンは「プルアップされている」とか「プルダウンされている」とか、よくわからない。
とりあえずうちにある Raspberry Pi 3 のうちの Element14 番で試してみる。
まず最初に /sys/class/gpio
の初期状態。
$ ls -l /sys/class/gpio
total 0
--w------- 1 root root 4096 Jan 7 00:01 export
lrwxrwxrwx 1 root root 0 Dec 10 10:11 gpiochip0 -> ../../devices/platform/soc/3f200000.gpio/gpio/gpiochip0
lrwxrwxrwx 1 root root 0 Dec 10 10:11 gpiochip100 -> ../../devices/platform/soc/soc:virtgpio/gpio/gpiochip100
--w------- 1 root root 4096 Jan 7 00:01 unexport
一気に書き込むとエラーになるので sleep 2
を入れつつ徐々に有効にする。
$ for f in {4..27}; do echo $f >/sys/class/gpio/export; sleep 2; done
GPIO4 から GPIO27 までが使えるようになった。
$ ls -l /sys/class/gpio
total 0
--w------- 1 root root 4096 Jan 7 00:04 export
lrwxrwxrwx 1 root root 0 Jan 7 00:04 gpio10 -> ../../devices/platform/soc/3f200000.gpio/gpio/gpio10
lrwxrwxrwx 1 root root 0 Jan 7 00:04 gpio11 -> ../../devices/platform/soc/3f200000.gpio/gpio/gpio11
lrwxrwxrwx 1 root root 0 Jan 7 00:04 gpio12 -> ../../devices/platform/soc/3f200000.gpio/gpio/gpio12
lrwxrwxrwx 1 root root 0 Jan 7 00:04 gpio13 -> ../../devices/platform/soc/3f200000.gpio/gpio/gpio13
lrwxrwxrwx 1 root root 0 Jan 7 00:04 gpio14 -> ../../devices/platform/soc/3f200000.gpio/gpio/gpio14
lrwxrwxrwx 1 root root 0 Jan 7 00:04 gpio15 -> ../../devices/platform/soc/3f200000.gpio/gpio/gpio15
lrwxrwxrwx 1 root root 0 Jan 7 00:04 gpio16 -> ../../devices/platform/soc/3f200000.gpio/gpio/gpio16
lrwxrwxrwx 1 root root 0 Jan 7 00:04 gpio17 -> ../../devices/platform/soc/3f200000.gpio/gpio/gpio17
lrwxrwxrwx 1 root root 0 Jan 7 00:04 gpio18 -> ../../devices/platform/soc/3f200000.gpio/gpio/gpio18
lrwxrwxrwx 1 root root 0 Jan 7 00:04 gpio19 -> ../../devices/platform/soc/3f200000.gpio/gpio/gpio19
lrwxrwxrwx 1 root root 0 Jan 7 00:04 gpio20 -> ../../devices/platform/soc/3f200000.gpio/gpio/gpio20
lrwxrwxrwx 1 root root 0 Jan 7 00:04 gpio21 -> ../../devices/platform/soc/3f200000.gpio/gpio/gpio21
lrwxrwxrwx 1 root root 0 Jan 7 00:04 gpio22 -> ../../devices/platform/soc/3f200000.gpio/gpio/gpio22
lrwxrwxrwx 1 root root 0 Jan 7 00:04 gpio23 -> ../../devices/platform/soc/3f200000.gpio/gpio/gpio23
lrwxrwxrwx 1 root root 0 Jan 7 00:04 gpio24 -> ../../devices/platform/soc/3f200000.gpio/gpio/gpio24
lrwxrwxrwx 1 root root 0 Jan 7 00:04 gpio25 -> ../../devices/platform/soc/3f200000.gpio/gpio/gpio25
lrwxrwxrwx 1 root root 0 Jan 7 00:05 gpio26 -> ../../devices/platform/soc/3f200000.gpio/gpio/gpio26
lrwxrwxrwx 1 root root 0 Jan 7 00:05 gpio27 -> ../../devices/platform/soc/3f200000.gpio/gpio/gpio27
lrwxrwxrwx 1 root root 0 Jan 7 00:04 gpio4 -> ../../devices/platform/soc/3f200000.gpio/gpio/gpio4
lrwxrwxrwx 1 root root 0 Jan 7 00:04 gpio5 -> ../../devices/platform/soc/3f200000.gpio/gpio/gpio5
lrwxrwxrwx 1 root root 0 Jan 7 00:04 gpio6 -> ../../devices/platform/soc/3f200000.gpio/gpio/gpio6
lrwxrwxrwx 1 root root 0 Jan 7 00:04 gpio7 -> ../../devices/platform/soc/3f200000.gpio/gpio/gpio7
lrwxrwxrwx 1 root root 0 Jan 7 00:04 gpio8 -> ../../devices/platform/soc/3f200000.gpio/gpio/gpio8
lrwxrwxrwx 1 root root 0 Jan 7 00:04 gpio9 -> ../../devices/platform/soc/3f200000.gpio/gpio/gpio9
lrwxrwxrwx 1 root root 0 Dec 10 10:11 gpiochip0 -> ../../devices/platform/soc/3f200000.gpio/gpio/gpiochip0
lrwxrwxrwx 1 root root 0 Dec 10 10:11 gpiochip100 -> ../../devices/platform/soc/soc:virtgpio/gpio/gpiochip100
--w------- 1 root root 4096 Jan 7 00:01 unexport
この状態で各ピンのモードと値を取ってみたところ、モードはすべて in
。値は一部のピンはプルダウンされていないのか、1
になっていた。ちなみに /sys/class/gpio/unexport
してやり直しても direction
と value
の値は同じだった。このことを考えると入力として使うのに向いたピンとそうでないピンがあるのだろうか。
$ for f in {4..27}; do printf '%2s %3s %s\n' $f `cat /sys/class/gpio/gpio$f/direction` `cat /sys/class/gpio/gpio$f/value`; done
4 in 1
5 in 1
6 in 1
7 in 1
8 in 1
9 in 0
10 in 0
11 in 0
12 in 0
13 in 0
14 in 0
15 in 1
16 in 0
17 in 0
18 in 0
19 in 0
20 in 0
21 in 0
22 in 0
23 in 0
24 in 0
25 in 0
26 in 0
27 in 0
今度はすべてのピンを out
にしてみる。値はすべて 0
になった。
$ for f in {4..27}; do echo out >/sys/class/gpio/gpio$f/direction; sleep .5; done
$ for f in {4..27}; do printf '%2s %3s %s\n' $f `cat /sys/class/gpio/gpio$f/direction` `cat /sys/class/gpio/gpio$f/value`; done
4 out 0
5 out 0
6 out 0
7 out 0
8 out 0
9 out 0
10 out 0
11 out 0
12 out 0
13 out 0
14 out 0
15 out 0
16 out 0
17 out 0
18 out 0
19 out 0
20 out 0
21 out 0
22 out 0
23 out 0
24 out 0
25 out 0
26 out 0
27 out 0
direction
の設定は in
と out
だと思っていたのだが、ネットを徘徊していたときにちらっと high
というワードを見かけたので一旦 in
に戻した後、high
にしてみたら驚いた。すべて綺麗に 1
。echo out >/sys/class/gpio/gpioX/direction
と echo high >/sys/class/gpio/gpioX/direction
は別物のようだ。
$ for f in {4..27}; do echo in >/sys/class/gpio/gpio$f/direction; sleep .5; done
$ for f in {4..27}; do echo high >/sys/class/gpio/gpio$f/direction; sleep .5; done
$ for f in {4..27}; do printf '%2s %3s %s\n' $f `cat /sys/class/gpio/gpio$f/direction` `cat /sys/class/gpio/gpio$f/value`; done
4 out 1
5 out 1
6 out 1
7 out 1
8 out 1
9 out 1
10 out 1
11 out 1
12 out 1
13 out 1
14 out 1
15 out 1
16 out 1
17 out 1
18 out 1
19 out 1
20 out 1
21 out 1
22 out 1
23 out 1
24 out 1
25 out 1
26 out 1
27 out 1
high
があるなら low
もあるんだろうということでやってみたら今度は out
だけど値は 0
になった。
$ for f in {4..27}; do echo in >/sys/class/gpio/gpio$f/direction; sleep .5; done
$ for f in {4..27}; do echo low >/sys/class/gpio/gpio$f/direction; sleep .5; done
$ for f in {4..27}; do printf '%2s %3s %s\n' $f `cat /sys/class/gpio/gpio$f/direction` `cat /sys/class/gpio/gpio$f/value`; done
4 out 0
5 out 0
6 out 0
7 out 0
8 out 0
9 out 0
10 out 0
11 out 0
12 out 0
13 out 0
14 out 0
15 out 0
16 out 0
17 out 0
18 out 0
19 out 0
20 out 0
21 out 0
22 out 0
23 out 0
24 out 0
25 out 0
26 out 0
27 out 0
以前、エアコンの信号を夜に取るのに赤外線受光モジュールの足を15番に繋いだような繋いでないような。ものすごく不安定でまともに信号を読み取れなかったのだが、何か関係しているのだろうか。(この時は充電最適化機能付きの電源を使っているのが問題だったのだが)
とりあえずボタン入力とかは 4/5/6/7/8/15 を避けた方が安定しそうだ。
時間ができたら UK 版と JP 版の Raspberry Pi 3、それから Zero でも調べてみよう。入力で初期値を決めるワードってなんだろうか。あと OS とか Raspberry Piのバージョンでも違うんだろうか。
そういえばよく見たら17番ピンの3.3Vにちゃんと抵抗ついてた。これを目印にすれば3.3Vの取り出しは間違え無さそうだ。