Raspberry PiでGPIOの制御を試してみました。
ハードウェアとしてはGPIOの23/24/25にアノードコモンのRGBのLEDを接続し、GPIOの17/22に3.3V-1.8kΩでプルアップしたタクトスイッチを接続しました。アノードコモンのLEDなのでLow(0)出力で点灯、プルアップしたタクトスイッチなのでスイッチ押下でLow(0)になります。
まずは、rootで動作を確認していきます。
pi@raspberrypi ~ $ sudo bash root@raspberrypi:/home/pi# echo "23" > /sys/class/gpio/export root@raspberrypi:/home/pi# echo "24" > /sys/class/gpio/export root@raspberrypi:/home/pi# echo "25" > /sys/class/gpio/export root@raspberrypi:/home/pi# echo "out" > /sys/class/gpio/gpio23/direction root@raspberrypi:/home/pi# echo "out" > /sys/class/gpio/gpio24/direction root@raspberrypi:/home/pi# echo "out" > /sys/class/gpio/gpio25/direction root@raspberrypi:/home/pi# echo 1 > /sys/class/gpio/gpio23/value root@raspberrypi:/home/pi# echo 1 > /sys/class/gpio/gpio24/value root@raspberrypi:/home/pi# echo 1 > /sys/class/gpio/gpio25/value root@raspberrypi:/home/pi# echo 0 > /sys/class/gpio/gpio23/value root@raspberrypi:/home/pi# echo 0 > /sys/class/gpio/gpio24/value root@raspberrypi:/home/pi# echo 0 > /sys/class/gpio/gpio25/value root@raspberrypi:/home/pi# echo 1 > /sys/class/gpio/gpio25/value root@raspberrypi:/home/pi# echo 0 > /sys/class/gpio/gpio25/value root@raspberrypi:/home/pi# echo "17" > /sys/class/gpio/export root@raspberrypi:/home/pi# echo "22" > /sys/class/gpio/export root@raspberrypi:/home/pi# cat /sys/class/gpio/gpio17/value 1 root@raspberrypi:/home/pi# cat /sys/class/gpio/gpio17/value 0 root@raspberrypi:/home/pi# cat /sys/class/gpio/gpio22/value 1 root@raspberrypi:/home/pi# cat /sys/class/gpio/gpio22/value 0 root@raspberrypi:/home/pi#
まず、
echo "XX" > /sys/class/gpio/export
で当該のGPIOの制御を可能にします。これによって、/sys/class/gpio/gpioXX ディレクトリが出現するようです。
root@raspberrypi:/home/pi# echo "out" > /sys/class/gpio/gpioXX/direction
で入出力の切り替え(出力モードに変更)です。デフォルトがL出力のようなので、これでLEDが点灯します。
root@raspberrypi:/home/pi# echo 1 > /sys/class/gpio/gpioXX/value root@raspberrypi:/home/pi# echo 0 > /sys/class/gpio/gpioXX/value
でLEDの点灯消灯を制御します。
入力ポートの方は、
root@raspberrypi:/home/pi# cat /sys/class/gpio/gpio17/value 0
で値が読めるようです。
このままでは扱いにくいので、/etc/init.d/gpio というファイル名で、以下の内容を作成しました。
(作成にあたってはこちらのサイト(ttanimu engineering labsさん)を参考にさせていただきました。)
#!/bin/sh ### BEGIN INIT INFO # Provides: gpio # Required-Start: # Required-Stop: # Default-Start: 2 3 4 5 # Default-Stop: # Short-Description: Init GPIO ### END INIT INFO case $1 in start) echo "17" > /sys/class/gpio/export echo "22" > /sys/class/gpio/export echo "23" > /sys/class/gpio/export echo "24" > /sys/class/gpio/export echo "25" > /sys/class/gpio/export echo "out" > /sys/class/gpio/gpio23/direction echo 1 > /sys/class/gpio/gpio23/value echo "out" > /sys/class/gpio/gpio24/direction echo 1 > /sys/class/gpio/gpio24/value echo "out" > /sys/class/gpio/gpio25/direction echo 1 > /sys/class/gpio/gpio25/value chmod 666 /sys/class/gpio/gpio17/value chmod 666 /sys/class/gpio/gpio22/value chmod 666 /sys/class/gpio/gpio23/value chmod 666 /sys/class/gpio/gpio24/value chmod 666 /sys/class/gpio/gpio25/value ;; stop) echo "17" > /sys/class/gpio/unexport echo "22" > /sys/class/gpio/unexport echo "23" > /sys/class/gpio/unexport echo "24" > /sys/class/gpio/unexport echo "25" > /sys/class/gpio/unexport ;; *) echo "Usage: $0 {start|stop}" exit 2 ;; esac
これを
# chmod 755 /etc/init.d/gpio # /etc/init.d/gpio start # update-rc.d gpio defaults
として、起動時に初期化するようにします。これで起動後には
pi@raspberrypi ~ $ echo 0 > /sys/class/gpio/gpio25/value pi@raspberrypi ~ $ echo 0 > /sys/class/gpio/gpio24/value pi@raspberrypi ~ $ echo 0 > /sys/class/gpio/gpio23/value
とすればLEDが点灯するようになりました。