応用編:timerを使ってみよう
cronを使用せずにカメラを定点撮影する方法をご紹介します。
これは、従来使われてきたcronの代わりに、systemdのユニットの一つである「timer」を使い、Raspberry Pi Zeroのカメラを決まった時間で自動的に撮影する方法です。timerを使う場合、crontabの設定行を削除して下さい。
systemdのtimerユニットについて
systemdではサービスの起動や停止処理などの管理対象をユニットという概念で定義し、timerもこの流れでユニットとして定義されます。Raspbian Stretchの前バージョンであるRaspbian Jessieからsystemdが採用されています。
systemctlコマンドでtimerリストを表示してみると、デフォルトで有効になっているtmpファイルのクリーンジョブがスケジュールされているのが分かりますね。
$ systemctl --system list-timers NEXT LEFT LAST PASSED UNIT ACTIVATES Fri 2018-01-05 01:24:52 JST 8h left Thu 2018-01-04 01:24:52 JST 15h ago systemd-tmpfiles-clean.timer systemd-tmpfiles-clean.service
準備するファイル
今回は以下のファイルを準備し、timerを設定します。.serviceファイルでユニットにどのような処理をするのか、どのターゲットで動作するのかを定義(撮影コマンドを実行)し、.timerファイルで処理時間(撮影する間隔)を定義します。
-
スクリプトファイル:
/usr/local/bin/picamera -
serviceファイル:
/etc/systemd/system/picamera.service -
timerファイル:
/etc/systemd/system/picamera.timer
サービスファイルを作成する
サービスファイルを作成して、ExecStartに実行するスクリプトを指定します。どのターゲットで動作するのかは、WantedBy=multi-user.targetのように指定します。multi-user.targetは、かつてのランレベル3(ネットワークありのマルチユーザーモード)相当で動作することを意味します。
$ sudo nano /etc/systemd/system/picamera.service [Unit] Description= Shooting script [Service] Type=simple ExecStart=/usr/local/bin/picamera [Install] WantedBy=multi-user.target
systemctlでpicamera有効化します。省略せずにsudo systemctl enable picamera.serviceでも動きます。
$ sudo systemctl enable picamera Created symlink /etc/systemd/system/multi-user.target.wants/picamera.service → /etc/systemd/system/picamera.service.
timerを設定する
次は、有効にしたスクリプトに対して、実行する時間を.timerファイルで定義します。OnBootSec=1minでOSのブートが終わってから1分後にtimerが有効化されOnUnitActiveSec=5minで5分ごとにタイマーをセット、そしてペアになる.serviceユニットはpicamera.serviceであることを定義しています。
$sudo nano /etc/systemd/system/picamera.timer [Unit] Description= Shot every 5 minutes [Timer] OnBootSec=1min OnUnitActiveSec=5min Unit=picamera.service [Install] WantedBy=multi-user.target
timerファイルを保存したら、systemctlコマンドでpicamera.timerを起動後、OS起動時にpicamera.timerが起動されるように設定を有効化します。
$ sudo systemctl start picamera.timer $ sudo systemctl enable picamera.timer Created symlink /etc/systemd/system/multi-user.target.wants/picamera.timer → /etc/systemd/system/picamera.timer.
timerを確認する
timerが有効になっているかtimerリストで確認してみます。
$ systemctl --system list-timers NEXT LEFT LAST PASSED UNIT ACTIVATES Wed 2018-01-03 10:49:22 JST 3min 28s left Wed 2018-01-03 10:44:22 JST 1min 31s ago picamera.timer picamera.service
5分毎に撮影された保存先のディレクトリを確認してみましょう
pi@raspberrypi:~ $ ls -l /mnt/nas/picamera -rwxrwxrwx 1 pi pi 1022116 1月 3 10:49 201801031049.jpg -rwxrwxrwx 1 pi pi 1026417 1月 3 10:55 201801031055.jpg -rwxrwxrwx 1 pi pi 1021086 1月 3 11:01 201801031101.jpg ...
timerを停止・無効化したいとき
今回作成したtimerを停止したいときは、以下を実行します。picamera.timerおよびpicamera.serviceどちらも停止、OS起動時にデフォルトで起動しないようにします。
$ sudo systemctl stop picamera.timer $ sudo systemctl stop picamera.service $ sudo systemctl disable picamera.service Removed symlink /etc/systemd/system/multi-user.target.wants/picamera.service. $ sudo systemctl disable picamera.timer Removed symlink /etc/systemd/system/multi-user.target.wants/picamera.timer.
まとめ
今回は、Raspberry Pi Zeroにカメラモジュールを接続して、定点観測する方法をご紹介しました。timerまたはcronで定点撮影したJPEG写真は、タイムラプス合成することもできます。興味のある方はぜひチャレンジしてみてはいかがでしょうか。
次回はクラウドストレージとの連携方法をご紹介します。
