こちらは 体育会系エンジニア Advent Calendar 2017 23日目の記事です。
学生時代は自転車部に所属してました。
最近はマラソンとか登山とかトレランとかフットサルとか、
Raspberry Piもくもく会 とか GTUG Girls スタッフとか、
色々やってます @yuzu_afro と申します。
体育会系エンジニアっぽいこと書きたいなと思っていたのですが、RunKeeper API は新規登録受け付けてくれてないし、Garmin の Connect IQ SDK はインストールでつまづくし、Garmin の API は有料だし、膝は痛めるしで、踏んだり蹴ったりなので、体育会系全く関係ないことを書くことにしました。
クリスマスなので、光って音が鳴るクリスマスツリーをRaspberry Piで作ってみようと思います![]()
準備するもの
- 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 というアプリを使えば、音楽ファイルを作成することができます![]()
Sonic Pi の操作方法
Raspberry Piの「プログラミング」メニューから「Sonic Pi」を選択すると、こんな画面が起動します。

"Buffer" のエリアにコードを書くことで、音楽を作ることができます。
下の方にチュートリアルやサンプルもありますので、色々試すことができそうです。
日本語で丁寧に解説されている記事もありました。
Sonic PiでSoundProgramming!
こちらを参考に、クリスマスの曲を作ります・・・。
とは言っても時間がありません。
調べてみると、GitHub Gistでクリスマスの曲をコード化して提供されている素晴らしい方がおられました
ので、こちらを使わせていただくことにします![]()
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ファイルも同じ階層に準備しておきます。
# !/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が点滅したら成功です![]()
(下の画像をクリックすると、YouTube動画のリンクになっています)

本当は曲を自分で作るとか、部屋に入ったら音が鳴るとか、音に合わせて光るとかやりたかったのですが、今回はここまででタイムアップです。
Sonic Pi は、なかなか本格的な音楽が作り込めそうですね![]()
明日はいよいよクリスマスイブ![]()
@nagaoyuriko さんがどんなポエムを書いてくれるのか、楽しみで眠れません![]()