人気ブログランキング | 話題のタグを見る

GPIO の仮想ファイルシステム

gpio の man page を読んでいたら、/sys/class/gpio/ というのが出てきた。よくわからなかったのでググったら次の解説記事を見つけた。

ツール・ラボ Raspberry Pi の GPIO 制御方法を確認する。(GPIO 制御編その1)

そこでこの記事を読んで動作確認しようと思った。あいにく Raspberry 3 B+ はサーバーにしてしまったので、SSH でログインした。GPIO に電子部品を繋がず、今回は gpio readall で動作確認することにした。(おまけに、この記事は Windows 10 のコマンドプロンプトから SSH でログインして動作確認している。)

pi@raspberrypi:~ $ gpio readall
 |  17 |   0 | GPIO. 0 |   IN | 0 | 11 || 12 | 0 | IN   | GPIO. 1 | 1   | 18  |
これで BCM の 18 番ピンはモードが IN で値が 0 であることが分かる。

Raspbian では GPIO への値の書き込みや読み込みは、仮想ファイルシステムに対して行う。それらは /sys/class/gpio/ ディレクトリ以下に置いてある。例えば GPIO の BCM ピン番号の 18 番ピンのビットを立てるには、echo コマンドを使って 1 を仮想ファイル /sys/class/gpio/gpio/value ファイルに書き込む。

pi@raspberrypi:~ $ echo 1 > /sys/class/gpio/gpio18/value

ただし、18 番ピンは最初は使えるようになっていないので gpio18 ディレクトリは存在しない。

pi@raspberrypi:~ $ ls /sys/class/gpio/
export  gpiochip0  gpiochip504  unexport

そこで、/sys/class/gpio/export ファイルに BCM 18 番ピンを export することで 18 番ピンを使えるようにする。

pi@raspberrypi:~ $ sudo echo 18 > /sys/class/gpio/export
pi@raspberrypi:~ $ ls /sys/class/gpio
export  gpio18  gpiochip0  gpiochip504  unexport

gpio18 ディレクトリが出現し、18 番ピンが使えるようになった。gpio18 ディレクトリの中を見ると次のようになっている。

pi@raspberrypi:~ $ ls /sys/class/gpio/gpio18
active_low  device  direction  edge  power  subsystem  uevent  value

そこで次にすることは、/sys/class/gpio/gpio18/direction ファイルに out を書き込むことで 18 番ピンのモードを OUT にすることだ。

pi@raspberrypi:~ $ sudo echo out > /sys/class/gpio/gpio18/direction

gpio readall で確認すると確かに BCM 18 番ピンのモードが OUT になっている。

pi@raspberrypi:~ $ gpio readall
 |  17 |   0 | GPIO. 0 |   IN | 0 | 11 || 12 | 0 | OUT  | GPIO. 1 | 1   | 18  |

これでやっと 18 番ピンのビットを操作できるようになった。

pi@raspberrypi:~ $ echo 1 > /sys/class/gpio/gpio18/value
 |  17 |   0 | GPIO. 0 |   IN | 0 | 11 || 12 | 1 | OUT  | GPIO. 1 | 1   | 18  |

GPIO の使用が終了したら、18番ピンを unexport して GPIO をリセットしておく。

pi@raspberrypi:~ $ sudo echo 18 > /sys/class/gpio/unexport
pi@raspberrypi:~ $ ls /sys/class/gpio
export  gpiochip0  gpiochip504  unexport

手動で GPIO を操作すると煩雑だが、Wireing Pi のライブラリやそのフロントエンドの gpio を使えばもっと楽にできる。

これで gpio のマニュアルページの export や unexport や /sys/class/gpio の意味が分かった。


by tnomura9 | 2019-12-12 22:54 | Raspberry Pi | Comments(0)
<< Raspberry Pi 4B... ラズベリー・パイの居場所 >>