【電子工作】sysfsでGPIOを操作してLEDを光らせる(Raspberry Pi 4で遊ぼう日記 その5)

投稿日:2022年4月27日
最終更新日:2022年4月28日


 

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

 

日記まとめ

ラズパイで遊んでみた軌跡を以下でまとめてます。

【電子工作】Raspberry Pi 4で遊ぼう日記 まとめ


投稿者: wakky

映画と旅行が大好きなエンジニア。お酒、ゲーム、読書も好き。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください