定期撮影Raspberry Piカメラをモバイルバッテリーで長期運用 (RPZ-PowerMGR)

Raspberry Pi(ラズパイ)と純正カメラを使用して、定期的に撮影するタイムラプス機能を実装する方法を解説します。RPZ-PowerMGR拡張基板を使うことで、指定時刻に起動し、撮影後は自動的にシャットダウン&電源OFFします。待機時の消費電力をカットすることで、モバイルバッテリーで長期運用が可能になります。

Raspberry Pi OS Version 2022-01-28対応

更新日 : 2022年7月3日

Raspberry Piカメラの課題

Raspberry Piは大変便利な小型コンピューターで、カメラを接続することで、プログラム可能なカメラシステムも構築できます。一方、遠隔地でバッテリーで運用する場合、待機中にも電力を消費してしまうため、長期運用が難しいという課題があります。

RPZ-PowerMGR拡張基板を使うと、カメラで撮影するときだけ電源ONし、撮影後自動的にシャットダウンすることができます待機時の消費電力をカットすることで、モバイルバッテリーで長期運用が可能になります。Raspberry Piやバッテリー容量、撮影頻度にも依存しますが、数カ月の運用も可能です。

本記事では、決まった時間に写真を撮影するシステムを構成する方法を解説します。

ハードウェア構成

ハードウェア構成

今回使用したハードウェアは以下のとおりです。

Raspberry Pi本体

今回は消費電力の低いRaspberry Pi Zero WHを使用しましたが、40ピン端子を搭載したRaspberry Piシリーズでも問題ありません。

カメラ

HQカメラを使用しましたが、Raspberry PiカメラモジュールV2でも同じコマンドが使えるので問題ありません。HQカメラだと市販のカメラ用三脚が取り付けられるので、向きの調整がしやすいです。また、画質も良くなります。

Raspberry Pi Zeroシリーズはカメラ端子が他のRaspberry Piより小さいので、ケーブルを別途用意する必要があります。Raspberry Pi 3/4 などであればカメラに付属しているケーブルが使えます。

カメラのセットアップ方法は以下の記事を参照してください。

Raspberry Piカメラモジュールのセットアップと使い方 (V2、HQ対応)

Raspberry Pi(ラズパイ)に純正カメラモジュールを接続して、写真を撮影する方法の解説です。HQカメラのレンズ取り付けとフォーカスの調整についても解説しています。

システムの仕組み

システムがどのように動作するのか、仕組みを解説します。

指定した時刻になると(1)、RPZ-PowerMGRがRaspberry Piの電源をONします(2)。

Raspberry Piが起動すると、起動時に実行されるように指定したプログラム「camera_shot.py」が開始されます。まず、写真を撮影し(3)、画像データを保存します(4)。

その後、自動的にシャットダウンを開始し(5)、完了するとRPZ-PowerMGRに通知され(6)、Raspberry Piの電源がOFFになります(7)。ただし、(5)から(7)の工程は、カメラが装着されている場合のみ行います。これは、全ての撮影が完了した後は自動シャットダウンしないようにするためです。


RPZ-PowerMGRセットアップ

RPZ-PowerMGRのセットアップの全手順は製品ページのセットアップ(ハードウェア)セットアップ(ソフトウェア)を参照してください。本記事では初期セットアップ完了後、撮影のために指定時刻に電源ONする設定を解説します。

指定時刻に電源ON/OFFする機能の詳細は、以下の記事でも解説しています。

指定時刻にRaspberry Piの電源をON/OFF (RPZ-PowerMGR)

RPZ-PowerMGRを使って、指定時刻にRaspberry Pi(ラズパイ)の電源ON/OFFする方法の解説です。決まった時間だけ起動して消費電力を抑えることが可能で、モバイルバッテリーやソーラーシステムでの運用に最適です。

ファイル構成

次に、起動後に自動で撮影してシャットダウンするプログラムについて解説します。既に作成済のプログラムをこちらからダウンロードできます。

「camera_shot.py」がプログラム本体で、/home/piに配置します。

「camera_shot.service」は、起動した後に自動で実行するための登録に必要なファイルで、スーパーユーザーで/etc/systemd/systemにコピーして下さい。撮影した画像は/home/pi/Picturesに、「日時.jpg」という名前で保存されます。このディレクトリは最初からあると思います。

まとめると、以下のような構成となります。

/ --- etc  --- systemd --- system --- camera_shot.service
   |
   -- home --- pi --- camera_shot.py
                   |
                   -- Pictures --- 日時.jpg

