電気屋さんとかデパートのトイレって音楽が流れているところありますよね。
なんとなく安らかな気持ちになれていいなぁと前から思っていました。
自宅のトイレにも自動的に音楽が流れる仕組みがあればいいかも!ということで、Raspberry Piに人感センサーを組み合わせた音楽再生機を作ってみることにしました。
それでは、顛末をご紹介します。
事前に考えておくこと
電源をどう確保するか
まず、電源をどう確保するか考えました。
我が家のトイレには使っていない電源コンセントがありません。このため、モバイルバッテリーなどを使うか、天井の照明用電源から電源を取る必要があります。
モバイルバッテリーだとどれくらい電源を維持できるかが分かりませんし、いつの間にか電源が落ちているという事態になる可能性があります。
このため、天井にある照明用電源からの電源供給を選択しました。
以前↓の記事に書いた方法で照明用電源を使います。
照明をどう確保するか
照明用電源から電源を取ることに決めました。そうなると、自動音楽再生機に照明機能も付けないといけません。夜真っ暗なトイレって嫌ですもんね。
そこで、↓の記事で書いたリレーで点灯するUSBライトを組み合わせ、照明も人感センサーで自動的に点くようにしようと考えました。
作成手順
材料を揃える
それでは、作成に取り掛かります。
まずは材料を揃えます。下記のものを用意しました。
(2019/10/07追記:抵抗は不要になりました。)
- Raspberry Pi Zero W (GPIOヘッダー取り付け済み)
- 人感センサー(HC-SR501、Amazonで購入)
- リレーモジュール(SODIAL製)
- USBオーディオ変換アダプタ(VENTION製)
- ジャンパーワイヤー
- ミニブレッドボード
- 抵抗(330Ω)
- スピーカー(100円ショップのアンプなしのもの)
- USBライト(100円ショップのもの)
2,3,4,6は下記の製品を使用しました。
↓をクリックするとAmazonの商品ページが開きます。
HiLetgo® 3個セット HC-SR501人体赤外線感応モジュール 人体の赤外線の感応器 [並行輸入品]
- 出版社/メーカー: HiLetgo
- メディア: おもちゃ&ホビー
- この商品を含むブログを見る
↓をクリックするとAmazonの商品ページが開きます。
↓をクリックするとAmazonの商品ページが開きます。
↓をクリックするとAmazonの商品ページが開きます。
Raspberry PiでUSBオーディオ変換アダプタを使う方法については↓の記事をご覧ください。
回路を考える
人感センサー(HC-SR501)の出力はHIGH=3.3V、LOW=0Vですので、Raspberry PiのGPIOの入力電圧と同じです。なので、人感センサーの出力をRaspberry PiのGPIOに接続することができます。
(2019/10/07追記)
最初に回路を作ったとき、GPIOへの入力に抵抗を入れていました。
しかし、Raspberry PiのGPIOは内部にプルダウン抵抗を持っており、それを有効にすれば別途抵抗はいらなそうだったので取り外しました。
また、プルダウン抵抗が有効になるようにPythonプログラムも見直しました。
↓のページを参考にさせていただきました。
https://mamerium.com/raspberry-pi-rpi-gpio-setup/
回路は以下としました。リレーモジュールによるUSBライト制御も含んでいます。
組み立てる
それでは組み立てていきます。以前作成したリレーを使用したUSBライトの回路をベースにしました。
↓のようになりました。(写真では抵抗を使っていますが無くても大丈夫です)
プログラムを作る
それではPythonでプログラムを書きます。
下記のサイトを参考にさせていただきました。
・Raspberry Pi のGPIOをPythonから利用する
https://qiita.com/maoutokagura/items/9aef5e23167ce2bc1d10
・PythonでMP3音源を再生する
https://qiita.com/kekeho/items/a0b93695d8a8ac6f1028
作成したプログラムは下記の動作をします。
- USBライトがオフのときに人感センサーが人を検知すると、15秒のタイマーを設定し、USBライトをオンにしてmp3ファイルを再生します。
- 1秒間隔でタイマーが切れるのをチェックし、タイマーが切れたらUSBライトをオフにしてmp3ファイルの再生を止めます。
- USBライトがオンの間に再び人を検知したら、その時点から15秒後にタイマーを設定し直します。
import RPi.GPIO as GPIO
import time
import pygame.mixer
def switch_callback(gpio_pin):
global elaptime;
print(gpio_pin)
print("pre:elaptime = " + str(elaptime))
elaptime = int(time.time()) + 15
print("aft:elaptime = " + str(elaptime))
if onoff_flag == 0:
light_on()
music_start()def light_on():
global onoff_flag;
print("light on")
GPIO.output(14,GPIO.HIGH)
onoff_flag = 1def light_off():
global onoff_flag;
print("light off")
GPIO.output(14,GPIO.LOW)
onoff_flag = 0def music_start():
pygame.mixer.init()
pygame.mixer.music.load("music.mp3")
pygame.mixer.music.play(-1)def music_stop():
pygame.mixer.music.stop()
onoff_flag = 0
elaptime = 0GPIO.setmode(GPIO.BCM)
GPIO.setup(14,GPIO.OUT, initial=GPIO.LOW)
GPIO.setup(4,GPIO.IN, pull_up_down=GPIO.PUD_DOWN)
GPIO.add_event_detect(4, GPIO.FALLING,bouncetime=100)
GPIO.add_event_callback(4, switch_callback)try:
while True:
print(int(time.time()))
if onoff_flag == 1 and int(time.time()) > elaptime:
light_off()
music_stop()
time.sleep(1)
except KeyboardInterrupt:
GPIO.cleanup()
動作確認
おぉちゃんと動きます。やったね。写真だと音楽が流れていることが分かりませんが。。(写真では抵抗を使っていますが無くても大丈夫です)
ちなみにこの人感センサーは、下記を変更可能です。
- 検知距離(3m~7m)
- 検知してから出力するまでの時間(0.5秒~300秒)
- 出力を繰り返す(デフォルト)、または繰り返さない
今回は検知距離を3m、検知してから出力するまでの時間を0.5秒、繰り返しなしとしました。
↓のページを参考にしました。
https://www.csun.co.jp/SHOP/2016103001.html
問題発生(電流不足)
ここまで順調にいっていましたが、最後に落とし穴が待ち構えていました。
動作確認中に使用していた電源はPCのUSB端子だったのですが、コンセントに差すUSB電源アダプタにするとうまく動かないのです。USBライトが点灯しません。
100円ショップで購入した5V1AのUSB電源を二股にしてRaspberry PiとUSBライトに電源供給しましたが、USBオーディオ変換アダプタが結構電力を使うらしく、音楽は流れるものの暗いままです。
試しにRaspberry Pi 3用に使っている5V3AのUSB電源アダプタにしたらUSBライトも点きました。電流不足で確定ですね。
以前、スマート照明を作ってみる記事に書いたように、今は100円ショップで購入したシャンプー容器の中に回路を押し込んでいます。
5V1AのUSB電源アダプタはこのシャンプー容器の口に合うサイズだったのですが、5V3AのUSB電源アダプタは結構大きく、シャンプー容器と組み合わせるのは難しそうです。
ということで、今回は天井に吊るすのをあきらめました。
今後の展望
照明はあきらめて、音楽再生だけでもできないか検討中です。その場合、バッテリー駆動になるので、どれくらい持つのか調べてみたいと思います。