前編に引き続きまして、「イノシシ避けマシン」のソフトウェア部分です。
▼ Raspberry Piの下準備
まずは、Raspberry Piの下準備です。
② IPアドレスの固定
③ VNC、SSHを有効化
④ PythonのデフォルトをPython3に変更
⑤ 日本語入力パッケージのインストール(「fcitx-mozc」、「ibus-mozc」 等)
やり方は、検索すればたくさんでてきますので省略。
②③は、モニターとキーボード、マウスをつなぐのが大変なので、リモートアクセスで作業できるようにします。⑤の日本語入力は必要があれば。
音声の出力先を「USB Audio Device」に変更。
scheduleモジュールを、pipコマンドで入手します。後ほどデーモン化を行う際にsystemdのuserモードを使うので、sudoコマンドは使わずにインストールします。
$ pip3 install schedule
それから、これはどちらでもいいのですが、スマホのテザリングに接続できるようにしておくと、(Wi-Fiの届かない)設置先で何かちょっとした操作をしたい時に、スマホからSSHで接続できて便利です。この場合は、設置前にIPアドレスの固定を解除しておきます。
スマホからSSH接続する際は、テザリングしているスマホからIPアドレスを調べます。(Androidですと普通に調べられるのですが、iPhoneはよく分かりません。一応、IPアドレスのパターンが決まっているみたいなので順に試せばいけるのかな。)
▼ 音声データの用意
イノシシが驚きそうな、もしくは警戒しそうな音声データを用意します(mp3、もしくはogg形式のもの)。検索すれば、フリーの音声データも見つかるかと思います。
人感センサーが反応した際に流す音声と定期的に流す音声の2種類が必要です。バッテリー容量の都合で、音声データの時間は短いものの方がいいと思います(数秒〜1分程度)。
今回は、とりあえず「sound_1.mp3」「sound_2.mp3」としてスクリプト内で扱います。音声ファイルは「/home/pi/Music」フォルダに置いておきます。
▼ Pythonスクリプトの作成
スクリプトファイルは、「/home/pi/Python/wild_boar」など、適当なフォルダを用意して、そこに置きます。
まずは、人感センサーが反応した際に音声を流すスクリプトです。19時から翌朝5時まで間に人感センサーが反応すると音声が流れます。
ファイル名は「ms_sound.py」(何でもいいです)。
#!/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: now = datetime.now() now = now.hour if(GPIO.input(GPIO_PIN) == GPIO.HIGH and (19 <= now <= 23 or 0 <= now <= 5)): pygame.mixer.init() pygame.mixer.music.set_volume(1) pygame.mixer.music.load("/home/pi/Music/Sound_1.mp3") pygame.mixer.music.play(1) time.sleep(音声データの秒数) pygame.mixer.music.stop() time.sleep(SLEEPTIME) else: time.sleep(INTERVAL) except: pass finally: GPIO.cleanup()
※ コードを一部修正をしました。(2021-6-22)
書き換えが必要な箇所は以下の通り。
・21行目「19 <= now <= 23 or 0 <= now <= 5」
音声が流れる時間を指定します。19時から翌朝5時ですと「19 <= now <= 23 or 0 <= now <= 5」となります。丸一日だと「0 <= now <= 23」です。
・26行目「音声データの秒数」
音声データの秒数を記述します。1分の音声データであれば「60」。
次に、定期的に音声を流すスクリプトです。19時から翌朝5時まで、1時間おきに音声が流れます。
ファイル名は「skd_sound.py」(何でもいいです)。
#!/usr/bin/env python3 import schedule import time import pygame.mixer def skd(): pygame.mixer.init() pygame.mixer.music.set_volume(1) pygame.mixer.music.load("/home/pi/Music/Sound_2.mp3") pygame.mixer.music.play(1) time.sleep(音声データの秒数) pygame.mixer.music.stop() schedule.every().day.at("19:00").do(skd) schedule.every().day.at("20:00").do(skd) schedule.every().day.at("21:00").do(skd) schedule.every().day.at("22:00").do(skd) schedule.every().day.at("23:00").do(skd) schedule.every().day.at("00:00").do(skd) schedule.every().day.at("01:00").do(skd) schedule.every().day.at("02:00").do(skd) schedule.every().day.at("03:00").do(skd) schedule.every().day.at("04:00").do(skd) schedule.every().day.at("05:00").do(skd) while True: schedule.run_pending() time.sleep(1)
書き換えが必要な箇所は以下の通り。
・12行目「音声データの秒数」
音声データの秒数を記述します。1分の音声データであれば「60」。
・15~25行目「schedule.every().day.at("時刻").do(skd)」
上のスクリプトでは、19時から翌朝5時の1時間おきの時刻を指定してあります。scheduleの指定の仕方はこちらを参照ください(英語ですが、翻訳すればだいたい分かります)。
▼ Pythonスクリプトのデーモン化
「ms_sound.py」と「skd_sound.py」をデーモン化します。デーモン化を行うことで、Raspberry Piの電源を入れると自動的にプログラムが実行されます。
デーモン化は、systemdのuserモードで行います。やり方は、こちら(systemdのuserモードでデーモン化をする)を参考にしてください。
▼ 使い方
ということで、完成です。
使い方は、とても簡単。Raspberry Piとアンプの電源を入れて設置するだけです。
懸念点は、完全放置でバッテリー残量を維持できるのかどうかです。太陽光発電なので、もちろん天気次第ではあるのですが、加えて、アンプの消費電力が大きいのですよね。テスターで確認したところ、音がなっていない時の消費電気はほとんどなく、想定する音声再生時間であれば計算上は(たぶん)いけるはずなのですが……。
-----
・追記(2021-7-12)
太陽光が全く射さない日が2日以上続くようだとバッテリー切れますね。
バッテリーが5V以下まで過放電してしまうと充電自体が難しくなるので、天気が悪い時には早めに回収して、バッテリー充電器でコンセントから充電してしまった方がよさそうです。
ちなみに、曇り空の下に数日放置したら2Vくらいまで放電してしまって、充電器にバッテリーの認識がされない状態になってしまいました。一応、そのままつないでいたらじわじわ充電してくれたのですが、バッテリーにはすこぶる良くないみたいなので、今後は放置しないように気を付けます。
-----
あとは、肝心のイノシシ避けの効果があるかどうかですね。少しでも出現頻度が落ちてくれるといいのですけどね。
-----
・追記(2021-9-20)
-----
・関連投稿