できること

第55回「SORACOM応用編!ラズベリーパイからDropboxへファイルをアップロード(2)定点カメラとの連携」

raspberrypi55_main
SORACOM応用編、2回目です!
今回は、この連載でも何度か作っている定点カメラをバージョンアップ!「Dropbox-Uploader」と「SORACOM Air」を連携させて、写真を自動的にクラウドにアップロードしてくれるようにカスタマイズしていきたいと思います。どれも個別にはやったことのある内容ですが、連携はうまくいくでしょうか!?

 

カメラモジュールの準備

raspberrypi55_img01

図1

今回使用するカメラは「Raspberry Pi Camera Module v2」です。500万画素から800万画素に上がり、より高画質な写真が撮影できるようになりました。詳しい機能比較は、ラズベリーパイ公式サイトにてご確認ください。

使い方については、v1もv2も同じです。

Camera Module – Raspberry Pi Documentation
ラズベリーパイ公式サイトのドキュメントです。カメラモジュールを操作する方法は、シェルスクリプトとPythonの2種類があります。

第43回「Raspberry Pi Zero V1.3+カメラモジュールでミニ定点カメラを作ろう!」
↑↑Pythonを使った方法は、こちらの記事で紹介しています。

「DevicePlus 電子工作マニュアル Vol.3 ~ラズベリーパイを活用してみよう(初級編)〜」
↑↑シェルスクリプト版はこちらのダウンロード資料で紹介しています。

「Dropbox-Uploader」はシェルスクリプトなので、今回はシェルスクリプト版で進めていきましょう。カメラを使った工作は何度かやっているので、さらっと流していきます!(詳しい内容は、前述した過去の記事や資料を参考にしてくださいね)

まず、カメラモジュールを有効化していきます。

sudo raspi-config

「6. Enable Camera」から設定します。「Raspbian Jessie with PIXEL」を使っている場合は、デスクトップのメニューにある [Preferences]-[Raspberry Pi Configuration] から設定することもできます。
設定後は、カメラをセットし、再起動しましょう。

 

写真撮影~Dropboxにアップロード(有線接続)

公式サイトのドキュメントを参考に、下記のスクリプトを作成しました。

/home/pi/camera.sh

DIR_NAME=$(date +"%Y%m%d")
FILE_NAME=$(date +"%Y%m%d%H%M%S").jpg
FILE_PATH=/home/pi/camera/$FILE_NAME
DROPBOX_PATH=$DIR_NAME/$FILE_NAME

sudo raspistill -vf -hf -w 1280 -h 800 -o $FILE_PATH
sudo -u pi /home/pi/dropbox_uploader.sh upload $FILE_PATH $DROPBOX_PATH
sudo rm -f $FILE_PATH

6行目は、写真撮影を行うコマンドです。パラメータ「-w」と「-h」はサイズ指定です。これを指定しないと、3280px × 2464pxのとても大きなファイルとなってしまうので、適切なサイズに調整しておくことをおすすめします(カメラモジュールV2の場合)。
7行目で、画像ファイルをDropboxにアップロードしています。ここでパラメータ「-u」に「pi」を指定しているのは、デフォルトのpiユーザーで「dropbox_uploader.sh」を設定したためです(rootユーザーで設定した場合は不要です)。
最後に8行目で、ローカルの画像ファイルを削除しています。上記スクリプトをそのまま使用する場合は、実行前に作業用のフォルダを作成しておきましょう。

sudo mkdir /home/pi/camera

環境の準備ができたら、スクリプトを実行してみます!まずは動作確認のため、ここでは有線LAN接続で試してみましょう。

sh /home/pi/camera.sh

撮影には少し時間がかかります。数秒待つと、作業用ディレクトリ内に写真が作成され、Dropboxへのアップロードが開始されます。アップロード後、ローカルの写真は削除されます。

raspberrypi55_img02

図2

Dropboxにアクセスして、写真がアップロードされているかどうかを確認してみましょう。
前回作ったテストファイルの他に、ディレクトリが新たに作成されています。

raspberrypi55_img03

図3

中身を見てみると、写真を発見!無事にアップロードされていることが確認できました。
横1280px縦800pxにしたところ、ファイルサイズは500KB前後でした。

 

SORACOM経由でアップロードしてみる

次は、SORACOMのネットワークを使ってアップロードしてみたいと思います!

ラズベリーパイからLANケーブルを外して、SORACOM AirをセットしたUSBモデムをセットしましょう。
そして、SORACOMで通信を行うためには、専用のスクリプトを実行する必要がありましたね(詳しくは第53回記事を参考にしてください)。

sudo /usr/local/sbin/connect_air.sh

プログラムが実行され、SORACOM Airがオンラインの状態になると、USBモデム(AK-020の場合)のライトが点滅をはじめます。また、SORACOM Airの通信状態はSORACOMユーザーコンソールの画面からも確認できます。

この状態で、camera.sh を実行します。

sh /home/pi/camera.sh

写真は無事にDropboxにアップロードされているでしょうか?先程と同様に、Dropboxにログインして、ファイルを確認してみましょう!

 

SORACOMユーザーコンソールで通信状況を確認

SORACOMユーザーコンソールでは、ネットワークの状態や通信量などの情報を、SIMカード毎に閲覧することができます。先程SORACOMのネットワークで通信した内容を、実際に確認してみましょう。

raspberrypi55_img04

図4

SIM一覧表の一列目にあるチェックボックスを選択し、表の上にある「詳細」ボタンをクリックしましょう。

raspberrypi55_img05

図5

こちらが「SIM詳細」画面です。初期表示は「詳細情報」のタブが開かれています。
そのとなりにある「通信料履歴」タブをクリックすると、2つのグラフが表示されます。

raspberrypi55_img06

図6

1つ目、上にある折れ線グラフは「月間累積データ使用量」です。1ヶ月間の通信料を確認できます。赤い線がアップロード量、青い線がダウンロード量です。

raspberrypi55_img07

図7

2つ目、下にある棒グラフは「データ使用量」のグラフです。「1ヶ月ごと」「1日ごと」「1時間ごと」の3種類の期間を選択して、閲覧することができます。図7のグラフは、定点カメラの動作確認をしていたときのものなので、「Upload」がグラフのほとんどを占めていますね。
1つ目の表との違いは、速度クラス別に表示できるところです。図7の例では、「s1.slow」と「s1.standard」の2種類の速度クラスが色分けして表示されています。

たとえば今回のような定点カメラの場合は、撮影頻度や画像のサイズなど、予算に合わせたツールを設計するために役立つ情報ですね!

raspberrypi55_img08

図8

こちらは「セッション詳細」タブを開いてみたところです。「connect_air.sh」を実行させると「Created」、終了させると「Deleted」の行が表示され、セッションの開始・終了時刻を確認できます。

 

cronを使って処理を自動化!

写真撮影からアップロードまでの一連の動作を、cronを使って自動実行できるように修正してみたいと思います。
SORACOMでのネットワーク接続を自動化するため、下記のようなスクリプトを作成しました。

/home/pi/soracom_start.sh

for i in 1 2 3
do
  if ping -c 1 soracom.jp
  then
    break
  else
    sudo sh /usr/local/sbin/connect_air.sh &
    sleep 10
  fi
done

実際に必要な処理は「connect_air.sh」の実行だけなのですが、cronから動かそうとするとうまくいかなかったので、ping送信での接続確認と「connect_air.sh」実行後のスリープ処理を加え、さらにそれらの処理を3回試すように調整してみました。pingの送信先は仮にSORACOMとしていますが、接続可能なものならなんでもOKです。
このスクリプトを、cronを使って起動時に実行(@reboot)させたいと思います。

/home/pi/camera.sh

DIR_NAME=$(date +"%Y%m%d")
FILE_NAME=$(date +"%Y%m%d%H%M%S").jpg
FILE_PATH=/home/pi/camera/$FILE_NAME
DROPBOX_PATH=$DIR_NAME/$FILE_NAME

sudo sh /home/pi/soracom_start.sh
sudo raspistill -vf -hf -w 1280 -h 800 -o $FILE_PATH
sudo -u pi /home/pi/dropbox_uploader.sh upload $FILE_PATH $DROPBOX_PATH
sudo rm -f $FILE_PATH

「camera.sh」にも一手間を。こちらは6行目に、先ほど新たに作成した「soracom_start.sh」を呼び出す処理を加えました。ラズベリーパイの起動のタイミングによっては、SORACOMにうまく接続されないことがあったので(起動直後に撮影がはじまってしまったときなど)、ネットワーク状態の確認も兼ねて「soracom_start.sh」を毎回実行させています。

準備ができたら、cronを登録していきましょう。

crontab -e

cronの設定が開いたら、ファイルの最後に下記の2行を追記します。

@reboot sh /home/pi/soracom_start.sh
0-59/10 * * * * sh /home/pi/camera.sh

nanoエディタで開くので、[Ctrl]+[O]で保存、[Ctrl]+[X]で終了です。
ラズベリーパイ起動時に「soracom_start.sh」を一度実行し(1行目)、「camera.sh」は10分毎に実行する(2行目)ように設定しました。

cronの設定はラズベリーパイの再起動後から反映されますが、今回はうまくいかないことが多かったので、cron自体を再起動して対応しました。念のため下記のコマンドも実行しておくと良さそうです。

sudo /etc/init.d/cron restart

ラズベリーパイ起動後、自動的にSORACOMのネットワークに接続し、10分毎に撮影した写真がDropboxに転送されていれば、成功です!

raspberrypi55_img09

図9

わたしの環境ではこのようになりました。

 

まとめ

SORACOM応用編、無事にツールが完成しました!
Dropbox-Uploader、SORACOM Air、ラズベリーパイカメラモジュール、そしてcronの自動実行……今まで学んできた知識を集結させた、総集編のようなかたちでお送りしました。

それぞれの使い方は分かっているつもりでも、連携させるとなるとなかなか大変!意外と苦戦してしまったのが、cronからSORACOM Airを通信させる処理です。自動実行だけに、どこがおかしいのかをなかなか見つけることができず、ここだけで数日費やしてしまいました……。

その分、使うときはとっても簡単!電源を入れるだけで、撮影からアップロードまでを自動的にやってくれるので、むずかしい操作は何も必要ありません。完全にツール化することで、ラズベリーパイの知識がまったく無い方でも利用できるという点も魅力です。

アバター画像

プロフィール:プログラミング暦通算4年、最近IT業界に舞い戻ってきたプログラマーです。女子です。

学生ロボコン2017 出場ロボット解剖計画