Windows
Linux
RaspberryPi

高解像度タイムラップス撮影にRaspberry piで大容量USBメモリ(1TB)を使ってみる

はじめに

Raspberry piでモニタリングする際、どうしても大容量のハードディスクやメモリを使いたくなるときがあります。例えば長時間、静止画・動画を撮り続けたいだとか、高解像度の写真をストックさせたいなど・・・。
このとき、USB HDを使用した場合、USBメモリに比べ消費電力が大きいため、Raspi側のデフォルトの状況だと電流能力に制限をかけていることから、動作不安定になりやすいことが分かっています。特に遠隔地に設置する場合、HDの不安定さは致命的のため、何よりも安定さが求められます。
そこで、大容量のUSBメモリ(1TB)を使って、タイムラップス撮影を行ってみました。

材料

・ELP WebカメラLinux/Windows HD画質 800万画素 Sony IMX179 sensor ウェブカメラ
・キングストン Kingston USBメモリ 1TB USB 3.1
・Raspberry pi 3 Model B

USBメモリはKingstone製(海外製)を用いました。少々高額ですが、市販されている1TBのUSBメモリで入手できるのは、今のところこれぐらしかないようです。
Dg0wvZXUYAUg0Js.jpg

想定した環境

今回は取得した膨大なデータをWindows端末で吸い上げることを想定しました。タイムラプス撮影では、蓄積されるデータは膨大になるため、すべてのデータをIotで転送することはできません。そのため、モニタリング状況の確認は、一部のデータ(低解像度)のみにしておいて、すべてのデータ(高解像度)を吸い上げるには、ノートPCを用いることを想定しました(現場に定期的に吸い上げに行くような場合を想定・・・)。

USBメモリの初期化

通常、Raspi側でext4形式でフォーマットを行うと、Windows側では認識しません。
また、今回使用したUSBメモリは、Windows側でNTFS等のフォーマットを行うと、Raspi側でうまく認識しない現象がでてしまいました。以前、同一メーカの512GBを使用したときは、そのような現象はでませんでした。どうやら1TBになると少々勝手が違うようです。
そのため、RaspiとWindowsの両方認識できるUSBメモリを作成しなくてはなりませんでした。

Windows側でフォーマットする方法は以下です。
【フォーマットの方法】
Windows機にメモリを挿入し、フォーマットを行う。ファイルシステム:exFAT、アロケーションユニットサイズ:標準のアロケーションサイズを選択する。
キャプチャ.JPG

この方法で、Raspi側とWindows側の両方で認識できるUSBメモリが出来上がります。
ただし、Windows側では読み取り専用になってしまいます。

Raspi側の認識方法

Raspi側に上記でフォーマットしたUSBメモリを装着したら、まずは、以下のコマンドで認識の確認を行います。

sudo fdisk -l

いろいろ表示されますが、以下のように/dev/sda1が表示され、exFatの文字があれば認識している証拠です。

Device     Boot  Start        End    Sectors  Size Id Type
/dev/sda1       131072 1933574143 1933443072  922G  7 HPFS/NTFS/exFAT

さて次にmountですが、実はこのUSB、通常のmountコマンドでは認識してくれません。いろいろ探した結果、以下をインストールすれば認識することが分かりました。

sudo apt-get install exfat-fuse

そのあとmountコマンドを実行します。マウント先はそれぞれの環境に応じて変更してください。

sudo mount /dev/sda1 /media/usbmem1

これでいよいよ大容量USBメモリを認識したはずです。次のコマンドでドライブを確認してみましょう。お~認識している。これでディスクへの書き込みもできるはずです。

pi@raspberrypi:~ $ df -h
Filesystem      Size  Used Avail Use% Mounted on
/dev/root       7.2G  2.8G  4.1G  40% /
devtmpfs        458M     0  458M   0% /dev
tmpfs           462M     0  462M   0% /dev/shm
tmpfs           462M   47M  415M  11% /run
tmpfs           5.0M  8.0K  5.0M   1% /run/lock
tmpfs           462M     0  462M   0% /sys/fs/cgroup
/dev/mmcblk0p1   63M   21M   42M  34% /boot
/dev/sda1       922G    0G  922G   0% /media/usbmem1

タイムラプス撮影

タイムラプス撮影には、800万画素のUSBカメラを用いて、motionで撮影しました。

sudo apt-get install motion

今回は、毎正時(1時間毎)1秒ごとの写真を30分間撮影する仕様にしました。そのため、crontabに1時間ごとにmotionを起動するようにしました。
記述するとこんな感じです。

#--撮影開始--
00 0-18 * * * sudo motion -n -m >/dev/null 2>&1

motionの停止は、以下のスクリプトで自動的に行いました。サービスでmotionが起動している場合は、motionサービスを停止するものです。

#!/bin/bash
echo "Shell START"
count=`ps -ef | grep -e motion | grep -e -n | grep -v grep | awk '{ print $2 }'`
for VAL in $count
do
   echo "Kill process : $VAL"
   sudo kill $VAL
done
#--
count=`ps -ef | grep -e /usr/bin/motion | grep -v grep | awk '{ print $2 }'`
if [$count = ""]; then
   echo "process NULL";
else
   echo "kill process : $count";
   sudo kill $count
fi
echo "Shell END"

撮影時間

この仕様で撮り続けた場合、約1ヶ月持ちます。特に遠隔地の場合、頻繁にわざわざ出向かなくても済みます。交通費を考えた場合、USBメモリが少々高くても、場合によってはPAYするかもです。

おわりに

今回は静止画でしたが、もちろん動画でも行えます。motionを使っているので、解像度や圧縮率など任意に変更できるため、さまざまな環境に応じことも可能のため、長期のモニタリングに有効であることが分かりました。今後、USBメモリの低価格化や、USBカメラの高解像度化が更に進めば、より精度の高いモニタリングも可能になってきます。
現在、実際にこれを使って海岸のモニタリングを行っております。