14
8

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

体育会系エンジニアAdvent Calendar 2017

Day 23

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

Last updated at Posted at 2017-12-22

こちらは 体育会系エンジニア 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:

14
8
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
14
8

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?