LoginSignup
24
20

More than 3 years have passed since last update.

Raspberry pi + AWSで温度をスマホに出力させる

Posted at

AWSど素人の私が調べながら、AWSとRaspberry piとデバイスを接続するまでの流れをまとめました。
ほとんど全部の工程を記載していくのでかなり長いですが参考になればと思います。

参考

Raspberry Pi 3 Model B+の初回セットアップ(購入から起動まで)
Raspberry Pi(Raspbian)Python3インストール
AWS IoT Device SDK for Pythonを使ってRaspberryPiとAWS IoTをつないでみる
AWS ドキュメント
AS-E405 Raspberry Pi GPIO実験ボード
ラズパイとAWS IoT連携 (Pythonで温度情報をクラウド送信)

Raspberry Piのセットアップ

まずはラズパイを使用できるようにしましょう。

OSのダウンロード

初めはmicroSDにOS(NOOBS)を入れていきます。
お手持ちのインターネットに繋がるPCで以下のリンクから、
zipファイルをダウンロードします。
・OS(NOOBS)ダウンロード
[Raspberry] noobs Download
https://www.raspberrypi.org/downloads/noobs/
image.png
ダウンロードし終わったら、解凍してSDカードへすべて移動させます。
ダウンロードはこれで終わりです。
image.png

OSセットアップ

今度は先ほどダウンロードしたOSのセットアップを行います。
OSの入ったmicroSDをラズパイに差し込みます。
microSDの場所、その他の接続は以下の画像を参考にしてください。
image.png
画像の通り差し込めたら電源をつけていきます。
といっても電源ボタンがなく、コンセントを差し込んだら起動するため既についているかもしれませんが...
以下の画像が出たら起動成功です。
image.png
※差し込んでも起動しないよという方はモニターなどを変えてみてください。
(私は恥ずかしながら、ノートPCにHDMI端子を指してつかない!と嘆いてました)
起動したらOSのセットアップが自動で立ち上がります。
image.png
まずは画像の場所から言語選択をしていきます。
image.png
次にOSを選択します
image.png
Raspbianを選択してインストールを押します。
image.png
すると以下の画面に変わりダウンロードが始まります。
image.png
次にそのまま立ち上がるウィンドウで初期設定をしましょう
image.png
言語、地域、タイムゾーンはすべてそのままで大丈夫です。
image.png
パスワードはお好きなものでかまいません。
image.png
Wifi設定しない場合はSkipでも問題ありません。
image.png
ここまで終われば一旦Reboot(再起動)し設定を適用させます。

次に日本語入力ができるように設定していきます。
まず左上にあるターミナルをクリックします。
システムのアップデート、アップグレードを行います。
さっき入れたばかりでも、日々更新されているので念のため行っておきましょう。

$ sudo apt-get update

と入力し、Enterで実行します。

$ sudo apt-get upgrade

続いてこちらも実行します。

$ sudo apt-get install ibus-mozc

それが終われば日本語入力ができるものをインストールします。
このインストールが終われば、先ほどと同じ手順で再起動します。
これで日本語設定は終わりです。

Raspberry PiにPython3をインストール

まずは先ほどの2つのシステムアップデート、アップグレードに加え、
もう一つパッケージのアップグレードを行います。

$ sudo apt-get dist-upgrede

次にビルドに必要なパッケージのインストールを行います。

$ sudo apt-get install build-essential tk-dev libncurses5-dev libncursesw5-dev libreadline6-dev libdb5.3-dev libgdbm-dev libsqlite3-dev libssl-dev libbz2-dev libexpat1-dev liblzma-dev zlib1g-dev libffi-dev libc6-dev

次にPythonのダウンロードをします。
Pythonのホームページに接続するのでインターネットに繋がるようにしておいてください。

$ wget https://www.python.org/ftp/python/3.6.6/Python-3.6.6.tgz
$ tar -zxvf Python-3.6.6.tgz
$ cd Python-3.6.6
$ ./configure --prefix=/usr/local
$ sudo make
$ sudo make install

