2021年5月4日火曜日

ラズベリーパイに人感センサーを付けて音声を再生する。

Raspberry Piに人感センサーモジュールを付けて、動くものを感知すると音声を再生するというものを作りました。

お店の入り口に設置して、お客さんが入ってきたら「いらっしゃいませ」と音声が流れるという感じのものです。

今回はまず、基本となるプログラムを作成します。けっこう難儀するかと思っていたのですが、意外とすんなりできました。

いろいろ使えそうですが、まずは、獣害対策として、この前作った太陽光発電の電源と組み合わせて田畑に寄ってきたイノシシを驚かせるようなものが作れたらと思っています。


Raspberry PiはZero WH(Wのピンヘッダ実装モデル)、人感センサーモジュールはHC-SR501を使いました。


昨年末に購入した時には、中国からどんぶらこと1か月くらいかけて届いたのですが、今現在はすぐ届く状態になっていますね。



最短の接続は、メス-メスのジャンパーワイヤー。


では、作っていきます。

今回は主に、以下の2サイトを参考にさせていただきました。

【Raspberry Pi】自作人感センサーの使い方と活用法 - CHASUKE.com
Raspberry Piで音楽(wav/mp3)ファイルを再生する方法 python編 - Qiita


▼ Raspberry Piの下準備


Raspberry Piの準備をします。

① Raspberry Pi OSのセットアップ
② IPアドレスの固定
③ VNC、SSHを有効化
④ PythonのデフォルトをPython3に変更
⑤ 日本語入力パッケージのインストール(「fcitx-mozc」、「ibus-mozc」 等)

やり方は、検索すればたくさんでてきますので省略。

②③は、作業時に、いちいちモニターとキーボード、マウスをつなぐのが大変なので、リモートアクセスで作業できるようにします。⑤の日本語入力は必要があれば。


▼ 人感センサーを接続する



人感センサーモジュールをジャンパーワイヤーでRaspberry Piに接続します。



左から、グランド(GND)、出力、電源(4.5-20V)になります。



HC-SR501側:Raspberry Pi側(ピン番号)
電源:5V(4)
出力:GPIO18(12)
GND:GND(6)



オレンジのつまみは、左が時間調節、右が感度調節です。右に回すと時間は長く、感度は良くなるみたいです。

さらに、右側端っこにリピート設定の切り替えスイッチがあるはずなんですが、なぜか付いていませんでした(笑)。まぁ、どちらにせよ、時間やリピートについてはプログラムで制御する形にします。


▼ 音声データと音声出力の準備


Raspberry PiでPythonから音声を再生する方法はいろいろあるようですが、今回は最初からパッケージとしてインストールされているpygameというモジュールを使います。音声データはmp3、もしくはogg形式のものを準備をします。

ちなみに、Raspberry Pi Zero WHにはミニジャックがないので、ミニHDMI、microUSB、GPIOのいずれかから出力する必要があります。



例えば、スピーカー内蔵のモニターだとHDMI接続で音声がでます。


▼ Pythonスクリプト


人感センサーが反応した際に音声を再生するPythonスクリプトです。ディレクトリやファイル名は適当に。

#!/usr/bin/env python3

from datetime import datetime
import time
import RPi.GPIO as GPIO
import pygame.mixer

INTERVAL = 3  # 判定の時間の間隔
SLEEPTIME = 10  # 音声再生後の休止時間
GPIO_PIN = 18

GPIO.setmode(GPIO.BCM)
GPIO.setup(GPIO_PIN, GPIO.IN)

if __name__ == '__main__':
    try:
        while True:
            if(GPIO.input(GPIO_PIN) == GPIO.HIGH):
                pygame.mixer.init()
                pygame.mixer.music.load("音声データ(絶対パスで記述)")
                pygame.mixer.music.play(1)
                time.sleep(音声データの秒数)
                pygame.mixer.music.stop()
                print(datetime.now().strftime('%Y/%m/%d %H:%M:%S'))
                time.sleep(SLEEPTIME)
            else:
                print(GPIO.input(GPIO_PIN))
                time.sleep(INTERVAL)
    except KeyboardInterrupt:
        print("finished")
    finally:
        GPIO.cleanup()

書き換えが必要な箇所は以下の通り。

・20行目「音声データ(絶対パスで記述)」

例えば、Musicフォルダの場合は、「/home/pi/Music/ファイル名」になります。


・22行目「音声データの秒数」

音声データの秒数を記述します。1分の音声データであれば「60」。


また、8行目の「INTERVAL」、9行目の「SLEEPTIME」の時間によって反応のタイムラグができますので、用途によって適宜調整してください。「INTERVAL」は反応の判定をする時間の間隔、「SLEEPTIME」は音声再生後の休止時間になります。


▼ 動かしてみる


実行。

$ python ms_sound.py
pygame 1.9.4.post1
Hello from the pygame community. https://www.pygame.org/contribute.html
0
0
0
2021/05/04 21:55:45
0
2021/05/04 21:56:03
0
0
^Cfinished

こんな感じになります。

人感センサーが反応した場合は、日時が表示され、音声が流れます。無反応の場合は、3秒ごとに「0」と表示。

「Ctrl + C」でプログラムが終了します。


***

ということで、Raspberry Piを使い、人感センサーの反応に合わせて音声を再生するプログラムでした。


・関連投稿


Twitter(@nkkmd)日々更新中です。