camera_shot.pyプログラム

camera_shot.pyプログラムの中身を見ていきます。

6-8行目

Raspberry Pi OS Bullseye (バージョン2021-10-30)からカメラ撮影コマンドがraspistillからlibcamera-stillに変更になりました。Buster(バージョン2021-05-07)以前、もしくはLegacy版をお使いの場合は、8行目のlibcamera-stillをraspistillに変更して下さい。

dt = datetime.datetime.now()
print('写真撮影')
result = subprocess.run(['libcamera-still', '-n', '-o', dt.strftime('/home/pi/Pictures/%y_%m%d_%H%M.jpg')])

datetimeモジュールの機能で現在時刻を取得しています。その後、subprocessモジュールの機能でlibcamera-stillコマンド(写真撮影)を実行し、/home/pi/Picturesディレクトリに「現在日時.jpg」という名前で撮影画像を保存します。

2022/2/22 : Bullseyeと一部ハードウェアの組み合わせでプレビュー画面を表示するとうまく動作しない現象が確認されたため、-nオプションを追加しました。

10-12行目
if result.returncode == 0:
  print('シャットダウン')
  subprocess.run(['sudo', 'halt'])

撮影後のシャットダウン処理を記述しています。必ずシャットダウンしてしまうと、全ての撮影を終えた後に操作できず困ります。そこで、カメラが接続されているときだけシャットダウンするようにします。

撮影コマンドの結果はresult変数に保存されています。コマンドが正常に終了すると、returncodeが0になるので、シャットダウンコマンドを実行します。Raspberry Piでは、piユーザーはパスワード無しでsudoが実行できます。

一方、カメラが接続されていなければコマンドが失敗し、returncodeが0以外になるため、シャットダウンされません。

動作確認

動作確認をしてみましょう。カメラを装着して、ターミナルで以下の$に続くコマンドを実行します。「写真撮影」、「シャットダウン」と表示され、シャットダウンが始まればOKです。RPZ-PowerMGRが正しくセットアップされていると、シャットダウン完了後に電源が切れます。

$ ./camera_shot.py
写真撮影
シャットダウン

次に、カメラを装着しない状態でRaspberry Piを起動し、同じように以下のコマンドを実行します。「写真撮影」のあとシャットダウンしなければOKです。

$ ./camera_shot.py
写真撮影

Pythonプログラミングの基礎、およびGPIOの制御方法については以下の解説記事もあるので、参考にして下さい。

Raspberry PiでPythonプログラミング入門

Python(パイソン)とは世界的に人気のあるプログラミング言語の一つです。Pythonを使えばほぼどんなプログラムも実現できると言っても過言ではなく、GPIOピンを使って、センサーや拡張基板と通信することもできます。本記事では、プログラミング初心者の方向けに、Pythonのコードの記述と実行方法、文法の基礎を解説しています。

PythonでRaspberry PiのGPIO、LED、スイッチ制御

Raspberry Pi(ラズパイ)では、GPIOを通じて電気信号を送受信することで、様々なデバイスを制御することができます。本記事では、基本的なLEDとスイッチについて、Pythonプログラムで制御する方法を解説します。LEDにステータスを表示させたり、スイッチが押されたら何らかの動作をさせるなど、自分が好きなように動作をプログラミングすることが可能になります。

camera_shot.serviceを登録

camera_shot.pyで撮影とシャットダウン機能が実現しました。次は、Raspberry Pi起動時に自動的にcamera_shot.pyを実行するように設定していきます。

これには、systemdの機能を使います。systemdには、OS起動時にシステムで必要な様々なソフトウェアを立ち上げる機能がありますが、ユーザーのプログラムも登録することが可能です。この登録内容を指示するのが、「camera_shot.service」ファイルです。中身は以下のようになっています。

[Unit]
Description=Camera shot on startup
After=multi-user.target

[Service]
Type=oneshot
User=pi
ExecStart=/home/pi/camera_shot.py
Restart=no

[Install]
WantedBy=multi-user.target

Descriptionは内容の簡単な説明です。

Userは実行ユーザーを指定します。

ExecStartは実行するコマンドを指定します。

AfterとWantedByに指定しているmulti-user.targetは、マルチユーザー環境の準備ができた後に実行する指示です。

Type=oneshotは常駐せずに単発であることを示します。

では、起動時に実行されるように登録します。camera_shot.serviceファイルを/etc/systemd/systemにコピーした後、以下のコマンドで登録します。なお、enableの代わりにdisableを指定すると登録解除できます。

$ sudo systemctl enable camera_shot