次にインストールなどに使うpipのアップデートをします。

$ sudo pip3 install -U pip
$ sudo pip3 install -U setuptools

最後に正しくインストールできているか'-v'を使用して確認します。

$ python3 -V
Python 3.6.6

$ pip3 -v
pip 18.0 from /usr/local/lib/python3.6/site-packages/pip (python 3.6)

これでPythonのインストールは終了です。
ラズパイの下順備ができたので、次にAWSと連結させていきます。

Raspberry PiとAWS iotを繋ぐ

AWSの設定

ラズパイとAWSを繋ぐために、まずはAWSの設定を行っていきます。
AWSの画面に行き、ユーザー登録を行います。
下画像の場所から新規登録を行ってください。

※登録にはクレジットカード(無料枠を超えた段階で料金が発生するため)が必要です。
登録できないカードもあるので一度下記リンクをご確認ください。
https://aws.amazon.com/jp/premiumsupport/knowledge-center/credit-card-declined/
ちなみに今回私が作っているもの程度なら余裕で無償の範囲内です。
image.png
「アカウント」→「アカウント設定」から新規登録です。
image.png
次にログインできればこのような画面に行くと思います。
image.png
左上の「サービス」から「IoT Core」を選択します。
image.png
選択すると以下の画面が出てきます。
「今すぐ始める」を選択します。
image.png
まずは左のバーから「管理」→「モノ」を選択し、モノを作成します。
image.png
今回は「単一のモノを作成する」にチェックします。
image.png
次にモノの名前、タイプ、グループですが、好きなものをお使いください。
今回私は「test-raspberry」としています。
image.png
次に一番重要な証明書の発行です。
「1-Click証明書作成」の証明書を作成するを選択します。
image.png
証明書が作成されました。
「モノの証明書」「パブリックキー」「プライベートキー」「ルートCA」すべてダウンロードしておきます。(ダウンロードのボタンが押せるところは全部押してもらっていいです)
※ルートCAはリンク先のRSA 2048 ビットキー: Amazon ルート CA 1をローカルのテキストファイルにコピーして別名で保存します。
今回は「rootCA.pem」という名前で保存しています。
最後に有効化をクリックして完了です。
image.png
次にポリシーを作っていきます。
左のバーから「安全性」→「ポリシー」を選択します。
image.png
作成ボタンを選択すると、ポリシーの作成画面が出てきます。
名前は好きなものをつけます。
アクションはiot:*
リソースARNは*
で作成を選択します。
image.png
ポリシーと証明書を紐づけます。
左のバーから「安全性」→「証明書」を選択し、
先ほど作成した証明書に対して「ポリシーのアタッチ」を選択します。
image.png
すると以下の画面が出てくるため、先ほど作ったポリシーが出てくるので、
チェックを入れてアタッチを選択します。
image.png
以上でAWS側の設定は一旦終わりです。

Raspberry Piの設定

AWSのモジュールをダウンロードします。

$ sudo pip install AWSIoTPythonSDK
$ git clone https://github.com/aws/aws-iot-device-sdk-python.git
$ cd aws-iot-device-sdk-python

ダウンロードしてきた「Samples」の中に「cert」というフォルダを作成して、
先ほどダウンロードしてきた証明書を入れます。

$ cd samples
$ mkdir cert

手動で移動させてもらって構いません。
移動できたら、入っているか確認します。

ls cert
xxxxxxxxxx-certificate.pem.crt  xxxxxxxx-private.pem.key  rootCA.pem

xxxxxxxxxxは自身のものと一致していれば問題ありません。
これでラズパイ側の設定もいったん終了です。

テストしてみる

実際にデータが送信できるかテストしてみます。

aws.py
from AWSIoTPythonSDK.MQTTLib import AWSIoTMQTTClient
import json

# 初期化
myMQTTClient = AWSIoTMQTTClient("raspi-zero")

