クリスマスなのでラズパイとRubyを使ってイルミネーションを作りました
完成イメージ
作り方
ラズパイのGPIOとRubyを使ってLEDの制御をしていきます
準備編
pinout
というコマンドを使ってどこのピンが何ていう名前なのか確認出来ます
このコマンドで出てきたGPIO + 数字というピンのところに接続するとラズパイから入出力の制御を行えます。今回はT型GPIO拡張ボードとブレッドボードを使っているのでラズパイから一本一本ピンを接続することはしていませんがイメージはおんなじ感じかと思います
pi@raspberrypi:~$ pinout
~省略~
J8:
3V3 (1) (2) 5V
GPIO2 (3) (4) 5V
GPIO3 (5) (6) GND
GPIO4 (7) (8) GPIO14
GND (9) (10) GPIO15
GPIO17 (11) (12) GPIO18
GPIO27 (13) (14) GND
GPIO22 (15) (16) GPIO23
3V3 (17) (18) GPIO24
GPIO10 (19) (20) GND
GPIO9 (21) (22) GPIO25
GPIO11 (23) (24) GPIO8
GND (25) (26) GPIO7
GPIO0 (27) (28) GPIO1
GPIO5 (29) (30) GND
GPIO6 (31) (32) GPIO12
GPIO13 (33) (34) GND
GPIO19 (35) (36) GPIO16
GPIO26 (37) (38) GPIO20
GND (39) (40) GPIO21
~省略~
接続イメージ
接続例(GPIO5を使う場合)
echo 5 > /sys/class/gpio/export
/sys/class/gpio/gpio5/
ディレクトリが作られる
中身はこんな感じ
pi@raspberrypi:~$ ls -l /sys/class/gpio/gpio5/
合計 0
-rwxrwx--- 1 root gpio 4096 12月 25 10:42 active_low
lrwxrwxrwx 1 root gpio 0 12月 25 10:42 device -> ../../../gpiochip0
-rwxrwx--- 1 root gpio 4096 12月 25 10:43 direction
-rwxrwx--- 1 root gpio 4096 12月 25 10:42 edge
drwxrwx--- 2 root gpio 0 12月 25 10:42 power
lrwxrwxrwx 1 root gpio 0 12月 25 10:42 subsystem -> ../../../../../../../class/gpio
-rwxrwx--- 1 root gpio 4096 12月 25 10:42 uevent
-rwxrwx--- 1 root gpio 4096 12月 25 10:42 value
入力用か出力用かをin outで切り替えられます。今回は出力なのでout
echo out > /sys/class/gpio/gpio5/direction
点灯する
echo 1 > /sys/class/gpio/gpio5/value
消灯する
echo 0 > /sys/class/gpio/gpio5/value
Rubyから制御する
点灯
File.open('/sys/class/gpio/gpio5/value', 'w', 0755){ |f| f.print('1') }
消灯
File.open('/sys/class/gpio/gpio5/value', 'w', 0755){ |f| f.print('0') }
これをいい感じにまとめてそれっぽくする(GPIOの4, 5, 22を使ってます)
# 全部off
def off_all
File.open('/sys/class/gpio/gpio4/value', 'w', 0755){ |f| f.print('0') }
File.open('/sys/class/gpio/gpio22/value', 'w', 0755){ |f| f.print('0') }
File.open('/sys/class/gpio/gpio5/value', 'w', 0755){ |f| f.print('0') }
end
# 全部on
def on_all
File.open('/sys/class/gpio/gpio4/value', 'w', 0755){ |f| f.print('1') }
File.open('/sys/class/gpio/gpio22/value', 'w', 0755){ |f| f.print('1') }
File.open('/sys/class/gpio/gpio5/value', 'w', 0755){ |f| f.print('1') }
end
# 順次点灯or消灯
def toggle(status)
text = status ? '0' : '1'
File.open('/sys/class/gpio/gpio4/value', 'w', 0755){ |f| f.print(text) }
sleep(1)
File.open('/sys/class/gpio/gpio22/value', 'w', 0755){ |f| f.print(text) }
sleep(1)
File.open('/sys/class/gpio/gpio5/value', 'w', 0755){ |f| f.print(text) }
sleep(1)
end
5.times do |index|
toggle(index.odd?)
if index.odd?
3.times do
on_all
sleep(1)
off_all
sleep(1)
end
end
end
off_all