Hello World / plɹoM ollǝH

Programmers Live in Vain

Raspberry Piでトイレにクラシック音楽を流す

人がきたら音楽を流す装置をトイレに設置しました(割と好評)

  • ケースはRaspberry Piの箱に100均で買った折り紙を貼って作成
  • 本体のUSBでBluetoothスピーカーを充電

f:id:dungeonneko:20170407163311j:plain

必要なもの

Raspberry Piと人感センサーの接続

下記ページを確認しながらRaspberry Piと人感センサーを接続

対応するピン同士をジャンパーワイヤで繋ぐ

人感センサー Raspberry Pi
+Power <---> 5V PWR
GND <---> GND
High/Low Output <---> GPIO18

人感センサーで音を鳴らすプログラムの作成

  • python
  • mp3を再生したかったのでpygameモジュール
  • スクリプトと同じフォルダにあるmp3をランダムで再生
     
import pygame, os, random, time, RPi.GPIO

pygame.init()
pygame.mixer.pre_init(44100, 16, 2, 1024 * 4)
pygame.mixer.init()
pygame.mixer.set_num_channels(8)
screen = pygame.display.set_mode((320, 240))
shutdown = False
clock = pygame.time.Clock()
files = []
active = False
last_activated = 0
pin = 18
RPi.GPIO.setmode(RPi.GPIO.BCM)
RPi.GPIO.setup(pin, RPi.GPIO.IN)

# 入力を検知したあとに何秒間流すか
timeout = 30

# 音楽の再生
def play_random_track():
    global files
    # 再生リストがなくなったらmp3ファイルを検索してシャッフル
    if not files:
        files = [f for f in os.listdir('./') if f.endswith('.mp3')]
        random.shuffle(files)
    # 再生リストから一番最初の音楽をとってきて鳴らす
    pygame.mixer.music.load(files.pop(0))
    pygame.mixer.music.set_volume(1.0)
    pygame.mixer.music.play()

# メインループ
while not shutdown:
    # 入力フラグ
    active = False

    # OSイベント処理
    for e in pygame.event.get():
        # 閉じるボタンやESCキーが入力されたらプログラムを終了する
        if e.type == pygame.QUIT or (e.type == pygame.KEYDOWN and e.key == 27):
            shutdown = True
            break
        # テスト用:Enterキーで音を鳴らせるようにしておく
        elif e.type == pygame.KEYDOWN and e.key == 13:
            active = True
            continue

    # 人感センサーからの入力
    if RPi.GPIO.input(pin) == RPi.GPIO.HIGH:
        active = True

    # 入力があったときの処理
    if active:
        # 入力時間を更新する
        last_activated = time.time()
        # 再生してないときは次のトラックを再生
        if not pygame.mixer.music.get_busy():
            play_random_track()

    # 最後の入力から一定時間(timeout秒)が経過したら音楽をフェードアウトさせる
    if (time.time() - last_activated) > timeout:
        if pygame.mixer.music.get_busy():
            pygame.mixer.music.fadeout(5000)

    pygame.display.flip()
    clock.tick(5)  # 処理負荷を抑える(1秒間に5回ループをまわす)

RPi.GPIO.cleanup()
pygame.quit()

電源入れたら自動でプログラムが動くようにする

以前の記事と同じ手順で起動時にBluetoothスピーカー接続&今回用意したスクリプトを起動するように修正

pulseaudio -D
sleep 5  # 適当にウェイト
bluetoothctl << EOF
power on
connect FF:FF:FF:FF:FF:FF  # BluetoothスピーカーのMACアドレス
quit
EOF
sleep 5  # 適当にウェイト
pacmd set-sink-volume 1 32767  # 音量調節(デバイス番号、音量~65565)

cd otohime
python3.4 otohime.py