忍者ブログ

農業を始めよう

社会人向け農業大学校の生活を伝えます。

[PR]

2025/06/08(Sun)00:42

×

[PR]上記の広告は3ヶ月以上新規記事投稿のないブログに表示されています。新しい記事を書く事で広告が消えます。

No.|CommentTrackback

圃場(畑)タイムラプス(2)撮影用Raspberry Pi Zeroの設定

2019/03/18(Mon)21:13

タイムラプス撮影用Raspberry Pi Zeroの設定

作成するもの

圃場(バッテリー駆動)で一定時間毎に写真を撮影してシャットダウンするラズパイを作ります。電池を長期間持たせるために待機時は完全電源Offにします。電源制御は前回作成したArduinoモジュールにて行います。

用意するもの

  • Raspberry Pi Zero/W
  •  設定時に無線LAN接続の方が便利なので。予め無線でssh接続できるようにしておく。
  • PCF8523搭載 RTCモジュール(RTCモジュールなら何でも良い)
  • Raspberry Pi Zero用カメラ


RTC(リアルタイムクロック)の接続

電源を完全に落としたラズパイは時刻を保持できません。そのため写真の撮影時刻を記録するには外付けのRTC(リアルタイムクロック)を接続します。RTCはボタン電池で時刻を保持し続けてくれます。
RTCはi2c接続のため、RTCのVcc,GND,SDA,SCLをラズパイの当該ピンに接続します。

ラズパイの設定

I2Cの設定
sudo apt-get install python-smbus i2c-tools
sudo apt-get install -y python-smbus
sudo apt-get install -y i2c-tools
sudo raspi-config
  -Interfacing Options
  -I2C
  -Enable(Yes)

(reboot)

sudo vi /boot/config.txt
  最終行に追加
  dtoverlay=i2c-rtc,pcf8523

(reboot)

・アドレス68がUUであることを確認
sudo i2cdetect -y 1


・fake hwclockを無効にする
sudo apt-get -y remove fake-hwclock
sudo update-rc.d -f fake-hwclock remove
sudo systemctl disable fake-hwclock
sudo vi /lib/udev/hwclock-set
 3行をコメントアウトする
 #if [ -e /run/systemd/system ] ; then
 # exit 0
 #fi

・ラズパイの時刻をntpで合わせる
sudo apt-get install ntpdate
sudo ntpdate -v ntp.nict.jp
sudo timedatectl set-timezone Asia/Tokyo
date

・ラズパイからRTCの時間をセットする
sudo hwclock -D -r


・カメラの設定

sudo apt-get install python-picamera python3-picamera
sudo raspi-config
Interfacing Options > Camera > <Yes>でONにします。
reboot
・テスト撮影
raspistill -o image.jpg


・省電力設定

sudo apt install -y chkconfig
sudo chkconfig dphys-swapfile off  #swapの停止
sudo chkconfig plymouth off        #グラフィカルブートプロセス
sudo chkconfig triggerhappy off    #キーボードのショートカットキー
sudo chkconfig alsa-utils off      #サウンド関係
sudo chkconfig bluetooth off       #bluetooth
sudo apt-get install powertop
 BAD の項目はGood になるように変更(powertopが設定変更してくれる)

・メンテナンスモードの設定

運用時はOS起動後、撮影したらすぐにshutdownしてしまうので、メンテナンスログインができません。そのためGPIO 18番とGNDからジャンパ線を出して、ショートしているときのみ運用モードに入るようにします。

・写真を撮影するスクリプト

pi@raspberrypi:~ $ more getphoto.sh
#/bin/sh
raspistill -o ~pi/photo/`date '+%y%m%d-%H%M%S'`.jpg

・起動時の自動実行シェルを作成

pi@raspberrypi:~ $ more autoexec.sh
#!/bin/bash
~pi/autoexec.py
if test $? -eq 1; then
    echo `date '+%y%m%d-%H%M%S'` :boot with OffMente >>~pi/bootlog.log
    /etc/init.d/dhcpcd start
    systemctl daemon-reload
else
    echo `date '+%y%m%d-%H%M%S'` :boot with SHORT >>~pi/bootlog.log
    ~pi/getphoto.sh
    shutdown -P now
fi

・/etc/rc.local にautoexec.shを追記(OS起動時にroot権限で実行される)


・GPIOの値を判定するpythonスクリプト

pi@raspberrypi:~ $ more autoexec.py
#!/usr/bin/python
# coding:utf-8
import time
import RPi.GPIO as GPIO
import sys
GPIO.setmode(GPIO.BCM)
#GPIO18pinを入力モードとし、pull up設定とします
GPIO.setup(18,GPIO.IN,pull_up_down=GPIO.PUD_UP)
sw_status = GPIO.input(18)
if sw_status == 0:
    print("SHORT!")