# MQTTクライアントの設定
myMQTTClient.configureEndpoint("エンドポイントURL", 443)
myMQTTClient.configureCredentials("./cert/rootCA.pem", "./cert/xxx-private.pem.key", "./cert/xxx-certificate.pem.crt")
myMQTTClient.configureOfflinePublishQueueing(-1)
myMQTTClient.configureDrainingFrequency(2)
myMQTTClient.configureConnectDisconnectTimeout(10)
myMQTTClient.configureMQTTOperationTimeout(5)

# Connect to AWS IoT endpoint and publish a message
myMQTTClient.connect()
print ("Connected to AWS IoT")
myMQTTClient.publish("test", json.dumps({"test": "test message!"}), 0)
myMQTTClient.disconnect()

まずはこのコードを丸パクリでいいのでSamplesの中においておきます。
エンドポイントURLと記載のあるところはAWS Iotの左バー「管理」→「モノ」で今回作成したモノを選択し、その中の操作にあります。
image.png
configureCredentialsの中身は先ほど移した「cert」の中の証明書を記載します。
では実際に動かしてみます。
AWSの画面左バーから「テスト」を選択します。
今回は「test」という名前でサブスクリプトします。
image.png
この画面になれば一旦ラズパイ側に移動します。
image.png
ラズパイのターミナルでsamplesの階層まで行きます。

$ cd aws-iot-device-sdk-python/samples

ここで先ほど作ったaws.pyを実行します。

$ python aws.py

ターミナル上でConnected to AWS IoTが出力されていればOKです。
さてAWS側に戻ってみましょう。
下記部分にtest:test message!と出力があれば接続成功です。

温度をAWSに表示させる

Raspberry Piに温度を出力させる。

今回は温度を測るセンサにサンハヤトのAS-E405を使用します。
image.png
温度データをI2Cという形式で渡すため、I2Cライブラリをインストールします。

$ sudo apt-get install i2c-tools libi2c-dev python-smbus

I2Cライブラリインストール後、「Menu→設定→Raspberry Piの設定」から「インターフェイス」を選択しI2Cの項目を有効に変更してください。

設定が反映されるように再起動を行ったのちI2Cが有効になっていることを確認します。

では続いて温度を取得するプログラムを書いていきます。
これはサンハヤトのHPに載っているものをコピペでOKです。
あげるとするならコピペした場合、一番下の出力時間が1秒になっているので、
お好みの時間に合わせることを推奨します。
今回は10秒に設定します。

ondo.py

#!/usr/bin/python
# coding: utf-8

import smbus
import time

bus = smbus.SMBus(1)    #I2Cバス番号
address = 0x48          #TMP102のI2Cアドレス

#I2C data write (1byte)
def write(reg, value):
    bus.write_byte_data(address, reg, value)

#I2C data read (1byte)
def read(reg):
    value = bus.read_byte_data(address, reg)
    return value

#I2C data write (block)
def blockread(reg, value):
    value = bus.read_i2c_block_data(address, reg, value)
    return value

while 1:
    temp_raw = blockread(0x00, 2)   #I2Cで温度データ(2byte)を取得
    #温度データを整形
    temp = ((temp_raw[0] << 8) | temp_raw[1]) >> 4
    #分解能(0.0625℃)倍する
    temp = temp * 0.0625
    #表示出力
    print("temp = " + str(temp) + "*C")

    time.sleep(10)   #10秒

一旦このソースコードを実行してみます。
下のように出力されていれば成功です。
image.png
次にAWSに飛ばせる形にしていきます。
先ほどのテストで使用したソースと今回の温度情報を取得するソースを合体させます。

grip.py


#!/usr/bin/python
# coding: utf-8
from AWSIoTPythonSDK.MQTTLib import AWSIoTMQTTClient
import json
import smbus
import time
import sys

myMQTTClient = AWSIoTMQTTClient("raspi-zero")

