#はじめに
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メモリで入手できるのは、今のところこれぐらしかないようです。
#想定した環境
今回は取得した膨大なデータをWindows端末で吸い上げることを想定しました。タイムラプス撮影では、蓄積されるデータは膨大になるため、すべてのデータをIotで転送することはできません。そのため、モニタリング状況の確認は、一部のデータ(低解像度)のみにしておいて、すべてのデータ(高解像度)を吸い上げるには、ノートPCを用いることを想定しました(現場に定期的に吸い上げに行くような場合を想定・・・)。
#USBメモリの初期化
通常、Raspi側でext4形式でフォーマットを行うと、Windows側では認識しません。
また、今回使用したUSBメモリは、Windows側でNTFS等のフォーマットを行うと、Raspi側でうまく認識しない現象がでてしまいました。以前、同一メーカの512GBを使用したときは、そのような現象はでませんでした。どうやら1TBになると少々勝手が違うようです。
そのため、RaspiとWindowsの両方認識できるUSBメモリを作成しなくてはなりませんでした。
Windows側でフォーマットする方法は以下です。
【フォーマットの方法】
Windows機にメモリを挿入し、フォーマットを行う。ファイルシステム:exFAT、アロケーションユニットサイズ:標準のアロケーションサイズを選択する。
この方法で、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カメラの高解像度化が更に進めば、より精度の高いモニタリングも可能になってきます。
現在、実際にこれを使って海岸のモニタリングを行っております。