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が点灯するようになりました。
