クリスマスなのでラズパイでイルミネーションしてみた

クリスマスなのでラズパイとRubyを使ってイルミネーションを作りました

## 完成イメージ
3つのLEDで順次点灯、順次消灯、全部点滅を繰り返します
![IMG_5370.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/555267/e12ce94c-2113-1d21-e3dc-8121e02ed454.jpeg)



## 作り方
ラズパイの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
~省略~

```
### 接続イメージ
ちょっとわかりずらいですが
![IMG_5365.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/555267/c1b72bf2-605f-be3c-8b8f-736b484a3d99.jpeg)


### 接続例(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から制御する
点灯

```ruby
File.open('/sys/class/gpio/gpio5/value', 'w', 0755){ |f| f.print('1') }
```

消灯

```ruby
File.open('/sys/class/gpio/gpio5/value', 'w', 0755){ |f| f.print('0') }
```

これをいい感じにまとめてそれっぽくする(GPIOの4, 5, 22を使ってます)

```ruby
# 全部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
```

# それではみなさん メリークリスマス!
[![Image from Gyazo](https://t.gyazo.com/teams/startup-technology/2a6c9bc1494cbbac8b3daf756e0bbb96.gif)](https://startup-technology.gyazo.com/2a6c9bc1494cbbac8b3daf756e0bbb96)