Raspberry PiでGPIO制御

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

コメントを残す

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

日本語が含まれない投稿は無視されますのでご注意ください。(スパム対策)