Raspberry Piを使って光って音が鳴るクリスマスツリーを作る

こちらは [体育会系エンジニア Advent Calendar 2017](https://qiita.com/advent-calendar/2017/athlete) 23日目の記事です。

学生時代は自転車部に所属してました。
最近はマラソンとか登山とかトレランとかフットサルとか、
[Raspberry Piもくもく会](https://raspberry-pi-moku.connpass.com/) とか [GTUG Girls](https://gtuggirls.connpass.com/) スタッフとか、
色々やってます @yuzu_afro と申します。

体育会系エンジニアっぽいこと書きたいなと思っていたのですが、[RunKeeper API](https://runkeeper.com/developer/healthgraph/getting-started) は新規登録受け付けてくれてないし、Garmin の [Connect IQ SDK](https://developer.garmin.com/connect-iq) はインストールでつまづくし、Garmin の API は[有料](https://developer.garmin.com/garmin-connect-api/overview/)だし、膝は痛めるしで、踏んだり蹴ったりなので、体育会系全く関係ないことを書くことにしました。

クリスマスなので、光って音が鳴るクリスマスツリーをRaspberry Piで作ってみようと思います:christmas_tree:

# 準備するもの
* Raspberry Pi
* LED(デコレーションライト)
  * ダイソーで売ってます → [こんなの](https://www.daiso-sangyo.co.jp/season/2015christmas/page-1/arumi-4)
* ブレッドボード、ジャンパワイヤー(2本)、抵抗(今回は100Ω)
* スピーカー
* クリスマスツリー(ダイソー)

# 光るツリーの作成
まず初めに光るツリー部分を作成します。

## LEDの動作確認
初期不良がないか確認します。
電池ボックスに電池を入れてスイッチをONにして、LEDが点灯できることを確認します。

## クリスマスツリーにLEDを巻きつける
クリスマスツリーにLEDを巻きつけます。
(センスが問われます。)

## 電池ボックスを切り離す
電池ボックスは今回使用しないので、切り離してしまいます。
ここで重要なことがあります！！
電池ボックスを切り離す前に、リード線のプラスとマイナスがわかるように印を付けておきましょう。
下の写真では、プラス側にマスキングテープで印を付けました。
<img src="https://qiita-image-store.s3.amazonaws.com/0/153816/63b1a451-e5a8-e53a-e044-579a0265af7a.jpeg" width=50%>

プラスとマイナスを間違えないように印を付けたら、ハサミで切り離します。

## リード線の処理
リード線をブレッドボードに差し込めるように加工していきます。
ハサミを使って、いい感じにビニール被覆を取り除きます。
(センスが問われます。)
<img src="https://qiita-image-store.s3.amazonaws.com/0/153816/d3256029-d886-0688-4075-5edcc1931406.jpeg" width=50%>


## ブレッドボードに配線
ブレッドボードに、以下のように配線します。
LEDのプラス側をGPIO18番に、マイナス側をGNDに接続します。
プラスとマイナスを間違えないようにしましょう。
(この図ではLEDは1個ですが、実際には直列に10個のLEDが接続されています。)
<img src="https://qiita-image-store.s3.amazonaws.com/0/153816/6a6c6c11-96af-700d-2c03-52c9f49ea242.png" width=50%>


### 注意点
今回は、100Ωの抵抗を使っていますが、本来はLEDの特性に合わせて抵抗値を変える必要があります。が、詳細なスペックがわからなかったので、何本か試して100Ωにしました。
明るすぎる時は過電流になっている可能性がありますので、抵抗値を大きくした方がよいです。

工作はここまでで完成です。
こんな感じでクリスマスツリーを設置してみました。
<img src="https://qiita-image-store.s3.amazonaws.com/0/153816/c8f88d7c-d22c-4706-9610-8076970473c9.png" width=50%>


# 音楽ファイルの作成 (Sonic Pi)
次にクリスマスの曲を準備します。
mp3ファイルやwavファイルをダウンロードしてきてもよいのですが、せっかくなので Raspberry Pi でクリスマスの曲を作ってみましょう。
Raspbian OS にプリインストールされている [Sonic Pi](http://sonic-pi.net/) というアプリを使えば、音楽ファイルを作成することができます:smile:

## Sonic Pi の操作方法

Raspberry Piの「プログラミング」メニューから「Sonic Pi」を選択すると、こんな画面が起動します。
<img src="https://qiita-image-store.s3.amazonaws.com/0/153816/66a48333-d54d-c86d-eb36-b7faa9a48077.png" width=70%>

"Buffer" のエリアにコードを書くことで、音楽を作ることができます。
下の方にチュートリアルやサンプルもありますので、色々試すことができそうです。
日本語で丁寧に解説されている記事もありました。
[Sonic PiでSoundProgramming!](https://qiita.com/santa_sukitoku/items/6585a84eeb01d2b8d3a3)

こちらを参考に、クリスマスの曲を作ります・・・。

とは言っても時間がありません。
調べてみると、GitHub Gistでクリスマスの曲をコード化して提供されている素晴らしい方がおられました:heart_eyes: ので、こちらを使わせていただくことにします:innocent:
https://gist.github.com/rbnpi/5f5e9356e627d1cbc52086efbb56456c

ジングルベル
https://gist.github.com/rbnpi/6032176de271227e6324

## Sonic Pi での WAVファイル作成方法

Sonic Pi では再生しているファイルを録音し、WAVファイルとして保存することができます。
Recボタンをクリックすると録音が開始され、再度クリックすると録音が停止されてWAVファイル保存ダイアログが表示されます。

Recボタン → Runボタン → (曲の再生終了) → Recボタン

と操作すると曲のWAVファイルを作成できます。

"Buffer 0" に、先ほどのジングルベルのコード部分をコピーして、上記の手順でWAVファイルを作成します。
jinglebells.wav というファイル名にしました。


# プログラムの作成
次に、音楽を再生している間に、LEDを点滅させるプログラムを作成します。
LEDは1秒ごとに点灯・消灯を繰り返すパターンを準備しました。

以下のような christmas.py を作成します。
WAVファイルも同じ階層に準備しておきます。

```python:christmas.py
#!/usr/bin/env python
# coding:utf-8

import time
import subprocess
import multiprocessing
import RPi.GPIO as GPIO          # RPi.GPIOパッケージのインポート

LED1 = 18                        # LED1 --> GPIO1(BCM:18,Physical:12)

def led_blink_initialize():

  GPIO.setmode(GPIO.BCM)         # BCMのポート番号を使用
  GPIO.setup(LED1, GPIO.OUT)     # LED1を出力に設定

def led_blink():

  while True:
    # 1秒点滅
    GPIO.output(LED1, GPIO.HIGH) # ポートにHighの信号を出力(LEDが点灯します)
    time.sleep(1)

    GPIO.output(LED1, GPIO.LOW)  # ポートにLowの信号を出力(LEDが消灯します)
    time.sleep(1)

def led_blink_terminate():
  GPIO.cleanup()

if __name__ == "__main__":
  led_blink_initialize()
  p = multiprocessing.Process(target=led_blink)
  p.start()
  subprocess.call(['aplay', 'jinglebells.wav'])
  p.terminate()
  led_blink_terminate()
```

# プログラムの実行

準備ができたら以下のコマンドを入力して、プログラムを実行します。

```sh
$ python3 christmas.py
```

音楽が流れている間、LEDが点滅したら成功です:blush:

(下の画像をクリックすると、YouTube動画のリンクになっています)
[<img src="https://img.youtube.com/vi/Sub0HdZVTtw/0.jpg" width=50%>](https://youtu.be/Sub0HdZVTtw)


本当は曲を自分で作るとか、部屋に入ったら音が鳴るとか、音に合わせて光るとかやりたかったのですが、今回はここまででタイムアップです。
Sonic Pi は、なかなか本格的な音楽が作り込めそうですね:blush:

明日はいよいよクリスマスイブ:santa_tone1:
@nagaoyuriko さんがどんなポエムを書いてくれるのか、楽しみで眠れません:heart_eyes: