まえがき

この度は本書をお買いあげいただき誠にありがとうございます。軽く本書の中身についてご紹介させていただきます。

 

仕事や趣味で畑をやっていたり家庭菜園をやっていて、定期的に作物や畑の画像を送れたらいいなーという方は参考になるかもしれません。外に筐体を持ち出すための工夫やバッテリーを長持ちさせるための工夫なども今回実験してみたのでご紹介します。

 

基本的なRaspberry piのセットアップ手順などに関してはWEB上に情報が沢山ありますので、申し訳ありませんがページ数と工数的な意味合いから割愛させていただきます。

基本的なセットアップを行い、公開鍵認証でSSH接続が出来ている前提で進めさせていただきます。同上の理由でAWSのアカウント作成なども割愛させていただきます。

 

大まかなゴールとしてはRaspberry piのカメラで撮影した写真をLINEで送信する、です。

 

本書に含まれる、含まれない内容についてまとめますと以下のようになっています。

本書に含まれる内容

  • Raspberry piでカメラを使う
  • AWS IoT Core の一部機能を解説
  • AWS IoT Core と連携して画像を送信する
  • WittyPi の使い方について
  • 外にRaspberry piを置きたいときの工夫

本書に含まれない内容

  • 基本的なRaspberry piのセットアップ手順
  • AWSの基本的な説明
    • IAMとはなにかなど。
  • PythonやShellscriptの詳細な解説

第1章 準備

1.1 本書を作成するにあたり用意したもの

ここで紹介する準備物は私が実際に使っている物になります。必ず同じ物を用意する必要はありません。筐体、カメラモジュール、ケーブル類、ドングルについてはお好みで用意していただいて問題ないと思います。

 

家庭菜園やベランダ菜園などでは WiFiが使えると思いますので、WiFiを利用する場合はUSBドングルやSimの用意は不要となります。

 

USBドングルの種類についてはsoracom様の用意していただいているセットアップスクリプトを利用するのが楽なので対応ドングルを用意するのが手っ取り早いです。

  • 作業用PC
    • Mac前提ですが、ローカルで行う作業はそこまでないのでWindowsでも特に問題ないと思います。
  • raspberry pi zero wh
    • 消費電力的な問題があるため zero系にしてます。WiFiを使いたい方は zero w にするとよいでしょう。WHというはヘッダーピンが実装済みのものになります。ヘッダピーピンがない場合は自分でヘッダーピンをハンダ付けしないといけないです。
  • Witty pi
    • バッテリー駆動時の要になるハットです、6章で解説します。
  • micro sdカード
    • Raspberry piのOSをインストールする用です。
  • カメラモジュール
    • お好みで構わないです、大体のUSBカメラでも本書の手順で同じことができるはずです。割とお高いので、なるべく安く買いたい人は「Aliexpress」などの通販サイトを使うといいと思います。基板が黒い、暗視機能がついているものは昼間に撮影すると赤外線の影響でカラー画像にならないので注意します。
  • モバイルバッテリー
    • 大体1万mAくらいの物がオススメです。大きすぎると筐体に入れるのが大変なので、大きさはなるべく小さい方が便利だと思います。また、トリクルモード(定電流モード)に対応しているものでないとWittyPiがうまく動作しない可能性があるので気をつけます。
  • 筐体
    • モバイルバッテリーとRaspberry piとUSBドングルが格納できる物であればなんでも良いです。とはいえ防水加工をしないといけないので、100均にあるタッパーなどがオススメです。割と本格的なものについては7章で解説します。
  • ケーブル類
    • Micro USBケーブル(Raspberry piの給電用)
    • Micro USB Hostケーブル(USBドングルを接続するのに必要)
    • 基本的に短くて柔軟なものだと筐体に入れる時楽だと思います。
  • soracom sim
  • USBドングル

第2章 Raspberry pi セットアップ

基本的なセットアップ手順についてはWEB上に沢山の情報が存在しているため、本書では省略させていただきます。「Raspberry pi セットアップ」などで検索していただき、出来るだけ更新日時が新しいものを実施しましょう。

 

セキュリティ上最低限、SSH時に鍵認証を使うようにするなどの設定はしておいた方が良いと思います。使用するOSはStrech以降が好ましいです。本書ではGUIは不要なので Raspbian の light版を使ってます。

 

セットアップする上でパッケージの更新を行っていない場合は念のため実施することをオススメします。初回のアップデートはそれなりに(数十分くらい?)時間がかかりますので、気長に待ちます。

▼パッケージアップデートのコマンド

$ sudo apt update
$ sudo apt upgrade

2.1 Raspberry piの基本的な設定

raspi-configから出来ますがコマンドでも出来るでのでコマンドでやってしまいます。

▼ カメラの有効化

$ sudo raspi-config nonint do_camera 0

▼ I2Cの有効化

$ sudo raspi-config nonint do_i2c 0

▼ タイムゾーンを東京に設定

$ sudo raspi-config nonint do_change_timezone Asia/Tokyo

▼ ntpdのインストール

$ sudo apt -y install ntp

2.2 python3 関連のモジュールをインストール

本書では Python のモジュールである picamera を使ってカメラを利用します。Python3で進めていきますが、とりあえずpipをインストールしましょう、aptでインストールします。

▼ pip3のインストール

$ sudo apt install python3-pip

pip3がインストールできたら 以下のモジュールをインストールしていきます。AWSIoTPythonSDKは AWS IoT Core との連携に使用します。

▼ picameraのインストール

$ sudo pip3 install picamera

▼ boto3のインストール

$ sudo pip3 install boto3

▼ AWSIoTPythonSDKのインストール

$ sudo pip3 install AWSIoTPythonSDK

▼ aws cliのインストール

$ sudo pip3 install awscli

▼ wittyPyのインストール

$ sudo pip3 install wittyPy

2.3 Witty piのセットアップ

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 :-)

2.4 USBドングルのセットアップ

SORACOM認定デバイスのUSBドングル、「エイビット AK-020」 もしくは 「Huawei MS2131i-8」 のドングルを使っていることが前提の手順です。セットアップの詳細は以下を参照ください。

■メモ:SORACOM Users - 各種デバイスで SORACOM Air を使用する

https://dev.soracom.io/jp/start/device_setting/

要約すると以下のコマンドを実行すればOKです。

$ curl -O https://soracom-files.s3.amazonaws.com/setup_air.sh
$ sudo bash setup_air.sh

実行後、SIMが入っているUSBドングルをRaspberry piに接続すれば自動的にインターネットに接続されるはずです。インターネットに接続できない場合は一度再起動してみるとよいでしょう。

第3章 カメラモジュールを使ってみる

3.1 カメラモジュールの取り付け

まずはカメラモジュールを取り付けます。Raspberry pi側のコネクタを優しく持ち上げて接続するのですが、力を入れると簡単にコネクタのカバーが折れてしまうので注意します。

取り付けイメージ

図3.1: 取り付けイメージ

3.2 コマンドから使ってみる

まずはきちんとカメラモジュールが認識されているか確認してみます。

$ vcgencmd get_camera

# この出力になっていれば正常です。
supported=1 detected=1

もし supported か detected のどちらかが「0」になっている場合は再度チェックしましょう。

  • supported が0の場合:raspi-configでカメラを有効にしているかどうかを確認します。
  • 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

3.3 picameraで使ってみる

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 設定」などでググると日本語で解説している記事が色々と出てくると思います。

使用するカメラモジュールの種類やレンズのタイプによって変わってくると思いますので自分好みの設定に変更してあげるといいと思います。

第4章 AWSのセットアップ

「はじめに」で申し上げた通りアカウントの開設などは省略させていただきます。AWSアカウントを作成してログインできる状態であること前提で進めていきます。

4.1 IAMユーザー作成

とりあえず本書を進める上で使うIAMユーザーを作成しましょう。作成するユーザー名はなんでもいいです、本書ではとりあえず「iot-sample」としておきます。アクセスの種類は「プログラムによるアクセス」だけでよいです。

 

アタッチするポリシーはとりあえず「AmazonS3FullAccess」にします。これをつけておけば基本的にS3関連の操作がだいたいできるようになります。削除なども出来てしまうのでお試し以外ではFullAccessは使わないようにしましょう。

 

作成完了後「csvのダウンロード」というボタンが出てくるのでダウンロードしておきましょう。

4.2 アクセスキーの設定

早速作成したアクセスキーを使って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上の時刻が合っていない
  • アクセス権限がない

時刻が合っていない、というのはRaspberry piだと結構あります。Rasoberry piはRTCを搭載していないので、再起動後は時刻がずれてしまいます。また、インターネットに接続されて自動同期されるまで時間がずれていることもあります。

 

アクセス権限もあるあるですが、今回のように予め用意されているポリシーをアタッチする場合はほぼほぼ大丈夫だと思います。勘違いして別のポリシーをつけていた、なんてことはありがちかもしれないです。

4.3 S3アップロードしてみる

アップロードするためのバケットが無い人は適当に作ってください。せっかくなので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コンソール

図4.1: AWSコンソール

第5章 AWS IoT Coreとの連携

この章ではAWS IoT Coreとの連携についての解説になります。

 

前回の章では単純なS3アップロードをアクセスキーを使って行いましたが、セキュリティ上アクセスキーを端末に入れておくのはあまりよくありません。

 

特定のバケットのアップロードのみなどに権限を絞ってアクセスキーを運用すれば、端末の盗難などに合ってもリスクも最小限に抑えることはできますが、他のサービスを使いたくなったときにいちいち面倒ですよね。

 

AWS IoT CoreとRaspberry piを連携すれば権限の変更がAWS側からできたり、データの送信やデバイスの状態なども管理しやすくなります。

 

機能がとても豊富なので一部しかご紹介しませんが、割と簡単に使えて便利な機能が沢山あると思うのでドキュメントを読んで色々試してみるといいと思います。

5.1 モノの追加

では早速AWS側にRaspberry piを登録しましょう。コンソール上から操作します。

 

まずはポリシーを作っておきます。ここで作るポリシーはRaspberry piが IoT Core の中で使える権限の設定です。

 

証明書が盗まれて悪用されるとしても、IoT Core以外のサービスを使えるようになるわけでは無いのでとりあえず全部の権限をつけておきます。

画面キャプチャー 1

図5.1: 画面キャプチャー 1

画面キャプチャー 2

図5.2: 画面キャプチャー 2

ポリシーが出来たら続いてモノの登録をします。

サービス > IoT Core を開いて、「管理」「作成」をクリックします。

画面キャプチャー 3

図5.3: 画面キャプチャー 3

「単一の AWS IoT モノの登録」をクリックして、以下のように入力します。

画面キャプチャー 4

図5.4: 画面キャプチャー 4

名前だけ入力してます。他の項目は色々ありますが、一旦無視します。証明書は 1-Click証明書作成 を選びます。

画面キャプチャー 5

図5.5: 画面キャプチャー 5

証明書が作成され以下の画面になります。

  1. 証明書と鍵をそれぞれダウンロードしましょう。なおプライベートキーはここでダウンロードしないとあとでダウンロードできないので、ダウンロードし忘れた場合証明書を作り直す必要があります。
  2. ルートCAをダウンロードします。ダウンロードをクリックすると「画面キャプチャー 7」に飛びますので、「Amazon Root CA1」を保存しましょう。右クリック、別名で保存する、とすれば「AmazonRootCA1.pem」という名前で保存されるはずです。
  3. 有効化をクリック。
  4. ポリシーをアタッチをクリック。
画面キャプチャー 6

図5.6: 画面キャプチャー 6

画面キャプチャー 7

図5.7: 画面キャプチャー 7

一番最初に作ったポリシーがあるので、それを選択してモノの登録をクリックします。

画面キャプチャー 7

図5.8: 画面キャプチャー 7

以上でモノの登録は完了です。AWS側の受入準備は出来た状態なので、次はRaspberry pi側の準備をしていきましょう。

試し読みはここまでです。
この続きは、製品版でお楽しみください。