数秒毎・毎分など一定間隔もしくは決まった時刻にコードを実行する cron という機能を使って、一定間隔でカメラ撮影します。
例えば、このロボットは3秒間に1回ずつ連続写真を撮影したもの。みんなは何を撮影してみたいですか?
コードを改造する
CoderDojo青梅で配ったSDカード「ラズタンク用OS」にラズパイカメラで撮影するコード「capture.py」が入っています。これを改造します。
まず、画像保存用フォルダ「pic」を作ります。そして、[capture.py]ファイルを名前を付けて複製したら、コード「cron_capture.py」を改造します
$ mkdir pic
$ cp capture.py cron_capture.py
$ nano cron_capture.py
下記、ファイル名で保存するコードを探します
cv2.imwrite( "capture_output.jpg", frame )
次の様に改造します
import datetime
# 時刻を記録した画像を保存
now = datetime.datetime.now()
filename = “pic/pic{0:%Y%m%d_%H%M%S}.jpg".format(now)
# 画像ファイルを保存する。
cv2.imwrite( filename, frame )
保存して エディタを終了します。
cron を設定する
cron は、一定時間毎にプログラムを起動する機能です。
毎日朝9時に実行。1時間毎に実行。のようなことをしたいときに cron を設定します。
下記コマンドで cron の設定内容を確認できます。list リストです。
$ crontab -l
「no crontab for pi」 このメッセージが表示されるときは、まだ何もcronに設定されていないかもしれません。
cron に実行するプログラムを追加します。edit エディットモードです。
$ crontab -e
ファイルの最終行に実行したいフォルダ名を含むファイル名を追加します。
# m h dom mon dow command
* * * * * python /home/pi/python/cron_capture.py
米印の部分が左から時刻と日付と曜日です。[*]が5個並ぶときは毎時0分, 1分, 2分と一分毎に実行することを意味します。
* * * * * :毎分実行するという意味[m分 h時 dom日 mon月 dow曜日]
分の場所に0を指定すると毎時0分となります。
0 * * * * :毎時0分、つまり 02:00, 03:00, 04:00 というように1時間置きに実行します
*/5 * * * * :5分毎に実行という設定も可能
【注意】タイムラプスが終わったら、cron の設定を戻すこと。大量の写真で空き容量がなくなります。
試してみる
毎分、時刻をファイルに出力するプログラムをcronに登録してみます。ファイル名は[test.py]としました。
import datetime
ut = datetime.datetime.now()
f = open('/home/pi/python/test.txt', 'a')
f.write( '\nHello, Kano: ' + str( ut ) )
f.close()
cronに登録します。
$ crontab -e
*/1 * * * * python /home/pi/python/test.py
保存して数分後。[test.txt]ファイルを開いてみます。
$ cat test.txt
Hello, Kano: 2023-10-01 08:35:11.392646
Hello, Kano: 2023-10-01 08:37:15.263760
Hello, Kano: 2023-10-01 08:38:01.943285
Hello, Kano: 2023-10-01 08:39:02.167309
Hello, Kano: 2023-10-01 08:40:01.378617
Hello, Kano: 2023-10-01 08:41:01.609219
Hello, Kano: 2023-10-01 08:42:01.820581
Hello, Kano: 2023-10-01 08:43:02.047995
Hello, Kano: 2023-10-01 08:44:01.277704
1分毎に1行のログが出力されていますね。永久にログが出力されると、ディスクがいっぱいになるのでcronから削除するのを忘れずに。
月の観察などに使えそうです
せっかくなので動くものがいいですよね。
そう、月。
月や夜空が暗すぎたら、昼間の雲の形の変化や流れとか。
地面に棒を立てて、太陽の影で、日時計の動きもいいかも。