以上で、Raspberry Piが起動すると自動的に撮影し、シャットダウンするできるようになりました。


スケジュール登録

最後に、撮影したい時刻に電源ONするようにRPZ-PowerMGRにスケジュールを登録します。今回の例では、毎日朝6:00から夕方18:00まで1時間おきに撮影することにします。

1つずつコマンドで登録しても良いですが、csvファイルを用意しているので一括で登録しましょう。ダウンロードしたcsvファイルと同じディレクトリに配置し、以下のコマンドを実行します。

$ cgpmgr sc -i -f schedule.csv
ファイル schedule.csv からスケジュールを13個登録しました.
登録されているスケジュールが13個あります. 
  #001 ON  Repeat  **/**  06:00
  #002 ON  Repeat  **/**  07:00
  #003 ON  Repeat  **/**  08:00
  #004 ON  Repeat  **/**  09:00
  #005 ON  Repeat  **/**  10:00
  #006 ON  Repeat  **/**  11:00
  #007 ON  Repeat  **/**  12:00
  #008 ON  Repeat  **/**  13:00
  #009 ON  Repeat  **/**  14:00
  #010 ON  Repeat  **/**  15:00
  #011 ON  Repeat  **/**  16:00
  #012 ON  Repeat  **/**  17:00
  #013 ON  Repeat  **/**  18:00

csvファイルを編集することで、自分の好きなスケジュールで撮影することができます。RPZ-PowerMGRは月、日、曜日、時、分を指定に対応しており、最大250個のスケジュールを登録できます。時間指定の方法や、csvファイルの書式については以下の記事を参照して下さい。

指定時刻にRaspberry Piの電源をON/OFF (RPZ-PowerMGR)

RPZ-PowerMGRを使って、指定時刻にRaspberry Pi(ラズパイ)の電源ON/OFFする方法の解説です。決まった時間だけ起動して消費電力を抑えることが可能で、モバイルバッテリーやソーラーシステムでの運用に最適です。

以上で全ての設定は終了です。Raspberry Piの電源をOFFしておきましょう。指定した時刻になると、自動的に電源ON -> 撮影 -> 電源OFFが実行されるはずです。

定期撮影を終了する場合は、カメラを取り外して起動した後、以下のコマンドで登録スケジュールを全てクリアし、起動時の撮影プログラム実行を無効にします。

$ cgpmgr sc -R 255
sudo systemctl disable camera_shot

稼働可能時間の見積もり

モバイルバッテリーで運用する場合、気になるのはどれくらいの期間稼働できるかどうかではないでしょうか?RPZ-PowerMGRにはRaspberry Piの電流を測定する機能があるので、稼働時間を見積もることが可能です。その方法を解説します。

Raspberry Piの消費電流を測定

RPZ-PowerMGRは、Raspberry Piを電源ONするたびに電流を測定して値を保存しています。まずはその測定結果を確認して、どの程度消費しているか確認しましょう。

シャットダウンしてしまうと測定結果を確認できないので、camera_shot.pyの10-12行目をコメントアウトした状態で起動して、2〜3分ほど待ちます。(消費電流を測定するため)

その後、以下のコマンドで起動してからの電流値を「current.csv」ファイルに保存できます。

$ cgpmgr me -L -f current.csv

実際に今回セットアップしたカメラシステムの消費電流をグラフにしました。

Raspberry Piの消費電流
1回の撮影にかかる時間を測定

次に、amera_shot.pyの10-12行目のコメントアウトをもとに戻し、電源ONから撮影、シャットダウンして電源OFFするまでの時間を測ります。具体的には、RPZ-PowerMGRの緑色LED2が点灯してから消灯するまでの時間を測ればOKです。実際に測った所、約90秒になりました。

先ほどの電流値のデータの最初の90秒の平均を計算します。今回の例では147mAとなりました。

稼働可能時間を計算

これらの値をもとに、モバイルバッテリーでの稼働可能時間を計算します。まず、電源ONの稼働時間は以下の式で計算できます。(3.7Vリチウムイオンタイプのモバイルバッテリーで簡易的に求める式)

稼働時間 [h] = 0.74 × モバイルバッテリー容量[mAh] ÷ (平均消費電流ON + 平均消費電流OFF)

モバイルバッテリー容量は、今回の例では10000mAhのものを使用しました。

電源ON時の消費電流は、Raspberry Pi消費電流には、先ほど測定した147mAに30mAを加算した177mA程度と見積もります (RPZ-PowerMGRとバッテリーの回路損失を考慮するため) 実際は1日あたり90秒×13回の時間しか起動していないので、177×90×13÷24÷3600 = 2.4mA が平均消費電流ONに入ります。

