Python
RaspberryPi
raspbian
SonicPi

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

こちらは 体育会系エンジニア Advent Calendar 2017 23日目の記事です。

学生時代は自転車部に所属してました。
最近はマラソンとか登山とかトレランとかフットサルとか、
Raspberry Piもくもく会 とか GTUG Girls スタッフとか、
色々やってます @yuzu_afro と申します。

体育会系エンジニアっぽいこと書きたいなと思っていたのですが、RunKeeper API は新規登録受け付けてくれてないし、Garmin の Connect IQ SDK はインストールでつまづくし、Garmin の API は有料だし、膝は痛めるしで、踏んだり蹴ったりなので、体育会系全く関係ないことを書くことにしました。

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

準備するもの

  • Raspberry Pi
  • LED(デコレーションライト)
  • ブレッドボード、ジャンパワイヤー(2本)、抵抗(今回は100Ω)
  • スピーカー
  • クリスマスツリー(ダイソー)

光るツリーの作成

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

LEDの動作確認

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

クリスマスツリーにLEDを巻きつける

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

電池ボックスを切り離す

電池ボックスは今回使用しないので、切り離してしまいます。
ここで重要なことがあります!!
電池ボックスを切り離す前に、リード線のプラスとマイナスがわかるように印を付けておきましょう。
下の写真では、プラス側にマスキングテープで印を付けました。

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

リード線の処理

リード線をブレッドボードに差し込めるように加工していきます。
ハサミを使って、いい感じにビニール被覆を取り除きます。
(センスが問われます。)

ブレッドボードに配線

ブレッドボードに、以下のように配線します。
LEDのプラス側をGPIO18番に、マイナス側をGNDに接続します。
プラスとマイナスを間違えないようにしましょう。
(この図ではLEDは1個ですが、実際には直列に10個のLEDが接続されています。)

注意点

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

工作はここまでで完成です。
こんな感じでクリスマスツリーを設置してみました。

音楽ファイルの作成 (Sonic Pi)

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

Sonic Pi の操作方法

Raspberry Piの「プログラミング」メニューから「Sonic Pi」を選択すると、こんな画面が起動します。

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

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

とは言っても時間がありません。
調べてみると、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ファイルも同じ階層に準備しておきます。

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()

プログラムの実行

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

$ python3 christmas.py

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

(下の画像をクリックすると、YouTube動画のリンクになっています)

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

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