【農業×IoT】データ収集用ラズパイを構築中(プロジェクトレポート Vol.2)

活動中の『農業×IoT』新プロジェクト。

そのうち、ラズパイを使ったデータ収集機を準備しておりますので、そちらをご紹介いたします。

※プロジェクトレポート Vol.1 でご紹介した「構築物4:ラズパイで動体検知」です。

レポート

弊社にて活動を開始した『農業 × IoT』新プロジェクト。 まだまだ案件立ち上げにも満たない状況であり、この先どうなるかも分かりません。 しかし、いざ実現性・実効性が見えてきた時に、多くの方のご協力が必要になることは間違いありません[…]

おことわり

当記事は、現時点で公開できる情報のみの掲載となります。

機密情報等もございますので、行間がなくてやや「?」かもしれませんが、その点はご了承ください。

また、当記事のご利用によって不都合・不具合などが発生した場合においても、弊社においては何の責も負いません。

全体概況

現在『準備#1』(2022.06)

構築物:ラズパイ+Motion

データ収集のための機器の一つとして準備しているラズパイ。
(他にも様々なパターンを準備中)

今回、ラズパイ自体の使い方も様々なパターンがありますが、そのうちの1つをご紹介いたします。

ラズパイ+Motion を使った動体検知(+e-Paperの活用)(+3Dプリント専用ケース)です。

e-Paperの搭載は正直不要ですが(笑)、手元に余っていたので活用してみました。

ラズパイのキッティング

旧OS「Raspbian」から比べると、新世代の「Raspberry Pi OS」は圧倒的にキッティングが楽になりました。

公式に「Raspberry Pi Imager」がありますので、WindowsやMacにインストール。
MicroSDを挿入して、「Raspberry Pi Imager」に従って書き込めばOKです。

書き込み前の設定で「SSHの開放」「WiFi設定」なども行えます。
最初からラズパイをSSH接続するハードルが随分と下がりました。
(以前も、少し細工すれば可能でしたが)

ラズパイが起動しましたらSSH接続し、必要な準備をしていきましょう。

関連記事