myMQTTClient.configureEndpoint("a3r6ipupo6zx5v-ats.iot.us-west-2.amazonaws.com", 443)
myMQTTClient.configureCredentials("./cert/rootCA.pem", "./cert/e6e3d9969f-private.pem.key", "./cert/e6e3d9969f-certificate.pem.crt")
myMQTTClient.configureOfflinePublishQueueing(-1)
myMQTTClient.configureDrainingFrequency(2)
myMQTTClient.configureConnectDisconnectTimeout(10)
myMQTTClient.configureMQTTOperationTimeout(5)


myMQTTClient.connect()
print ("Connected to AWS IoT")

bus = smbus.SMBus(1)    
address = 0x48          
try:
    def write(reg, value):
        bus.write_byte_data(address, reg, value)

    def read(reg):
        value = bus.read_byte_data(address, reg)
        return value

    def blockread(reg, value):
        value = bus.read_i2c_block_data(address, reg, value)
        return value

    while 1:
        temp_raw = blockread(0x00, 2)   
        temp = ((temp_raw[0] << 8) | temp_raw[1]) >> 4

        temp = temp * 0.0625

        print("temp = " + str(temp) + "*C")

        myMQTTClient.publish("test", json.dumps({"default": (temp)}), 0)

        time.sleep(10)   
except eyboardInterrupt:
        myMQTTClient.disconnect()
        sys.exit(0)

乱雑ですがこのようになりました。
それでは先ほどと同様テストしてみましょう。
AWSのテストからサブスクリプト「test」を作成。
image.png
ラズパイ側でソースコードを実行します。

$ Python testondo.py

テストの画面で温度が表示されました。
image.png
これで、温度の取得からAWSにデータを飛ばすことができました。

AWS SNSを利用してデバイスに送信する

AWS SNSの設定

AWSのサービス画面からSimple Notification Serviceを選択します。
※似たようなものにSMSというのがあるので間違えないように!
SNSの設定は簡単です。
まずは、トピックの名前を設定しましょう。
ここは好きな名前で構いません。
image.png
いろいろ出てきますが全部無視して、トピックの作成を行います。
これでトピックができました。
image.png
次にサブスクリプションを作成します。
ここで先ほどのモノと紐づけます。
image.png
ここから作成に入ります。
まずトピックARN。これは先ほど作成したトピックのARNと紐づけます。
image.png
ARNはトピックの画面位置に書いてあります
image.png
次にプロトコルですが、今回はEMAIL形式を選択します。
最後にデータを送りたいデバイスのメールアドレスを記入して、サブスクリプションの作成は終了です。
作成が完了すると設定したメールアドレス宛に確認メールが飛んでくるので、URLをクリックし確認できれば、サブスクリプションのステータスが以下のように変化します。
ステータスが確認済みになっていればOKです。
image.png

AWS IoTの設定

IoT画面左バーの「ACT」からルールを作成します
image.png
まずは名前を決めます。
ここはなんの名前でも大丈夫です。
image.png
次に下にちょろっと見えているルールクエリステートメントの設定です。
ここではデータを取得する条件を記述します。
今回はテストの名前を'test'とするため

select * from 'test'

と記載します。
image.png
次にアクションの追加を行います。
今回はメッセージで送るのでSNSプッシュ通知を選択。
image.png
次の画面でターゲットを選択します。
ターゲットは先ほど作成した、SNSのターゲットを選択します。
メッセージ形式はJSONです。
そのままロールの作成も行います。
image.png
作成をクリックすると以下の画面が出てくるので、適当な名前を入力します。
image.png
作成を押せば下のような画面になっていると思います。
アクションの追加を押して、ルールは完成です。
image.png

動かしてみる

例によってテストからtestを作成して、プログラムを実行してみます。
image.png
データが取れました。
image.png
そしてメールにも送られました。
image.png

終わりに

今回初めてAWSを使用してみて、クラウドの有用性を実感しました。
今後もっといろいろなものを試してみようと思います。
長くなりましたが、読んでいただきありがとうございました。

24
20
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
24
20