ハエトリソウ捕食監視システム

Home > Advent Calendar > ハエトリソウ捕食監視システム
すき 0
うんこ 0

Raspberry Pi Advent Calendar 2019 | 5日目

長男くんがハエトリソウがハエを食べるところが見てみたいというので、ラズパイカメラで監視して捕食の瞬間を動画におさめるシステムを製作しました。

また こういったIoTシステムで一番問題となる電源の確保をソーラ発電によるエコエネルギーで実施したく同時にシステムに導入しました。

 

 
 

システム概要

システムはベランダに配置してラズパイカメラでハエトリソウを撮影しハエトリソウに虫を捕食するなどの動きがあるとその前後の動画を生成し、IFTTTを用いてケータイ端末に通知します。

電源はソーラパネルを使用して完全に自立したシステムとなります。

構成

ソーラパネルと鉛蓄電池をチャージコントローラに接続します。コントローラが出力する12Vをコンバータで5Vに変換してUSBコネクタで出力します。
負荷としてラズパイZero&ラズパイカメラをつなげます。

部品

  • ソーラー充電コントローラ E32-SolarCharger

    マイコンにESP32を使用。回路図は以下
     http://indoor.lolipop.jp/IndoorCorgiElec/E32-SolarCharger/E32-SolarCharger-Schematic.pdf
     

  • ソーラーパネル 12W

     
  • 鉛蓄電池 12V12Ah

     
  • インラインヒューズ コントローラと蓄電池の+側の配線に3Aヒューズ挿入

     
  • DC-DC コンバータモジュール 12Vー5V

     

  • Raspberry Pi Zero W

     
  • Raspberry Pi カメラモジュール

 

太陽光発電システム

Indoor Corgi Elec.社製のESP32を搭載した太陽光発電充電コントローラE32-SolarChargerを使用します。マイクロSDカードスロットもありデータログを記録できます。

以下のサイトで製品概要やサンプルコードが提供されています。

Arduino IDEでカスタマイズも比較的簡単にできます。ESP32搭載ですのでWiFiで動作状況や設定変更が可能です。

E32-SolarCharger 概要

  • バッテリの電圧と充電電流を監視してPWM制御します。
  • 液晶ディスプレイにバッテリ電圧・電流、ソーラパネル発電電圧、動作モードを表示
  • 測定値のログをSDカードに保存。
  • 負荷とバッテリ間のスイッチでバッテリ電圧が低下した際に負荷の切断が可能。
  • ソーラパネル発電電圧を観測して8Vを下回ると(夜間)コントローラをディープスリープさせて負荷のスイッチもオフして消費電力を抑える。
  • ESP32のWiFi機能でブラウザで各種数値表示や動作モード変更が可能

ブラウザ表示 (設定)

ここではターゲットとするバッテリ充電電圧を13.8V、充電電流を1Aとしました。スリープモードは有効にしています。

充電動作

我が家のベランダは西向きで晴天時でも午前中の数時間しか満足に日照がなかったので、夜間はチャージコントローラをスリープし、さらに鉛蓄電池と負荷の間のスイッチをOFFして消費電力を低減します。夜は撮影しても見えませんので。

昼と夜間はソーラパネルによる発電電圧によって判断します (8V以下でスリープ、10V以上で解除)。

撮影システム

ラズパイZero Wにラズパイカメラを搭載しハエトリソウを撮影します。

撮影システムはNode-REDで構築しました。電源起動で自動に動作します。

Node-RED自動起動設定

以下のコマンドの実行でNode-REDがサービス化されラズパイ起動で自動的に起動します。
夜間からのスリープ明けの起床時にも自動でNode-RED起動します。

撮影Node-Redフロー

ラズパイカメラでハエトリソウを撮影し、捕食などの動きを検出して動画を生成しスマホに通知を送信します。これをNode-REDで構築しました。

①初期起動 injectノード

injectノードのペイロードを”Started!”とすることでNode-REDが起動した際にトリガ起動します。

参考

 

②監視プログラム起動 execノード

シェルコマンドで監視プログラムを起動します。

 
シェルでハエトリソウ監視Pythonプログラムを起動します。

 

以下がハエトリソウ監視Pythonプログラムです。

 

通常動画撮影

OpenCVでカメラ撮影実施します (L 7~11)。
動画はmp4形式で取り扱います (L 14)。
撮影は1フレームごとにjpgで常に直近の300枚を保存するようにします (L 52~71)。

800フレーム分の撮影実施ごとにログとして画像を保存ファイルに残します (L 92~96)。

動体検知

フレーム間差分法でハエトリソウの動きを検出します (L 23~39、L 73~84)。
フレーム間の差分が閾値(ここでは6000)を3回超えるとハエトリソウが動いたと判断 (L86~90、L100)。

ハエトリソウの動き検知で直近の300枚のjpg画像を動画video1.mp4にします (L 101~105)。

その後1200フレーム分の動画を撮ってvideo2.mp4にします (L 42~49、L 108)。

後処理

動画撮影後、動体検知前の直近の300枚のjpg画像を削除し文字列”MOVE!!”を次のノードに渡します (L 112~120)。
 

参考

 

③動画ファイル名生成 functionノード

ハエトリソウ動作検出後に動画保存のためのファイル名を生成します。日付と時刻で”YYYY-MMDD-hhmm”の文字列を次のノードに渡します。

 

④動画合成 execノード

シェルコマンドで動画合成プログラムを起動します。

 

シェルでハエトリソウ動作の検出前の300フレーム分の動画 video1.mp4 と検出後の1200フレーム分の動画 video2.mp4 をffmpegで合成します。合成後のファイル名は③で生成した日時の文字列を使用します。

 

list.txtは以下の通りです。

参考

 

⑤IFTTT http requestノード

あらかじめIFTTTで設定しておいたWebhooksトリガのURLをPOSTします。

 

IFTTTの設定

IFTTTとはif this then thatの略で各種Webサービス同士を連携して自分好みのWebサービス(アプレット)を生成することができます。ここではthis(トリガ)にwebにリクエストを受信できるWebhooksを使用しthat(アクション)にスマホに通知を送るNotificationsを使用しました。

Webhooksのイベント名は”Flytrap”としました。以下URLをリクエストすると”ハエトリソウに動きあり!”とスマホに通知が来ます。
 https://maker.ifttt.com/trigger/Flytrap/with/key/”Webhook-key”  

“Webhook-key”にはWebhookサービス登録時に得られる認証キーを入力します。

 

以上で動画が保存されるとIFTTTを介してスマホに通知が行きます。

 

⑥delayノード

IFTTT通知後、5秒待って監視プログラム②を再開します。

 

動作

2019/7/14から10/27まで運用しましたが、残念ながらハエトリソウの捕食動画は撮影できませんでした。悲しみ 🙁 

フレーム間差分法で動作検出を実施しているため、急に太陽に雲がかかるなどで影が生成されても動作検出してしまう点が改善すべき点です。

雲の多い日はガンガン通知来ますが捕食はゼロでした。。。
来季は学習による画像認識などの検討も実施しリベンジしたいと考えております。

 

運用時は7分おきに静止画ログも残しておりましたので成長をタイムラプス動画にするなどで楽しむことはできました。

 

追記

2019/12/10 みんなのラズパイコンテスト

今年もこのネタでみんなのラズパイコンテストに参加いたしました!

今年は優良賞とスタートダッシュ賞のダブル受賞でした!わーい 😛 !

「ハエトリソウ捕食監視システム」への1件のフィードバック

コメントはこちらから

メールアドレスが公開されることはありません。コメントのみでもOKです。

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください