LinuxのsysfsでGPIOを操作する
セットアップにさんざん時間を使ってしまったが、やっとラズベリーパイで遊ぼう的な内容に入れそう。今回は手始めにRaspberry Pi 4 Model BのGPIOピンの出力を操作して、LEDを光らせてみたいと思う。GPIOピンを制御する、といっても
- ラズパイのSoC(Broadcom BCM2711)のレジスタ値を直接書き換えて操作する
- Linuxのsysfsでファイルアクセスして操作する
- WiringPi、RPi.GPIO、pigpioなどのライブラリを使う
などやり方は色々ある。
なるべくハードウェアに近い低レイヤーから触ってみたいな~とは思いつつも、SoCのレジスタ値を書き換えるのは結構手間がかかりそうなので、まず今回はsysfsの機能を使ってGPIOを操作してLEDを光らせてみたい。
ちなみにラズパイと一緒にジャンパー線や抵抗、LEDやスイッチ、各種センサーなどが入った以下のキットも一緒に買っていたので、今回はこのセットを使ってブレッドボード上に回路を組んだ。
実行環境
Raspberry Pi 4 Model B
Raspberry Pi OS (Bullseye)
ブレッドボードに回路をつくる
今回は以下のように回路をつくった。非常にベタな回路なので詳細は説明しないが、LEDと抵抗をラズベリーパイの35pin(GPIO 19)と39pin(GND)に接続した。抵抗値は330Ωを使用。ラズベリーパイを起動した状態で回路を誤接続したりすると故障の原因になるので、ラズベリーパイは電源を切った状態で作業を行う。
実際につないでみたのが以下の図。
LEDは極性があるので、アノード(GPIO 19側)とカソード(GND側)の方向を間違えないように注意。一般的に砲弾型LEDでは、足が長い&LED内の電極が小さいほうがアノードで、足が短い&LED内の電極が大きい方がカソードとなる。
sysfsの機能でGPIOを操作する
Linuxにはsysfsという仮想的なファイルシステムがあり、ファイルの内容を書き換えるなどしてデバイスを制御することができる。Raspberry Pi OSもLinuxなのでこの仕組みは入っている。
Raspbery Pi OSでは/sys/class/gpioディレクトリ以下のファイル操作によってGPIOを操作することができる。試しにlsコマンドで/sys/class/gpioディレクトリ内のファイルを確認すると、以下のようになっている。
$ ls /sys/class/gpio/ export gpiochip0 gpiochip504 unexport
このディレクトリでファイル操作をすることで、GPIOを制御する。
操作したいGPIOピンを有効化する
GPIOピンを操作するには、まず使用したいGPIOピンを以下のコマンドで有効化してやる。今回の場合はLEDをGPIO19ピンに接続しているので、19を指定している。
$ sudo echo 19 > /sys/class/gpio/export
有効化したあとに/sys/class/gpio/の中をみてみると、以下のようにgpio19ディレクトリが追加されていることがわかる。これでgpio19を操作できるようになった。
$ ls /sys/class/gpio/ export gpio19 gpiochip0 gpiochip504 unexport
GPIOの方向(in/out)を変更する
ここでgpio19の中身をみてみると以下のようなファイル構成になっているので、GPIOのin/outを切り替える時はdirectionファイルを操作する。
$ ls /sys/class/gpio/gpio19 active_low device direction edge power subsystem uevent value
試しにdirectionファイルの中身をみてみると、デフォルトではGPIOの方向がinになっている。
$ cat /sys/class/gpio/gpio19/direction in
LEDを光らせるならGPIOピンから電圧を出力する必要があるので、これを以下のコマンドで書き換えればoutに設定できる。catコマンドで中身を確認すると、outに切り替わっていることがわかる。
$ sudo echo out > /sys/class/gpio/gpio19/direction $ cat /sys/class/gpio/gpio19/direction out
GPIOのHIGH/LOWを変更する
GPIOの出力値を変えるときはvalueファイルを操作する。デフォルトでは以下のように0になっている。つまり電圧がLOWになっている状態なので、LEDは光らない。
$ cat /sys/class/gpio/gpio19/value 0
これを1に変えることで電圧がHIGHになりLEDが光る。ということで以下のコマンドを実行する。
$ sudo echo 1 > /sys/class/gpio/gpio19/value
すると・・・光った!
これで目的は達成。
GPIOピンを無効化する
GPIOピンを使い終わったら、以下のコマンドでGPIOピンを無効化しておく。
$ sudo echo 19 > /sys/class/gpio/unexport
gpioディレクトリの中をみてみると、gpio19ディレクトリが無くなっており無効化されていることがわかる。
$ ls /sys/class/gpio/ export gpiochip0 gpiochip504 unexport
といことでsysfs機能を使ってGPIOを操作してLEDを光らせることができた。ただ、PythonやCのプログラムでGPIOを制御する場合には、WiringPi、RPi.GPIO、pigpioなどのライブラリを使ってGPIOを操作するケースが多いと思う。
次回は何かしらのライブラリを使ってもう少し簡単にGPIOを操作してみる。
参考文献
GPIOを操作するコマンドは以下を参考にさせて頂きましたm(_ _)m
Raspberry Pi で Sysfs を使って LED をチカらせる | CUBE SUGAR STORAGE
日記まとめ
ラズパイで遊んでみた軌跡を以下でまとめてます。