Raspberry Piのセットアップから、よく使うコマンドをまとめたページです。(ラズパイに限らず、一般的なLinuxコマンドも含みます。) ラズパイは安いので(^^;; 何台も作ることになると思います。何度も同じ事を調べなくてよいよう[…]

Raspberry Pi 土台環境構築

Motionのインストール

今回の用途となる、「動体検知」に使うための「Motion」。
監視カメラが簡単に作れます。

これで無償ソフトウェアなので、恐るべし・・・です。。。
(感謝しかありません・・・)

インストールも簡単です。
下記の記事などをご参考ください。

親子ボードゲームで楽しく学ぶ。

前回から間があいてしまいましたが、今回はRaspberry Piを使って動体検知で動画を記録する監視カメラを作ります。 …

Motionは、設定値をどうするか、が肝です。

設定に関しては、やはり公式が一番です。

Motionは、ブラウザでストリーミング画像を確認することもできます。
すごいですね・・・!

e-Paperの活用

「waveshare」のe-Paper(4ボタン搭載)があり、何かと便利かも・・・?と思い、活用してみました。
GPIO接続のe-Paperです。

自身が購入した当時よりも値上がり&品薄状態です・・・

この「waveshare」のパーツは結構気に入っていて、ライブラリやサンプルがしっかりと提供されています。

手順に従ってインストールを行い、サンプルに沿ってコードを改変していけば、大抵のことは実現できるかと思います。

以前、メールサポート(無料)を利用したこともあるのですが、丁寧な印象があります。
(英語での応対です)

※操作用のスクリプトは以下にて。

独自運用スクリプトの構築

以下に記載するe-Paperのボタンや、運用を考え、スクリプトをいくつか作成します。

MotionデータをFTP&ローカル削除

Motionで撮影した写真・動画は、とりあえずラズパイ内に保存しています。

ただ、放置していると容量溢れでご臨終となるので、別途、データ格納場所を用意しています。

そちらへのFTP&Motionデータの削除を行うスクリプトを作成しておきました。

  • FTPアカウントのパスワードはベタ書きです。ご注意ください
  • FTP PUT時に重複しないように、タイムスタンプ付きのフォルダを作成しています
  • Motionのデータを削除していますのでご注意ください
#!/bin/sh

# Motionデータの移動
sudo mv -f /home/pi/motion/* /home/pi/xxx/


# FTP
FOLDER=`date '+%Y%m%d-%H%M%S'`

ftp -p -n -i <<END
	open connectname
	user user password
	binary
	mkdir $FOLDER
	cd $FOLDER
	lcd /home/pi/xxx
	mput *
	bye
END


# Motionデータの削除
sudo rm -f /home/pi/xxx/*

ボタン反応用のPythonプログラム

ボタンを押す -> 必要な処理を起動させる
Pythonプログラムです。

  • Pythonファイル名は任意です
  • e-Paper表示用のフォントの配置が必要です(フォントはe-Paperのサンプルに含まれていました)
  • IPアドレスをe-Paperに表示していますが、”wlan0″を個別に指定しています(任意のものに変更してください)
  • エラーハンドリングはザルですのでご注意ください
  • 必要なライブラリ(import)が不足している場合は、「sudo pip3 install xxx」で追加してください
  • 表示デザインは何も考えていません(笑)
#!/usr/bin/env python3

import RPi.GPIO as GPIO # RPi.GPIOモジュールを使用
import time
import subprocess # Pythonからコマンドを発行

# e-Paper
from waveshare_epd import epd2in7
from PIL import Image,ImageDraw,ImageFont
import sys
import os
picdir = os.path.join(os.path.dirname(os.path.dirname(os.path.realpath(__file__))), 'pic') # /home/pi/pic
font24 = ImageFont.truetype(os.path.join(picdir, 'Font.ttc'), 24)
font18 = ImageFont.truetype(os.path.join(picdir, 'Font.ttc'), 18)
font35 = ImageFont.truetype(os.path.join(picdir, 'Font.ttc'), 35)

# Utility
import ipget

 

# スイッチのGPIO番号(HWによる)
gpio_sw1 = 5
gpio_sw2 = 6
gpio_sw3 = 13
gpio_sw4 = 19

# GPIO番号指定の準備
GPIO.setmode(GPIO.BCM)

# ボタンのセットアップ
GPIO.setup(gpio_sw1, GPIO.IN, pull_up_down=GPIO.PUD_UP)
GPIO.setup(gpio_sw2, GPIO.IN, pull_up_down=GPIO.PUD_UP)
GPIO.setup(gpio_sw3, GPIO.IN, pull_up_down=GPIO.PUD_UP)
GPIO.setup(gpio_sw4, GPIO.IN, pull_up_down=GPIO.PUD_UP)

# スイッチの状態を取得
sw1 = GPIO.input(gpio_sw1)
sw2 = GPIO.input(gpio_sw2)
sw3 = GPIO.input(gpio_sw3)
sw4 = GPIO.input(gpio_sw4)

 

#########################################
###### e-Paper デフォルト画面
#########################################
def e_paper_default():
    epd = epd2in7.EPD()
    epd.init()
    epd.Clear(0xFF)
    Himage = Image.new('1', (epd.height, epd.width), 255) # 255: clear the frame
    draw = ImageDraw.Draw(Himage)
    draw.text((10, 0), 'KEY1: reboot', font = font24, fill = 0)
    draw.text((10, 20), 'KEY2: FTP and Cleaning', font = font24, fill = 0)
    draw.text((10, 40), 'KEY3: Motion Start', font = font24, fill = 0)
    draw.text((10, 60), 'KEY4: Motion Stop', font = font24, fill = 0)
    draw.text((10, 100), ipget.ipget().ipaddr("wlan0"), font = font24, fill = 0)
    epd.display(epd.getbuffer(Himage))

 

#########################################
###### メイン処理
#########################################

# デフォルト画面表示
e_paper_default()

 

# スイッチの状態を永続監視、押されたら(==0)割り当てた処理を実行
try:
    while True:
    if sw1 == 0:
        
        epd = epd2in7.EPD()
        epd.init()
        epd.Clear(0xFF)
        Himage = Image.new('1', (epd.height, epd.width), 255) # 255: clear the frame
        draw = ImageDraw.Draw(Himage)
        draw.text((10, 0), 'EXEC KEY1', font = font24, fill = 0)
        draw.text((10, 50), 'rebooting...', font = font24, fill = 0)
        epd.display(epd.getbuffer(Himage))
        
        subprocess.run("sudo reboot", shell=True, text=True)
        
        e_paper_default()
        
        sw1 = 1
        time.sleep(1)
    
    elif sw2 == 0:
        
        epd = epd2in7.EPD()
        epd.init()
        epd.Clear(0xFF)
        Himage = Image.new('1', (epd.height, epd.width), 255) # 255: clear the frame
        draw = ImageDraw.Draw(Himage)
        draw.text((10, 0), 'EXEC KEY2', font = font24, fill = 0)
        draw.text((10, 50), 'FTP and Cleaning...', font = font24, fill = 0)
        epd.display(epd.getbuffer(Himage))
        
        subprocess.run("xxx", shell=True, text=True) # 任意のコマンドに変更
        
        e_paper_default()
        
        sw2 = 1
        time.sleep(1)
    
    elif sw3 == 0:
        epd = epd2in7.EPD()
        epd.init()
        epd.Clear(0xFF)
        Himage = Image.new('1', (epd.height, epd.width), 255) # 255: clear the frame
        draw = ImageDraw.Draw(Himage)
        draw.text((10, 0), 'EXEC KEY3', font = font24, fill = 0)
        draw.text((10, 50), 'Motion Starting...', font = font24, fill = 0)
        epd.display(epd.getbuffer(Himage))
        
        subprocess.run("sudo service motion start", shell=True, text=True)
        
        e_paper_default()
        
        sw3 = 1
        time.sleep(1)
    
    elif sw4 == 0:
        epd = epd2in7.EPD()
        epd.init()
        epd.Clear(0xFF)
        Himage = Image.new('1', (epd.height, epd.width), 255) # 255: clear the frame
        draw = ImageDraw.Draw(Himage)
        draw.text((10, 0), 'EXEC KEY4', font = font24, fill = 0)
        draw.text((10, 50), 'Motion Stopping...', font = font24, fill = 0)
        epd.display(epd.getbuffer(Himage))
        
        subprocess.run("sudo service motion stop", shell=True, text=True)
        
        e_paper_default()
        
        sw4 = 1
        time.sleep(1)
    
    
    
    # 再度読み込む
    sw1 = GPIO.input(gpio_sw1)
    sw2 = GPIO.input(gpio_sw2)
    sw3 = GPIO.input(gpio_sw3)
    sw4 = GPIO.input(gpio_sw4)
    
# ctrl + c で終了
except KeyboardInterrupt:
    # 後処理 GPIOを解放
    GPIO.cleanup(gpio_sw1)
    GPIO.cleanup(gpio_sw2)
    GPIO.cleanup(gpio_sw3)
    GPIO.cleanup(gpio_sw4)
    
    epd = epd2in7.EPD()
    epd.Clear(0xFF)
    epd.sleep()

ボタン反応のためにPythonプログラムをデーモン化

ラズパイ起動とともに常駐しておいてほしいので、デーモン化します。

上記のPythonプログラムをデーモン化すればOKです。

以下の記事で全て解決できますので、ご参照くださいませ。
(記事ありがとうございます!)

My,WebNote - 備忘録 -

Raspberry Pi(ラズパイ)でPythonのプログラムをデーモン化(常駐ソフト化)する方法の覚書。…


これらの準備で、SSHを接続することなく、最低限の操作が行えるようになりました。

※現地でのネットワーク環境への適合や、リブートではなくシャットダウンがよいか・・・?など、まだまだ色々とありますが。

3Dプリンターによる専用ケース作成

専用ケースとなる3Dモデルを作成し、3Dプリンタで印刷です。

要件に完全にマッチしたサイズで作れますので、3Dプリンタって素晴らしいですね。

使っているのはXYZ Printingの「ダヴィンチ Jr. Pro X+」という機種です。
(なお、当件の内容程度でしたらエントリーモデルで十分です)

印刷中は、うまく出来るかいつもドキドキです・・・!

要件

  • カメラを(ケースで)ある程度固定したい
  • ラズパイ本体もある程度固定したい
  • できるだけ防水・防塵ケースにしたい
  • 電源供給は外部から(モバイルバッテリーは使わない)
  • カメラレンズがケラれないようにする必要あり
  • ラズパイの回収が簡単にできること
  • 出来れば、複数のラズパイ(の形)に対応

出来上がり

これらを考えつつ、以下のようなケースを作りました。

ラズパイ3B+、ラズパイZERO WH、ラズパイ4でも使えます。
固定する足の場所を、どちらにも対応するように作りました。

]

ラズパイ本体を「六角真鍮」などで浮かせる必要があります。

USBケーブルで給電しながら使えるように、穴を開けています。

ちなみに、小さなモバイルバッテリーや、写真のようなUPS HATを装着することで、ケーブルレスで稼働させることができます。

所感

正直、豪雨に対応できるとは思えませんが、、、
どうなることやら、も今回の検証です。

できるだけ防水・防塵にするために、排熱を諦めています。
この点もどうなることやら・・・です。
ラズパイ4は危ないかもしれません。

※防水・防塵が必要のないケースでは、フタをしない運用でOKです。

3Dプリントデータご提供

弊社サービス「デジタル活用塾360」にて、3Dプリントデータを無償公開しております。

御入り用の方は、そちらから入手ください。

※完全な防水・防塵ケースではありません。
取り扱いは自己責任でお願いいたします。

データを入手する >>>

MicroSDのバックアップ

同じことを何度もキッティングするのは無駄ですので、バックアップしておきましょう。

関連記事

Raspberry Piは手軽に使えるのはよいのですが、壊してしまったり、(ライブラリなどが)汚くなってしまった時に再インストールするのは面倒なもの。 時間もかかりますしね。 そういった時は、バックアップを取得し、リストアするのが([…]

同志募集中^^

まだまだ企画立ち上げの段階ではありますが、この先、多くの方のご協力が必要になることは間違いありません。
少しでもご興味があります方は、ぜひ、お声がけいただけますと嬉しいです!

雑談、情報交換会、入れ知恵(笑)など、楽しくコミュニケーションできますと嬉しいです。
(Zoom等も可能です)

また、上述でご紹介したアプリ等に関するご質問・ご相談も可能です。
(カスタマイズ等も含めて)ご提供することも可能です。

Gloria, Limited

株式会社グロリア 代表 石黒直樹 弊社にご興味をお持ちいただきありがとうございます。 当サイトコンテンツ、サービスに関す…

まだまだ出だしでしかありませんが、日本の農業の課題を解決すべく、弊社の力も注いでいきたいと思います!

次のレポート

レポート

活動中の『農業×IoT』新プロジェクト。 できる限りの機材準備を行い、現地にて設置を行ってきました。 今回は、そうした様子をご紹介いたします。 ※過去レポートは以下を参照ください。 [sitecard subtitle=[…]

プロジェクトレポート INDEX

レポート

弊社にて活動を開始した『農業 × IoT』新プロジェクト。 まだまだ案件立ち上げにも満たない状況であり、この先どうなるかも分かりません。 しかし、いざ実現性・実効性が見えてきた時に、多くの方のご協力が必要になることは間違いありません[…]

レポート

活動中の『農業×IoT』新プロジェクト。 そのうち、ラズパイを使ったデータ収集機を準備しておりますので、そちらをご紹介いたします。 ※プロジェクトレポート Vol.1 でご紹介した「構築物4:ラズパイで動体検知」です。 [[…]

レポート

活動中の『農業×IoT』新プロジェクト。 できる限りの機材準備を行い、現地にて設置を行ってきました。 今回は、そうした様子をご紹介いたします。 ※過去レポートは以下を参照ください。 [sitecard subtitle=[…]

※ご回答希望の場合は、ご連絡先も記入ください
"意見が持てる" デジタルコラム
絶賛配信中!

メルマガ詳細はこちら >>>

送信時点で「Privacy Policy」に同意したものとみなします。
広告を含むご案内のメールをお送りする場合があります。
   
         
最後までお読みいただき、ありがとうございました。
以下も、ぜひご活用ください^^
出版物
ITmedia
メルマガ
Site Access Log by HTTP Header
>情報システムの

情報システムの"教科書"本を発売中!


■ 情シス、システムコンサルタント、システムエンジニアの方へ
情シスの定石(技術評論社)

■ システムエンジニア、情シスの方へ
2023年10月7日(土)発売
システム設計の教科書(技術評論社)

CTR IMG

■ 著者 石黒直樹による書籍説明動画