電源OFF時の消費電流はRPZ-PowerMGRはほぼゼロですが、通電中のバッテリー側の損失があるため完全にゼロにはなりません。バッテリーや使用コネクターによって変わりますが、動作確認済モデルを使った場合では1〜5mAとみなせます。(Indoor Corgiによる実験結果より推定) これに電源OFFの時間の比率を掛けて平均にします。今回は電源OFFの時間がほとんどなので、そのまま1〜5mAとしました。なお、RPZ-PowerMGR Rev2ではバッテリーの待機消費電力を削減する機能が追加されており、動作確認済モデルを使った場合では1mA以下と想定して差し支えありません。

実際に稼働時間を見積もった結果が以下のとおりです。42〜91日程度の見込みとなりました。

稼働可能時間[h]稼働可能時間[日]
短く見積もった場合 (待機時5mA)0.74 × 10000 ÷ (2.4 + 5) = 1000[h]42日
長く見積もった場合 (待機時1mA)0.74 × 10000 ÷ (2.4 + 1) = 2176[h]91日
実際の稼働時間と比較

実際に稼働させてみて、計算値と一致するかを実験しました。おおよそ計算通りの結果となりました。

Rev1とType-C端子の組み合わせは、モバイルバッテリーの待機電力がやや大きくなるために稼働時間が短くなっていますが、Rev2で改善しています。

製品Revisionモバイルバッテリー使用端子実際の稼働時間[日]
RPZ-PowerMGR Rev2AUKEY PB-Y36Type-C端子119日
RPZ-PowerMGR Rev1AUKEY PB-Y36Type-A端子114日
RPZ-PowerMGR Rev1AUKEY PB-Y36Type-C端子47日
*残量が75%, 50%に達した時間から推測

RPZ-PowerMGRによる消費電流の測定と、稼働時間の計算方法については、以下の記事も参考にして下さい。

Raspberry Piの消費電力測定&モバイルバッテリー稼働時間の計算 (RPZ-PowerMGR)

RPZ-PowerMGRを使って、Raspberry Pi(ラズパイ)の消費電力を測定する方法の解説です。モバイルバッテリーでの運用可能な時間を計算し、実際の運用時間と比較しました。

まとめ

Raspberry Pi(ラズパイ)と純正カメラを使用して、定期的に撮影するタイムラプス機能を実装する方法の解説は以上です。待機時の消費電力をカットすることで、モバイルバッテリーで長期運用が可能になります。ソーラーシステムなどでバッテリーを充電すれば、さらに期間を伸ばすこともできるでしょう。

これ以外にも、RPZ-PowerMGRには電源管理に便利な様々な機能が搭載されています。そちらの記事もぜひ参考にして下さい。

TSL2572センサーとRaspberry Piで明るさ(照度)を測定する

Indoor Corgiのセンサー制御ソフトウェア「cgsensor」を利用して、TSL2572センサーで明るさを測定する方法を解説します。コマンドラインツールを使って1行もコードを書かずに測定ができるほか、Pythonパッケージを使えばご自身のプログラムから簡単にセンサーを制御できます。

SCD41 CO2センサーとRaspberry Piで二酸化炭素濃度を測定する

Indoor Corgiのセンサー制御ソフトウェア「cgsensor」を利用して、SCD41 CO2センサーで二酸化炭素濃度を測定したり、センサーの校正や設定を変更する方法を解説します。コマンドラインツールを使って1行もコードを書かずに測定や記録ができるほか、Pythonパッケージを使えばご自身のプログラムから簡単にセンサーを制御できます。

CO2濃度に応じてLEDの色を変化させ、リレーで外部機器をON/OFFする

Raspberry PiとRPZ-CO2-Sensorを使ってCO2(二酸化炭素)濃度を測定し、LEDの色を変化させる応用例です。LEDを見ることで、換気の必要性がひと目でわかります。濃度が一定以上になったらリレーで換気ファンなどの外部機器をONすることも可能です。

PythonとpigpioでRaspberry Piの赤外線制御 (家電、エアコン、照明、テレビなどを制御するホームIoT)

Pythonとpigpioを使ってRaspberry Piで赤外線の送受信を行う方法について解説しています。サンプルプログラムを用意しているので、簡単に受信、登録、送信動作をさせることができるほか、データ解析も可能です。赤外線を使ってエアコン、照明、テレビなどの家電を制御することが可能になります。