タイムラプスカメラと Raspberry Pi カメラ
タイムラプスカメラとは、一定の時間毎に間欠的に写真撮影できるカメラです。 タイムラプスカメラを水中に設置し、間欠的に撮影することで、 その場所に出現する魚の種類や出現頻度を簡易的に調べることができます。 タイムラプス撮影機能を持つ市販デジタルカメラには、 Richo Optio や GoPro 等があります。
市販タイムラプスカメラの他、 Raspberry Pi(ラズベリーパイ)を タイムラプスカメラとして使用することができます。 Raspberry Pi は小型で安価なコンピュータボードで、 専用カメラモジュールを接続することで、静止画や動画を撮影できます。 USBバッテリー(Anker PowerCore 10000など)を電源として、 数日間稼働するタイムラプスカメラを製作できます。 ここでは、Raspberry Pi をタイムラプスカメラとして使用する方法をご紹介します。
Raspberry Pi には 通常モデルの Raspberry Pi 2 や Raspberry Pi 3 をはじめ、 小型モデルの Raspberry Pi Zero や Raspberry Pi A+ などの 複数のモデルがあります。 水中撮影の場合は、防水ハウジングに収容するため、 小型な Raspberry Pi Zero や Raspberry Pi A+ を使用することで、防水ハウジングのサイズを小さくできます。 Raspberry Pi Zero が最も小型ですが、 あとで説明するリアルタイムクロックを接続する場合は ピンヘッダのはんだ付けが必要になります。 Raspberry Pi A+ は 比較的小型で、 ピンヘッダのはんだ付けが不要なため、 小型化に特にこだわらない場合はこちらが使いやすいでしょう。
Raspberry Pi の設定(1)-OSの書き込み-
Raspberry Pi を使うには、SDカード(8-32GBのmicroSDカード)を用意し、 SDカードにOS(オペレーションシステム)を書き込みます。 Raspberry Pi の公式サイト から、OSとなる Raspbian をダウンロード(Download ZIPをクリック)し、 インストールガイド に従って以下の作業を行います。
- Etcher をダウンロードしインストール
- Etcher を起動し、ダウンロードした zipファイルを選択、SDカードに書き込む
なお、本サイトの説明は、 Raspbian Strech with Desktop (2017-11-29-raspbian-stretch.zip) で動作確認しています。 旧バージョンのOS(Raspbian)は こちら からダウンロードできます。
Raspberry Pi の設定(2)-初期設定-
OSの書き込みが済んだら、次に、カメラモジュールや、 後述するリアルタイムクロックを使用できるよう、初期設定を行います。 通常、初期設定は Raspberry Pi にモニタやキーボード、マウスを接続して行いますが、 モニタ等を用意できない場合は、USBシリアル変換ケーブル を使用して、Raspberry Pi とPCを接続し、初期設定を行うことも可能です。 ここでは、USBシリアル変換ケーブル を使用した初期設定方法をご紹介します。
(2−1)config.txt の編集
あらかじめ USBシリアル変換ケーブル を用意し、USBシリアル変換ケーブルのドライバをPCにインストールしておきます。 また、Windows PC の場合は、 TeraTerm 等のターミナルソフトをインストールしておきます。
まず、以下の手順で Raspberry Pi が PCと USBシリアル変換ケーブルで接続できるよう、 Raspberry Pi の設定ファイルである config.txt を編集します。
- OS(Raspbian)を書き込んだSDカードをPCで開く
- config.txt を探してテキストエディタで開く
- config.txt の最後の行に enable_uart=1 と記述して保存
(2−2)USBシリアル変換ケーブルによる接続
続いて、USBシリアル変換ケーブルを用いて、 以下の手順で PC と Raspberry Pi を接続します。
- USBシリアル変換ケーブルの USBコネクタを PC に接続します。
- USBシリアル変換ケーブルの GND, TX, RX ピンを Raspberry Pi の GND, RX, TX ピンに、 TX と RX がペアになるようクロス接続します。
- PC側で TeraTerm を起動します。
- TeraTerm の"新しい接続"画面が現れるので、 "シリアル"を選択、"ポート"は適宜選択し、"OK" します。
- 次いで、"設定"メニューから "シリアルポート"を開き、 ボーレートを 115200 に設定します。
- OSを書き込んだSDカードを Raspberry Pi に挿入し、USB電源を接続します。 これで Raspberry Pi が起動します。
- Raspberry Pi が起動すると TeraTerm の画面上に raspberrypi login: と表示されるので、 pi と入力しリターンキー、 続いて、Password: と表示されたら、 raspberry と入力しリターンキー、 を入力し、Raspberry Pi にログインします。
なお、MAC等の場合、TeraTerm の代わりに、 ターミナルを起動し、 ls /dev/cu.* あるいは ls /dev/tty* のようなコマンドを入力して接続先を確認し、 screen /dev/cu.usbserial-xxx 115200 あるいは sudo screen /dev/ttyUSB0 115200 のようにして接続できます。 Ctl+A, D で接続セッションを抜けて、screen -r で再開、Ctl+A, K で終了できます。
(2−3)raspi-config による初期設定
ログインに成功したら、以下のコマンドで設定画面に入り、初期設定を行います。
sudo raspi-config設定画面が開いたら、以下の設定を行います。 設定画面では、矢印キーを使って設定項目を選択できます。
- Ingerfacing Options を選択、続いて Camera を選択し、 ...enabled? と尋ねられたら、yes を選択します。 この設定でカメラモジュールが使用できるようになります。
- Ingerfacing Options を選択、続いて I2C を選択し、enabled? → yes を選択します。 この設定は、後述する リアルタイムクロック を使用するために必要です。
- Localisation Options を選択、続いて、 Change Timezone を選択し、 Time zone を Asia, Tokyo に設定します。
設定が済んだら、設定画面を終了します。 再起動するか尋ねられたら、"yes" で再起動します。 これらの設定は再起動後に有効になります。
再起動するか尋ねられて、"no" を選択した場合、 以下のコマンドで Raspberry Pi を再起動できます。
sudo rebootRaspberry Pi をシャットダウンするには、以下のコマンドを実行します。
sudo haltシャットダウン完了後に USB電源を抜き、 次回起動時には、再度 USB電源を投入します。
Raspberry Pi の設定(3)-撮影テスト-
初期設定が済んだら、撮影テストしてみましょう。 公式サイトの説明 に従って、 カメラモジュールを接続し、 Raspberry Pi を起動、 ログイン後、以下の撮影コマンドを入力します。
raspistill -o test.jpgこの撮影コマンドを実行すると、撮影画像が test.jpg として保存されます。
raspistill -vf -hf -o test.jpgカメラモジュールのケーブル側を上にして撮影すると、画像の向きが逆さまになります。 その場合は、-vf -hf を指定すると画像の上下左右が反転し、正しい向きの画像が得られます。
以下のコマンドでファイル一覧を表示し、 撮影画像ファイルが生成されていることを確認できます。
ls -l
Raspberry Pi にモニタを接続しない場合、画像をモニタ上に表示できないので、 ここでは、USBメモリに画像をコピーして、USBメモリにコピーした画像をPCモニタ上に表示します。
USBメモリ(FAT32フォーマットのもの)を Raspberry Pi に接続すると自動的にマウントされるので、 以下のコマンドで、USBメモリのマウント先を確認します。
df -hマウント先は、 Mounted on の列に /media/pi/TRANSCEND のように表示されます。 USBメモリのマウント先が /media/pi/TRANSCEND の場合、 以下のコマンドで test.jpg を USBメモリ に コピーできます。
cp test.jpg /media/pi/TRANSCENDコピー後、以下のコマンドで、USBメモリをアンマウントします。
umount /media/pi/TRANSCENDアンマウント後、USBメモリを Raspberry Pi から取り外し、 USBメモリを PCに接続し、USBメモリ中の test.jpg を PCで開いて、撮影画像を確認できます。
USBメモリが自動的にマウントされない場合は、 以下のようにしてマウント、ファイルコピー、アンマウントできます。
sudo mkdir /mnt/usb #マウント先のディレクトリを作成 ls -l /dev/sd* #USBメモリ接続後は sda, sda1 が表示される sudo mount /dev/sda1 /mnt/usb #マウント df -h #マウントされたか確認 sudo cp test.jpg /mnt/usb #ファイルコピー ls -l /mnt/usb #コピーされたか確認 sudo umount /mnt/usb #アンマウント
Raspberry Pi の設定(3)-リアルタイムクロックの接続-
Raspberry Pi はバックアップ時計を持っておらず、 通常は、起動後、インターネットに接続した際に、 自動的にネットワーク時刻と同期するようになっています。 インターネットに接続せず、オフラインで使用する場合は、 起動後にPCと接続し、手動で時刻設定することで正しい時刻を設定できます。
屋外で使用する場合など、 起動後にインターネットにもPCにも接続せずに、 Raspberry Piに正しい時刻を設定したい場合は、 リアルタイムクロック(バックアップ時計)を使用します。 リアルタイムクロックを Raspberry Pi に接続し、 起動後にリアルタイムクロックの時刻と自動的に同期することで、 オフラインでもPC接続することなく正しい時刻を設定できます。
ここでは、Raspberry Pi 用のリアルタイムクロックモジュールとして Adafruit PiRTC を使用します。なお、PiRTC を使うには、別途CR1220ボタン電池が必要です。 ボタン電池を入れた PiRTC を Raspberry Pi に接続し、 インストラクション に従って以下の設定を行います。
PiRTC を Raspberry Pi に接続したら、 最初に以下のコマンドを実行します。
sudo i2cdetect -y 1コマンドを実行すると、"68" と表示されるのが確認できます。 これは、I2Cアドレスと呼ばれる PiRTCのデバイスアドレスです。 確認できたら、 以下のコマンドで nanoエディタを起動し config.txt を編集します。
sudo nano /boot/config.txtエディタが起動したら config.txtの最後の行に、 以下の一行を追記して、保存(Ctl+O)、終了(Ctl+X)します。
dtoverlay=i2c-rtc,pcf8523config.txtを編集したら、以下のコマンドで再起動します。
sudo reboot再起動、ログイン後、最初に実行したコマンドを再び実行し、表示を確認します。
sudo i2cdetect -y 1コマンドを実行すると、先ほど"68"と表示されていたところが、 "UU" と表示されるのが確認できます。 確認できればOKです。
次に、以下のコマンドを実行して、 "fake hwclock"を無効化します。
sudo apt-get -y remove fake-hwclock sudo update-rc.d -f fake-hwclock remove続いて、 以下のコマンドで nanoエディタを起動し、 ハードウェアクロック設定を編集します。
sudo nano /lib/udev/hwclock-setエディタが起動したら 以下の3行を見つけて、 各行の先頭に "#" を挿入してコメントアウトし、 保存(Ctl+O)、終了(Ctl+X)します。
#if [ -e /run/systemd/system ] ; then # exit 0 #fi
最後に、 Raspberry Pi のシステム時刻を リアルタイムクロック(PiRTC)の時刻と同期します。
以下のコマンドでシステム時刻を正しい時刻に合わせます。時計を見ながらタイミングを合わせてコマンドを実行します。
sudo date -s "2018/02/08 14:25:00"Raspberry Pi のシステム時刻を確認するには、以下のコマンドを実行します。
dateシステム時刻を正しい時刻に設定したら、 以下のコマンドで システム時刻をリアルタイムクロックに書き込みます。
sudo hwclock -wリアルタイムクロックの時刻は、以下のコマンドで確認できます。
sudo hwclock -r以上で、リアルタイムクロックの設定は終了です。 リアルタイムクロック(PiRTC)に バックアップ電池(CR1220)を挿入して Raspberry Pi に接続しておけば、 Raspberry Pi の電源をオフした後も リアルタイムクロックが時刻を刻み続けるため、 次回 Raspberry Pi の電源をオンした際に リアルタイムクロックの時刻を Raspberry Pi が読み込み、 正しいシステム時刻が設定されます。
Raspberry Pi の設定(4)-タイムラプス撮影の設定-
Raspberry Pi でタイムラプス撮影するため、 一定時間毎に撮影コマンドを実行し、撮影画像を保存するよう設定します。 画像を保存する際は、撮影日時をファイル名として保存するようにします。 また、画像保存用のディレクトリを作成し、そこに保存するようにします。
まず、以下のコマンドで画像保存用のディレクトリを作成します。
mkdir camera # camera という名前のディレクトリを作成
次に、以下のコマンドで nanoエディタを起動し、 撮影スクリプト capture.sh を作成します。
nano capture.shnanoエディタが起動したら、以下のスクリプトを入力し、 ファイルを保存(Ctl+O)、終了(Ctl+X)します。
#!/bin/bash DATE=$(date +"%Y-%m-%d_%H%M") #日時 raspistill -o /home/pi/camera/$DATE.jpg #撮影コマンド撮影スクリプトを保存し、エディタを終了したら、 以下のコマンドで撮影スクリプトを実行可能に設定します。
chmod +x capture.sh実行可能に設定後、 以下のようにして、撮影スクリプトを実行できます。
./capture.sh撮影スクリプトを実行すると、 画像保存用ディレクトリ(/home/pi/camera)の中に 撮影日時をファイル名とする画像ファイルが保存されます。
なお、 /home/pi というのは、 ホームディレクトリと呼ばれるログイン後の作業ディレクトリ名で、 先に作成した 画像保存用ディレクトリや撮影スクリプトは ホームディレクトリ中に作成されています。
以下のコマンドで、ファイルやディレクトリの一覧を表示し、 撮影スクリプト(capture.sh)や 画像保存用ディレクトリ(camera) が作成されていることを確認できます。
ls -l
cameraディレクトリ内に撮影画像が保存されているかを確認するには、 まず、以下のコマンドで、作業ディレクトリをcameraに移動します。
cd cameracamera ディレクトリに移動後、以下のコマンドでファイル一覧を表示し、 撮影画像が保存されていることを確認できます。
ls -lcamera ディレクトリから、元のホームディレクトリに戻るには、以下のコマンドを実行します。
cd現在の作業ディレクトリを知るには、以下のコマンドを実行します。 ホームディレクトリにいれば、/home/pi と表示されます。
pwd
ホームディレクトリから、以下のコマンドで camera ディレクトリ中のファイル一覧を表示することも可能です。
ls -l camera
次に、作成した撮影スクリプトを、定期的に実行するよう設定します。 以下のコマンドで、cron 設定を起動します。
crontab -e初回は、cron 設定に用いるエディタの選択画面が表示されますが、 nanoエディタを選択すると、 次回から自動的にnanoエディタが起動し、cron 設定画面が表示されます。 cron 設定画面が表示されたら、 一番下の行に以下のように設定を入力し、保存(Ctl+O)、終了(Ctl+X)します。
*/2 6-17 * * * /home/pi/capture.shこの設定では、 6時台から17時台の間(6:00から17:58の間)、 2分毎に撮影スクリプトが実行されます。
以上でタイムラプス撮影の設定は終了です。 以下のコマンドでシャットダウンし、シャットダウン完了後、USB電源を外します。
sudo halt再びUSB電源を投入すると、Raspberry Pi が起動し、 起動後は、設定した時間毎に撮影スクリプトが実行されます。
しばらく待った後、以下のコマンドで 画像保存用ディレクトリのファイル一覧を表示し、 設定した時間毎に撮影されていることを確認しましょう。
ls -l camera
撮影を停止したい場合は、 再び cron 設定を起動(crontab -e)して、 以下のように cron 設定行の先頭に "#" を付けてコメントアウトし、 保存(Ctl+O)、終了(Ctl+X)すれば停止できます。
#*/2 6-17 * * * /home/pi/capture.sh
USBメモリを接続し、USBメモリが /media/pi/TRANSCEND にマウントされている場合(df -h で確認)、 以下のコマンドで、camera ディレクトリをUSBメモリにコピーできます。
cp -r camera /media/pi/TRANSCENDcameraフォルダ中のすべての画像ファイルを削除するには、以下のコマンドを実行します。 撮影画像でディスク容量が一杯になる前に削除します。
rm camera/*.jpg
ディスクの使用量や残容量は、以下のコマンドで確認できます。
df -h以上で、Raspberry Pi をタイムラプスカメラとして使用する設定は終了です。 USBバッテリーに接続すれば Raspberry Pi が起動し、 タイムラプスカメラとして動作します。 防水ハウジング に収容すれば、水中タイムラプス撮影が可能です。 普段目にすることのない水中の様子を Raspberry Pi カメラで撮影してみましょう。