高解像度タイムラップス撮影に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](https://qiita-image-store.s3.amazonaws.com/0/278731/e5957d40-fd9f-f6c8-4e1f-334cdf9e5b89.jpeg)


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

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

Windows側でフォーマットする方法は以下です。
【フォーマットの方法】
Windows機にメモリを挿入し、フォーマットを行う。ファイルシステム：exFAT、アロケーションユニットサイズ：標準のアロケーションサイズを選択する。
![キャプチャ.JPG](https://qiita-image-store.s3.amazonaws.com/0/278731/ca33c278-b0a9-3ebb-036e-1d23b053c227.jpeg)

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

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

```bash
sudo fdisk -l
```

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

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

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

```bash
sudo apt-get install exfat-fuse
```

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

```bash
sudo mount /dev/sda1 /media/usbmem1
```

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

```bash
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で撮影しました。

```bash
sudo apt-get install motion
```

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

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

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

```bash
#!/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カメラの高解像度化が更に進めば、より精度の高いモニタリングも可能になってきます。
現在、実際にこれを使って海岸のモニタリングを行っております。