この度は本書をお買いあげいただき誠にありがとうございます。軽く本書の中身についてご紹介させていただきます。
仕事や趣味で畑をやっていたり家庭菜園をやっていて、定期的に作物や畑の画像を送れたらいいなーという方は参考になるかもしれません。外に筐体を持ち出すための工夫やバッテリーを長持ちさせるための工夫なども今回実験してみたのでご紹介します。
基本的なRaspberry piのセットアップ手順などに関してはWEB上に情報が沢山ありますので、申し訳ありませんがページ数と工数的な意味合いから割愛させていただきます。
基本的なセットアップを行い、公開鍵認証でSSH接続が出来ている前提で進めさせていただきます。同上の理由でAWSのアカウント作成なども割愛させていただきます。
大まかなゴールとしてはRaspberry piのカメラで撮影した写真をLINEで送信する、です。
本書に含まれる、含まれない内容についてまとめますと以下のようになっています。
ここで紹介する準備物は私が実際に使っている物になります。必ず同じ物を用意する必要はありません。筐体、カメラモジュール、ケーブル類、ドングルについてはお好みで用意していただいて問題ないと思います。
家庭菜園やベランダ菜園などでは WiFiが使えると思いますので、WiFiを利用する場合はUSBドングルやSimの用意は不要となります。
USBドングルの種類についてはsoracom様の用意していただいているセットアップスクリプトを利用するのが楽なので対応ドングルを用意するのが手っ取り早いです。
基本的なセットアップ手順についてはWEB上に沢山の情報が存在しているため、本書では省略させていただきます。「Raspberry pi セットアップ」などで検索していただき、出来るだけ更新日時が新しいものを実施しましょう。
セキュリティ上最低限、SSH時に鍵認証を使うようにするなどの設定はしておいた方が良いと思います。使用するOSはStrech以降が好ましいです。本書ではGUIは不要なので Raspbian の light版を使ってます。
セットアップする上でパッケージの更新を行っていない場合は念のため実施することをオススメします。初回のアップデートはそれなりに(数十分くらい?)時間がかかりますので、気長に待ちます。
$ sudo apt update $ sudo apt upgrade
raspi-configから出来ますがコマンドでも出来るでのでコマンドでやってしまいます。
$ sudo raspi-config nonint do_camera 0
$ sudo raspi-config nonint do_i2c 0
$ sudo raspi-config nonint do_change_timezone Asia/Tokyo
$ sudo apt -y install ntp
本書では Python のモジュールである picamera を使ってカメラを利用します。Python3で進めていきますが、とりあえずpipをインストールしましょう、aptでインストールします。
$ sudo apt install python3-pip
pip3がインストールできたら 以下のモジュールをインストールしていきます。AWSIoTPythonSDKは AWS IoT Core との連携に使用します。
$ sudo pip3 install picamera
$ sudo pip3 install boto3
$ sudo pip3 install AWSIoTPythonSDK
$ sudo pip3 install awscli
$ sudo pip3 install wittyPy
Raspberry piを定期的に起動させる電源管理基板です。6章で使うのですが、ここではソフトウェアのセットアップだけします。
# セットアップスクリプトのダウンロード、実行 wget http://www.uugear.com/repo/WittyPi2/installWittyPi.sh sudo sh installWittyPi.sh # fake-hwclock と ntpdデーモンの無効化 # これをしないと WittyPiが正しく動作しない恐れがあるので「y」にします Remove fake-hwclock package and disable ntpd daemon? ...(略 -> y # 今回GUIの設定ツールは使わないので「n」にします Do you want to install Qt 5 for GUI running? [y/n] -> n # この出力が出てくれば成功です。 >>> All done. Please reboot your Pi :-)
SORACOM認定デバイスのUSBドングル、「エイビット AK-020」 もしくは 「Huawei MS2131i-8」 のドングルを使っていることが前提の手順です。セットアップの詳細は以下を参照ください。
要約すると以下のコマンドを実行すればOKです。
$ curl -O https://soracom-files.s3.amazonaws.com/setup_air.sh $ sudo bash setup_air.sh
実行後、SIMが入っているUSBドングルをRaspberry piに接続すれば自動的にインターネットに接続されるはずです。インターネットに接続できない場合は一度再起動してみるとよいでしょう。
まずはカメラモジュールを取り付けます。Raspberry pi側のコネクタを優しく持ち上げて接続するのですが、力を入れると簡単にコネクタのカバーが折れてしまうので注意します。
まずはきちんとカメラモジュールが認識されているか確認してみます。
$ vcgencmd get_camera # この出力になっていれば正常です。 supported=1 detected=1
もし supported か detected のどちらかが「0」になっている場合は再度チェックしましょう。
コネクタの裏表が逆になっていないか、きちんとハマっていないか、最悪カメラモジュールが壊れている可能性もありますので再起動をしたり挿し直しをしてもダメな場合は別のカメラモジュールを買って試してみるのが手っ取り早いです。
カメラモジュールがちゃんと認識されていたら早速キャプチャしてみます。
raspistill -o capture.jpg
実行するとカメラモジュールのLEDが赤く光り、キャプチャが完了するとLEDが消えます。ls するとファイルがキャプチャしたファイルが確認できます。
$ ls capture.jpg
キャプチャした画像を確認したいのでSCPでファイルをダウンロードして見てみます。Mac側のターミナルから以下のように実行してください。
$ scp pi@raspberrypi.local://home/pi/capture.jpg ./ # openでファイルを指定すると画像が表示されます。 $ open capture.jpg
picameraからカメラモジュールを扱うときは以下のようにします。
$ python3 >>> import picamera >>> camera = picamera.PiCamera() >>> camera.capture('capture2.jpg') >>> camera.close()
キャプチャが終わったら 「Ctrl + D」 でCLIモードから抜けます。lsするとcapture2.jpgが保存されているのが確認できます。
$ ls capture2.jpg capture.jpg
再度SCPでcapture2.jpgをダウンロードして確認してみましょう。
今回は何も設定していませんが、解像度やピント調整、彩度、ISOなど様々な設定が存在します。「picamera 設定」などでググると日本語で解説している記事が色々と出てくると思います。
使用するカメラモジュールの種類やレンズのタイプによって変わってくると思いますので自分好みの設定に変更してあげるといいと思います。
とりあえず本書を進める上で使うIAMユーザーを作成しましょう。作成するユーザー名はなんでもいいです、本書ではとりあえず「iot-sample」としておきます。アクセスの種類は「プログラムによるアクセス」だけでよいです。
アタッチするポリシーはとりあえず「AmazonS3FullAccess」にします。これをつけておけば基本的にS3関連の操作がだいたいできるようになります。削除なども出来てしまうのでお試し以外ではFullAccessは使わないようにしましょう。
作成完了後「csvのダウンロード」というボタンが出てくるのでダウンロードしておきましょう。
早速作成したアクセスキーを使ってS3に画像をアップロードしてみましょう。Raspberry pi側でアクセスキーを設定するコマンドを実行します。
$ aws configure # 以下のように入力します。 AWS Access Key ID [None]:「アクセスキー」 AWS Secret Access Key [None]: 「シークレットアクセスキー」 Default region name [None]: ap-northeast-1 Default output format [None]:
上記入力後、以下のようにして s3バケットの一覧を出力してみましょう。設定がうまくいっていればバケットの一覧が表示されるはずです。
$ aws s3 ls
まれにエラーになることがありますが、いろいろ原因があります。思い当たる節をいくつか並べておきます。
時刻が合っていない、というのはRaspberry piだと結構あります。Rasoberry piはRTCを搭載していないので、再起動後は時刻がずれてしまいます。また、インターネットに接続されて自動同期されるまで時間がずれていることもあります。
アクセス権限もあるあるですが、今回のように予め用意されているポリシーをアタッチする場合はほぼほぼ大丈夫だと思います。勘違いして別のポリシーをつけていた、なんてことはありがちかもしれないです。
アップロードするためのバケットが無い人は適当に作ってください。せっかくなのでCLIコマンドを使ってバケットを作ります。
以下のコマンドでバケットの作成ができます。S3のバケット名は他のAWSアカウントとも重複ができないようになっているので「1353」となっている部分は適当に置き換えてください。
$ aws s3 mb s3://iot-sample-1353
作成ができたら確認してみましょう。作成できなかった場合はなんらかのエラーが出ると思います。
$ aws s3 ls | grep iot-sample 2020-01-30 12:00:51 iot-sample-1353
バケットができたらアップロードしてみましょう。以下のようになればアップロードができているはずです。
$ aws s3 cp capture.jpg s3://iot-sample-1353/capture.jpg upload: ./capture.jpg to s3://iot-sample-1353/capture.jpg
アップロードできてるか確認してみましょう。
aws s3 ls s3://iot-sample-1353/ 2020-01-30 12:09:45 3025602 capture.jpg
AWSのコンソールからもみてみます。ダウンロードすれば画像が見れると思います。
この章ではAWS IoT Coreとの連携についての解説になります。
前回の章では単純なS3アップロードをアクセスキーを使って行いましたが、セキュリティ上アクセスキーを端末に入れておくのはあまりよくありません。
特定のバケットのアップロードのみなどに権限を絞ってアクセスキーを運用すれば、端末の盗難などに合ってもリスクも最小限に抑えることはできますが、他のサービスを使いたくなったときにいちいち面倒ですよね。
AWS IoT CoreとRaspberry piを連携すれば権限の変更がAWS側からできたり、データの送信やデバイスの状態なども管理しやすくなります。
機能がとても豊富なので一部しかご紹介しませんが、割と簡単に使えて便利な機能が沢山あると思うのでドキュメントを読んで色々試してみるといいと思います。
では早速AWS側にRaspberry piを登録しましょう。コンソール上から操作します。
まずはポリシーを作っておきます。ここで作るポリシーはRaspberry piが IoT Core の中で使える権限の設定です。
証明書が盗まれて悪用されるとしても、IoT Core以外のサービスを使えるようになるわけでは無いのでとりあえず全部の権限をつけておきます。
ポリシーが出来たら続いてモノの登録をします。
サービス > IoT Core を開いて、「管理」「作成」をクリックします。
「単一の AWS IoT モノの登録」をクリックして、以下のように入力します。
名前だけ入力してます。他の項目は色々ありますが、一旦無視します。証明書は 1-Click証明書作成 を選びます。
証明書が作成され以下の画面になります。
一番最初に作ったポリシーがあるので、それを選択してモノの登録をクリックします。
以上でモノの登録は完了です。AWS側の受入準備は出来た状態なので、次はRaspberry pi側の準備をしていきましょう。