if sw_status == 1:
    print("OFF!")
GPIO.cleanup()
sys.exit(sw_status)

・全てが動作するのを確認したら、無線LANの自動起動をOFFにします

sudo chkconfig dhcpcd off

・完成写真(右下は温湿度+照度監視モジュール)

PR

No.2|農業+IoTComment(0)Trackback

圃場(畑)タイムラプス(1)Arduino で作るRaspberry Pi 間欠動作用の電源制御モジュール

2019/03/17(Sun)12:21

圃場(畑)のタイムラプス動画を撮りたい
作物の生育状況をタイムラプス動画にすれば楽しいと思いませんか。また別途作成した温湿度+照度モニタのデータと組み合わせれば、数値的な分析の助けになるかもしれません。
圃場タイムラプスはバッテリー駆動が前提なので、実現にはarduinoもしくはRaspberry Piを間欠動作させて撮影します。arduino+カメラ+SDの方が消費電力とシンプルさから現実的ですが、今回はRaspberry Pi+カメラを間欠動作させます。
ラズパイの間欠動作と電源制御
Raspberry Piはshutdown時も電気を消費するので、一定間隔で通電On/Offを制御する仕組みが必要です。sleePiという製品もありますが少し高価なので、今回はarduino+リレーで代替品を作ります。
arduinoの動作仕様
一定間隔でUSBモバイルバッテリーの通電をOn/Offする
arduino本体は電池駆動にする(通常のモバイルバッテリーは消費電力が低いと電源切断されるため)
用意する部品
Arduino Pro Mini 328 3.3V 8MHz
Grove リレー (スイッチサイエンス)
その他作業に必要:Arduino Pro にスケッチを書き込むUSB-シリアル変換基板(5v/3.3v対応)
制限事項
ラズパイ側は電源を落とすと時計が狂うので、RTC(リアルタイムクロック)を持たせる
Arduino側は電源On時から一定間隔でラズパイのOn/Off制御を行う(RTCは省略)
ラズパイのshutdown検知は行わない
完成イメージ

作成手順
Arduino Pro mini にピンヘッダを半田付け
充電池(1.2v)×3の電源の+をraw、-をGNDに接続
GROVEリレーの赤をvcc,黒をGND,黄色をD4に接続
USBケーブルを切断して、黒を直結、赤をリレーの緑コネクタに接続
Arduinoスケッチ
/*
 *   Raspberry Pi Power control
 */
#include <Narcoleptic.h>
// Constants
//const uint32_t upload_interval = 60UL * 60UL * 1000UL; // about 1 hour
const uint32_t upload_interval = 480UL * 60UL * 1000UL;  // 8hour
const uint32_t powerOnTime = 80UL * 1000UL;              // about 80s
const int relayPin = 4;  //D4
const int ledPin = 13;
// Globals
uint32_t last = 0;
// resetMyself() - Reset myself 
void(* resetMyself) (void) = 0;
// setup() - set up function
void setup() {
  pinMode(relayPin, OUTPUT);
}
// loop() - loop body function
void loop() {
  uint32_t start = millis();
  //On
  digitalWrite(relayPin, HIGH);
  digitalWrite(ledPin, HIGH);
  //Wait
  delay(powerOnTime);
  //Off
  digitalWrite(relayPin, LOW);
  digitalWrite(ledPin, LOW);
  // Sleep mcu until next time
  uint32_t t = (last + upload_interval) - (millis() - start);
  last = millis();
  prepareToSleep();     // Set MCU GPIOs for sleep
  Narcoleptic.delay(t); // Sleep MCU with WDT
  // Wake up, restart from reboot
  resetMyself();
}
// prepareToSleep() - Prepare to sleep()
void prepareToSleep(void) {
  // Set GPIO pins for sleep
  for (int i = 0; i < 14; i++) {
    pinMode(i, OUTPUT);
  }
}
スケッチ(プログラム)の動作
スケッチは約8時間毎に80秒通電させるものです。USB microBをラズパイzeroの電源用USBに、Type Aをモバイルバッテリーに接続します。
モバイルバッテリーは消費電力があまりに少ないと電流を止める回路が組まれているので、ラズパイzeroの低電流でも動作するものを選ぶ必要があります
(運次第)。IoT用に電流遮断機能がないものもあります。
プログラムはインターフェイス2018/10の記事を参考にしました。Sleepはhttps://github.com/brabl2/narcolepticライブラリを使用しました。
ラズパイのプログラムはOS起動時に動作して、終了後にshutdownをかけるように組みます。
数週間動作させた補足
Arduinoは8時間毎に起動させる設定ですが、±2時間程度の誤差が生じることがわかりました。正確な間欠動作が必要ならRTCを工夫する必要があります。

No.1|農業+IoTComment(0)Trackback