CodeZine(コードジン)

特集ページ一覧

Raspberry Pi Zeroとカメラを接続して定点観測しよう

Raspberry Pi Zeroではじめよう! おうちで楽しむIoTレシピ 第7回

  • LINEで送る
  • このエントリーをはてなブックマークに追加
2018/11/13 14:00

目次

応用編: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写真は、タイムラプス合成することもできます。興味のある方はぜひチャレンジしてみてはいかがでしょうか。

 次回はクラウドストレージとの連携方法をご紹介します。



  • LINEで送る
  • このエントリーをはてなブックマークに追加

バックナンバー

連載:Raspberry Pi Zeroではじめよう! おうちで楽しむIoTレシピ

もっと読む

著者プロフィール

  • 平 愛美(タイラ マナミ)

     熊本県出身のITエンジニア。2児の母で、趣味は写真とグルメ。最近はRaspberry Pi、Arduinoを使った家庭内IoTについて日々研究するIT系母ちゃんとして活躍中。主な著書は、『改訂3版 Linuxエンジニア養成読本』(寄稿、技術評論社 刊)、『Linuxシステム管理標準教科書』(共著、...

あなたにオススメ

All contents copyright © 2005-2021 Shoeisha Co., Ltd. All rights reserved. ver.1.5