はじめに
もうすぐ2歳になる子供が家に滞在していたので、せっかくなので寝相をとって動画にして、みんなで楽しむことにした。
そのときに行ったことのまとめ。
使用機器
項目 | 内容 |
---|---|
ラズパイ | Rapsberry Pi4 4GBモデル |
カメラ | よくある暗視カメラ |
SDカード容量 | 32GB |
初期設定
ラズパイを買ったのは相当昔で、初期設定自体は何を参考にしていたかは忘れてしまった。
特筆するようなことはしていないので、このページのような記事を参考にしておけば良さそうである。
方針
今回は次のような方針で動画を作成することにした。
- Pythonでカメラを制御し、一定の間隔で画像を撮影するコードを作る
- 遠隔制御し、1のコードを起動する
- 撮影した動画をメインの環境(Windows)にコピーする
- メイン環境にて動画化
- みんなで楽しむ
記事が長くなりそうだったので、2までで区切ることにする
カメラ制御方法
Pythonでカメラを制御する時のサンプルは公式が一番わかり易いと思う。
Pythonコードでカメラモジュールをコントロールする方法を参考にして、まずはカメラの動作確認をしたところ、かなりぼやけた内容の画像が取れていた。
今回のカメラモジュールの場合、レンズの部分がネジ式になっていて、手動で焦点距離を変えられるようだった。
ピントが合う部分を把握してから、レンズの部分を回転させてピントの調整を行おう。
ピント調整なども含めたコードは下記のとおりになった。
from picamera import PiCamera
from time import sleep
import datetime
DEBUG = False
TIMESPAN = 2
WAIT = TIMESPAN / 5
with PiCamera() as camera:
if DEBUG:
camera.start_preview()
_ = input()
camera.stop_preview()
check_time = datetime.datetime.now()
count = 0
while check_time.hour >= 20 or check_time.hour <= 6:
while datetime.datetime.now().second != (check_time.second + TIMESPAN) % 60:
sleep(WAIT)
check_time = datetime.datetime.now()
camera.capture(f"{check_time:%d%H%M%S}.jpg")
count += 1
print(count)
if DEBUG and count > 100:
break
保存ファイル名を日付を含めている(check_time:%d%H%M%Sとしている)のは、
時間までだとファイル名をソートしたときに24時のファイルが一番最初に来てしまうから。
月をまたぐことはなかったのと、時間を簡単に確認できるようにしておく方が
動画を見ながら話すときにやりやすいとおもってUNIX時間の採用はしなかった。
理論上、一度の撮影に1秒以上かかると1分待たされる可能性が出てくるが、事前検証(GUI上で一晩動かして見てのテスト)では問題なかったためこのまま使用した。
なお、事前検証では撮影間隔を1秒にしていたが、32GBのSDでは容量が足りなかった。
これの対策について色々検証したが最終的に撮影間隔を2秒にする対応に落ち着いた。
検証記録は別途記事にまとめることにする。
遠隔操作によるコード起動
遠隔操作によるコードの起動方法はいくつかあるが、TeratermでSSHでラズパイに接続するのが一番手軽そうだった。
とりあえずTeratermを落としても実行し続ける方法を確認してから、ソースコードのあるフォルダに移動して、sudo nohup python camera.py
をすると…何が起きたかはよくわからないが一瞬で終了した。
(※後で知ったが、最後に&をつけるとバックグラウンドで実行できるようだった。
今回はコードを実行することだけが目的だったことと異常終了の検知ができたことからフォアグラウンド実行でも問題は出なかった。)
cat nohup.log
すると、次のような表記。
File "camera.py", line 25
camera.capture(f"{check_time:%d%H%M%S}.jpg")
^
SyntaxError: invalid syntax
IDEで作業していたPythonでは対応していた新しい記法が使えないPythonを使おうとしていたようだ。
試しにpython
してみると…?
Python 2.7.16 (default, Oct 10 2019, 22:02:15)
[GCC 8.3.0] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>>
今後pythonを使う場合はPython3系しか使わないと思うので、対応方法の記事を参考にして、pythonをpython3に紐づけておいた。
もう一度実行して翌朝、ls | wc -l
でファイル数を調べることによって、期待通りのファイルが出力されていることを確認した。
記事が長くなりそうなため、一旦ここで区切ることにする。