\r\n\r\n
今年もまた、小さな子供を脅してお菓子をあげることが社会的に許されると思っている人たちがいる季節がやってきました。ああ、嬉しい。私はあなたの仕事を容易にするために、**簡単なモーションセンシティブRaspberry Piハロウィンスピーカーの方法を紹介するためにここにいます。ここでは、そのデモをご紹介します。
おそらく、人感センサーだけがないのでしょう。小型で安価な部品なので、お近くのマイクロセンターやメイプリンで手に入るはずです。
このチュートリアルでは、恐ろしいサウンドの部分のみを取り上げます。
Raspbian Jessie LiteとPython 2.7を使用していますが、Pi上で動作するLinuxディストリビューションであれば、どのようなものでも構いません。標準のホスト名「Local Raspberry」にしたので、まずSSHでリモートログインします(Macの場合はターミナルウィンドウを開きます)。(Windowsで同じことをする方法はこちら) または、デスクトップGUIで完全なRaspbianを選択する場合は、更新までスキップしてください。
ssh [email protected](enter raspberry as the password)sudo apt-get updatesudo apt-get install python-pipsudo pip install gpiozeroPythonでGPIOピンや多くの種類の内蔵センサーやボタンを使うための簡単なライブラリをインストールします。GPIO4の信号ピンを使ってセンサーを接続し、VCCを5Vに、GNDをGNDに接続します。これは正確なモデルによって異なる場合がありますので、ピンアウト図で確認してください。
私のPimoroni Pi 2のケースには、ピンアウトが直接レーザーで刻まれているので便利です。
では、動体検知スクリプトを作成しましょう。
nano motion.pyに貼り付けます。
from gpiozero import MotionSensorpir = MotionSensor(4)while True: if pir.motion_detected: print("Motion detected!") else: print ("No motion")CTRL-X、Yの順に押して保存して終了し、次のコマンドで実行します。
python motion.pyセンサーの前で手を振るまで、"No Action "のメッセージが繰り返し表示され、その時点で "Action Detected!"で停止するはずです。
このメッセージが全く変化しない場合は、接続先を間違えていることになります。
このシンプルなGPIOZeroライブラリについてもっと知りたい方は、この素晴らしいメモ帳をご覧ください。
ポータブルスピーカーを接続し、必要に応じて電源が入っていることを確認します。音を再生するためにpygameライブラリを使用します。
sudo apt-get install python-pygameまず、再生するサウンドファイルが必要です。デスクトップ環境で行う場合は、どこかからWAVまたはOGGファイルをダウンロードし(ここに無料のハロウィンサウンドの良いセレクションがありました)、ホームディレクトリに置いてください。まずダウンサンプリングしてから、小さなOGG形式に変換することをお勧めします。
リモートで接続してコマンドラインのみを使用する場合、サイトによってはwgetコマンドで実際のファイルを取得できないことがあり、苦労することがあります。その代わり、ローカルにデスクトップにダウンロードし、コマンドラインからscp(セキュアコピー)コマンドでコピーすることができます。scpについてはこちらで詳しく説明していますが、とりあえず、新しいターミナルタブを開いて、次のように入力してください。
scp thunder.ogg [email protected]:thunder.oggの名前を適宜変更してください。ただし、final:を忘れないでください(これがないとコマンドは完了しますが、実行させたい動作は実行されません)。デフォルトでは、Piユーザーのホームディレクトリに転送されます。
では、音を鳴らすためのスクリプトを改造してみましょう。まず、いくつかの新しいモジュールをインポートします。
import pygame.mixerfrom pygame.mixer import Soundそして、既存のimport文の直後で、同じ音を何度もループさせてテストします。残りのモーションセンシングコードは今のところそのままです。このサウンド再生のループに永遠にはまるので、実行されません。
pygame.init()pygame.mixer.init()#load a sound file, in the home directory of Pi user (no mp3s)thunder = pygame.mixer.Sound("/home/pi/thunder.ogg")while True: thunder.play() sleep(10) thunder.stop()なお、当初この作業を試したところ、音の再生が拒否され、代わりにクリックが入るようになりました。ファイルのサイズまたはビットレートが原因でした。15秒のクリップで24ビット、5MB以上でした。私が上でリンクしたコンバーターを使って16ビットにすることで、すべてがうまくいき、サイズもわずか260KBに減りました
Pythonアプリケーションの実行中にスピーカーからヒスノイズのような音がする場合は、次のように入力します。
sudo nano /boot/config.txt最後にこの行を追加してください。
disable_audio_dither=1再起動すると、変更が有効になります。または、気にしないでください。
最後に、メインとなるモーションチェックのループを修正し、モーションが検出されたときにサウンドが再生されるようにしましょう。15秒のディレイを使って、ループ全体を再生できるようにし、ノンストップモーションが多いときのスパムバッファーとして機能するようにします。
while True: if pir.motion_detected: print("Motion detected!") thunder.play() # ensure playback has been fully completed before resuming motion detection, prevents "spamming" of sound sleep(15) thunder.stop() else: print ("No motion")バッテリーでインターネットに接続しない状態で設定したい場合もあるので、コマンドラインを開かずに再起動時にスクリプトを実行する必要があります。これを行うには、最も単純な方法であるcrontab.typeを使用します。
sudo crontab -eこのコマンドを初めて実行する場合、最初にどのエディタを使用するか尋ねられます。nanoはオプション2を選びました。お好みのエディタにつながるので、以下の行を追加してください。
@reboot python /home/pi/motion.py &これは、campaign.pyスクリプトが起動毎に実行され、サイレントに実行されることを意味します(したがって、スクリプトからのいかなる出力も無視されます)。再起動で再試行します。
動きのある再生ができない場合や、小さなクリック音が聞こえるだけの場合は、ファイルのフルパスが使用されていないか、ファイルを低ビットレートかつ小さいファイルサイズに変換する必要がある可能性があります。
同じエフェクトを何度もかけるのはちょっとつまらないので、ランダム性を持たせてみましょう。ハロウィンのサウンドをダウンロードするには、適度なサイズとビットレートに縮小して、前回と同様にscpを使ってあなたのPiに送信することを忘れないでください。
pygame.mixer.Sound ファイルが変数になるようにコードを修正することで、実際にはサウンドの配列を作成しています。 python は、次のようにカンマ区切りのリストを角括弧で囲むだけで、簡単に作成できます。
sounds = [ pygame.mixer.Sound("/home/pi/thunder.ogg"), pygame.mixer.Sound("/home/pi/scary_scream.ogg"), pygame.mixer.Sound("/home/pi/girl_scream.ogg"), pygame.mixer.Sound("/home/pi/psycho_scream.ogg") ]次に、以下のコマンドでランダムライブラリをファイルにインポートします。
import randomこれで、主運動誘導ループは以下のように変更されました。
while True: if pir.motion_detected: print("Motion detected!") playSound = random.choice(sounds) playSound.play() # ensure playback has been fully completed before resuming motion detection, prevents "spamming" of sound sleep(15) playSound.stop() else: print ("No motion")小さなバリエーションに注目してください。ランダム選択機能を使って、音の配列からランダムに音を選んで再生しているのです。
以下は、問題があった場合の完全なコードです。
import pygamefrom pygame.mixer import Soundfrom gpiozero import MotionSensorfrom time import sleepimport randompygame.init()pygame.mixer.init()#load a sound file, same directory as script (no mp3s)sounds = [ pygame.mixer.Sound("/home/pi/thunder.ogg"), pygame.mixer.Sound("/home/pi/scary_scream.ogg"), pygame.mixer.Sound("/home/pi/girl_scream.ogg"), pygame.mixer.Sound("/home/pi/psycho_scream.ogg") ]pir = MotionSensor(4)while True: if pir.motion_detected: print("Motion detected!") playSound = random.choice(sounds) playSound.play() # ensure playback has been fully completed before resuming motion detection, prevents "spamming" of sound sleep(15) playSound.stop() else: print ("No motion")4つのサンプルしかないため、それぞれの繰り返しの確率が高いが、これが煩わしい場合は、サンプルを増やすことができる。
それだ!茂みの中に隠して、LEDの怖いモンスターの目をつければ、子供たちがドアにたどり着く前に叫びながら逃げていくので、お菓子を節約することができるはずです。あるいは、ジョニーちゃんを泣かせた後、怒ったママが血を流したがっているから、クローゼットに隠れる。
免責事項:MakeUseOfは、あなたがこのプログラムを使用することによって発生する可能性のある人身事故について一切の責任を負いません
あなたは**このモーションアクティベートスピーカーは、地元のトリックまたは治療者を怖がらせるためにでしょうか?ハロウィンでRaspberry Piを使って何か怖い演出をしたことがありますか?下のコメント欄で教えてください