2021年6月16日水曜日

獣害対策「イノシシ避けマシン」を作る。【後編(ソフトウェア)】

イノシシ避けマシン

前編に引き続きまして、「イノシシ避けマシン」のソフトウェア部分です。


▼ Raspberry Piの下準備


まずは、Raspberry Piの下準備です。

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

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

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


音声の出力先を「USB Audio Device」に変更。



音量は、alsamixerコマンドで変更できます。F6のサウンドカード選択で「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くらいまで放電してしまって、充電器にバッテリーの認識がされない状態になってしまいました。一応、そのままつないでいたらじわじわ充電してくれたのですが、バッテリーにはすこぶる良くないみたいなので、今後は放置しないように気を付けます。
-----

あとは、肝心のイノシシ避けの効果があるかどうかですね。少しでも出現頻度が落ちてくれるといいのですけどね。


・関連投稿




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