RaspberryPiのGPIOを利用した電子工作学習
数年前に購入して、そのまま放置してしまっていた、RaspberryPi B3 と、電子工作キットを使ってプログラミング学習をしていきたいと思います。 今回は、外部装置とデジタル信号のやり取りを行う GPIO について解説します。
GPIO について
GPIO(General Purpose Input/Output)は、デジタル信号を入力にも出力にも使える汎用 I/O ポートで、設定によって様々なデバイスやセンサーの制御、信号の送受信に利用することができます。
RaspberryPi の GPIO ポートの構成について
RaspberryPi に基板上に 40 本のピンヘッダがあり、その端子に配線することで GPIO を使用することができます。
RaspberryPi の GPIO
GPIO の制御方法
仮想ファイルシステムで制御
Raspberry Pi では仮想ディレクトリ/sys/class/gpio を通して GPIO にアクセス出来ます。 仮想ファイルシステムを読み書きして制御するようになっています。
/sys/class/gpio/export
仮想ファイル「/sys/class/gpio/export」にポート番号を書き込むと「/sys/class/gpio」内に"gpio"にポート番号が付いた仮想ディレクトリが作成されます。
$ echo ポート番号 > /sys/class/gpio/export
例えば、仮想ファイル「/sys/class/gpio/export」にポート番号"2"書き込むと、「/sys/class/gpio/」内に「gpio2」という仮想ディレクトリが作成されます。
この仮想ディレクトリ内に GPIO の入出力方向を設定する仮想ファイル「direction」と、入出力値を読み書きする仮想ファイル「value」が作成されます。
/sys/class/gpio/gpio2/direction
/sys/class/gpio/gpio2/value
仮想ファイル「/sys/class/gpio/gpio2/direction」に"out"を書き込むと出力、"in"を書き込むと入力になります。
$ echo 入出力方向 > /sys/class/gpio/gpio2/direction
ポート GPIO2 を出力に設定した場合は以下のコマンドで仮想ファイル/sys/class/gpio/gpio2/value に出力値を書くと、その値が GPIO2 に出力されます。
$ echo 出力値 > /sys/class/gpio/gpio2/value
ポート GPIO2 を入力に設定した場合、以下のコマンドで仮想ファイル/sys/class/gpio/gpio2/value から GPIO2 の入力値を取得することが出来ます。
$ echo /sys/class/gpio/gpio2/value
プログラムからのアクセス(C 言語)
C 言語で仮想ファイルシステムで GPIO を制御して、LED 点灯 ⇒ 消灯するプログラムの例です。
#include <fcntl.h>
#include <unistd.h>
int main (void)
{
int fd;
fd = open("/sys/class/gpio/export", O_RDWR);
write(fd, "17", 2);
close(fd);
sleep(1);
fd = open("/sys/class/gpio/gpio2/direction", O_RDWR);
write(fd, "out", 3);
close(fd);
fd = open("/sys/class/gpio/gpio2/value", O_RDWR);
write(fd, "1", 1);
close(fd);
sleep(2);
fd = open("/sys/class/gpio/gpio2/value", O_RDWR);
write(fd, "0", 1);
close(fd);
fd = open("/sys/class/gpio/unexport", O_RDWR);
write(fd, "17", 2);
close(fd);
return 0;
}
ライブラリで制御
プログラムからのアクセス(Python)
Python で GPIO を制御するためのライブラリとして、RPi.GPIO、gpiozero がよく使われています。
RPi.GPIO
- Raspberry Pi の GPIO ピンを制御するための低レベルライブラリ
- より細かい制御が可能で、高度な設定や特定のハードウェアの制御に適している
Python で RPi.GPIO を使用して、LED 点灯 ⇒ 消灯するプログラムの例です。
import RPi.GPIO as GPIO
import time
GPIO_PORT=17
GPIO.setmode(GPIO.BCM)
GPIO.setup(GPIO_PORT, GPIO.OUT, initial=GPIO.LOW)
GPIO.output(GPIO_PORT, 1)
time.sleep(2)
GPIO.output(GPIO_PORT, 0)
GPIO.cleanup()
gpiozero
- 初心者向けに設計された、より高レベルな GPIO ライブラリ
- LED やボタンなどの一般的なデバイスを簡単に制御するためのクラスや関数を提供
- 自動的にプルアップ抵抗を設定するなど、使いやすさに重点を置いています
Python で gpiozero を使用して、LED 点灯 ⇒ 消灯するプログラムの例です。
from gpiozero import LED
import time
GPIO_PORT=17
led = LED(GPIO_PORT)
led.on()
time.sleep(2)
led.off()
以上、GPIO とその制御方法(の一部分ですが)について紹介いたしました。
次回は、実際に電子工作キットを使用して、プログラミング学習していきたいと思います。