概要
RaspberryPiに温度センサーを接続し、センサーデータをAWS CLIを使ってDynamoDBに書き込んで、IoT.kyoto VISで可視化します。
必要な機材
- PC
- RaspberryPi 2または3
- micro USB電源
- micro SDカード (8GB以上)
- DS18B20(温度センサー)
- 2.2kΩカーボン抵抗
- ブレッドボード
- ジャンパワイヤ オスーメス 3本
前提条件
- AWSアカウントをもっていること。アカウント開設手順はこちら
- RaspberryPiにRaspbianがインストール済みで、PCからSSHでログインまたはHDMI接続のモニタでターミナル操作ができること。手順はこちら。Raspbianは[Release date:2017-01-11]で動作確認しています
- RaspberryPiがインターネットに接続できていること
[ToDo 0] RaspberryPiの準備
インターネット接続確認
RaspberryPiをインターネットに接続し、PCから有線LANまたはWi-Fi経由でSSH接続します。
RaspberryPiのIPアドレスが分からない場合は、こちらを参考にGUIやifconfig
コマンド等で調べてください。下記の場合、192.168.0.209がRaspberryPiのIPアドレス(Wi-Fi)であることが分かります。
Wi-Fiを利用するのにwlan0
にIPアドレスが割り当てられていない場合は、こちらを参考にWi-Fiアクセスポイントへの接続設定を行って下さい。
$ ifconfig
wlan0 Link encap:Ethernet HWaddr cc:e1:d5:4d:59:5e
inet addr:192.168.0.209 Bcast:192.168.0.255 Mask:255.255.255.0
inet6 addr: 2001:268:d006:d652::2/128 Scope:Global
wget
コマンドで適当なURLを打ってみればインターネットに接続できているか確認ができます。
$ wget https://google.co.jp
--2016-03-23 17:53:19-- https://google.co.jp/
Resolving google.co.jp (google.co.jp)... 2404:6800:4003:809::2003, 106.162.198.104, 106.162.198.123, ...
Connecting to google.co.jp (google.co.jp)|2404:6800:4003:809::2003|:443... connected.
HTTP request sent, awaiting response... 301 Moved Permanently
Location: https://www.google.co.jp/ [following]
--2016-03-23 17:53:30-- https://www.google.co.jp/
Resolving www.google.co.jp (www.google.co.jp)... 2404:6800:4007:805::2003, 106.162.192.173, 106.162.192.167, ...
Connecting to www.google.co.jp (www.google.co.jp)|2404:6800:4007:805::2003|:443... connected.
HTTP request sent, awaiting response... 200 OK
Length: unspecified [text/html]
Saving to: ‘index.html’
index.html [ <=> ] 18.90K --.-KB/s in 0.1s
2016-03-23 17:53:32 (130 KB/s) - ‘index.html’ saved [19358]
アップデートとvimのインストール
インターネット接続が確認できたら、下記を実行します。
$ sudo apt-get update
$ sudo apt-get install -y vim
[ToDo 1] APIアクセス用のKeyを作成する(AWS)
DynamoDBにAPIでアクセスするために、IAM Access Keyを作成します。 今回作成するのは下記にある2つのユーザーおよびそれにひも付くKeyです。
ユーザー名 | アクセス権 | 使用箇所 |
---|---|---|
dynamo-full | AmazonDynamoDBFullAccess | RaspberryPiからDynamoDBへの書き込み |
dynamo-read | AmazonDynamoDBReadOnlyAccess | IoT.kyoto VISからDynamoDBへの読み出し |
- AWSにサインインする
- Identity and Access Management(IAM)コンソールを開く
※ 英語画面で説明するので日本語表示になっている場合は、画面左下の言語選択を「English」に変更する
- 「dynamo-full」という名前でProgrammatic accessユーザーを作成する
- [Attach existing policies directly]をクリックし、[dynamo]で検索して、[AmazonDynamoDBFullAccess]にチェックを入れる
- [Next: Review]をクリックする
- [Create user]をクリックする
- 認証情報の書かれたCSVをダウンロードし、[Close]をクリックする
- 同様に「dynamo-read」ユーザーを作成してIDとKeyを取得し、[AmazonDynamoDBReadOnlyAccess]の権限をアタッチする
[ToDo 2] DynamoDBのテーブルを作成する
ここで設定した値は、[ToDo 5]で使うので、控えておいてください。
- DynamoDBコンソールを開く
※ 英語画面で説明するので日本語表示になっている場合は、画面左下の言語選択を「English」に変更する
- リージョンが「Asia Pacific (Tokyo)」でない場合は変更する
- [Create table]をクリックする
- [Table name]に任意のテーブル名を入力する
- [Partition key]にデバイスを識別するKey(今回は「ID」)を入力する
- [Add sort key]にチェックを入れ、タイムスタンプのKey(今回は「time_sensor」)を入力する
- [Create]をクリックする
[ToDo 3] AWS CLIをインストールする(RaspberryPi)
AWS CLIのインストール
pipコマンドでRaspberryPiにAWS CLIをインストールします。
$ sudo pip install awscli
(途中省略)
Successfully installed awscli botocore PyYAML docutils rsa s3transfer jmespath python-dateutil futures
Cleaning up...
AWS CLIの設定
CLIを実行する際のリージョンや認証情報を設定します。認証情報は[ToDo 1]でダウンロードした「dynamo-full」のCSVを参照します。
項目 | 入力内容 |
---|---|
AWS Access Key ID | (CSV参照) |
AWS Secret Access Key | (CSV参照) |
Default region name | ap-northeast-1 |
Default output format | json |
$ aws configure
AWS Access Key ID [None]: ************
AWS Secret Access Key [None]: ************
Default region name [None]: ap-northeast-1
Default output format [None]: json
[ToDo 4] 温度センサー回路を組み立てて温度を計測する(RaspberryPi)
1-wireデジタル温度センサーとは
RaspberryPiのGPIOはデジタル信号しか受け付けませんが、多くのセンサー類はアナログ信号を出力しますので、ADコンバーターを使って信号を変換する必要があります。今回使うデジタル温度センサーDS18B20は、1-wire規格に準拠しており、1本の信号線だけで低速なデジタルデータ転送を行うことができるので、回路が非常にシンプルになります。
温度センサー回路の組み立て
念のため、RaspberryPiをシャットダウンして回路を接続して下さい。
下記のパーツを図の通り配線し、RaspberryPiの電源をONにします。ジャンパワイヤの色は図の通りでなくてかまいません。
- DS18B20
- 2.2kΩカーボン抵抗
- ブレッドボード
- ジャンパワイヤ オスーメス 3本
RaspberryPiの設定
※ Raspbian STRETCH以降では、GUIやraspi-configコマンドで1-wireデバイスを有効化すれば本項作業は不要です。IoT.kyotoハンズオン機材は1-wireデバイス有効化済みです。
- 1-wireデバイス用のモジュールを起動時に読み込むようにする
$ sudo vim /etc/modules
(最後尾に下記2行を追記する)
w1-gpio
w1-therm
- 1-wireデバイスのGPIOに関する設定を記述する
$ sudo vim /boot/config.txt
(最後尾に下記1行を追記する)
dtoverlay=w1-gpio-pullup,gpiopin=4
- リブート後、再度ログインする
$ sudo reboot
温度を読み出す
DS18B20は温度をファイルに書き込む仕様となっています。再起動すると/sys/bus/w1/devices/28-************/
(28-************
は個体により異なるデバイスID)というディレクトリが作成されており、その中にw1_slave
というファイルが見つかるはずです。t=
に続く5桁の整数を1000で割った数が温度(摂氏)です。
デバイスID 28-************
は[ToDo 5]で使うので控えておいてください。
$ cd /sys/bus/w1/devices/
$ ls -l
total 0
lrwxrwxrwx 1 root root 0 Feb 6 01:28 28-************ -> ../../../devices/w1_bus_master1/28-************
lrwxrwxrwx 1 root root 0 Feb 6 01:28 w1_bus_master1 -> ../../../devices/w1_bus_master1
$ cd 28-************
$ cat w1_slave
a7 01 55 00 7f ff 0c 10 22 : crc=22 YES
a7 01 55 00 7f ff 0c 10 22 t=26437
[ToDo 5] シェルスクリプトで温度データをDynamoDBにput-itemする(RaspberryPi)
シェルスクリプトで一定時間ごとに温度を読み出し、AWS CLIを叩いてDynamoDBにput-itemします。
本スクリプトはエラー処理を考慮していません。プロダクションの場合は、当然エラー処理を考慮する必要がありますので、fluentdなどのミドルウェアを使うとよいでしょう。
スクリプトを実行する
$ cd ~
$ vim temp-dynamodb.sh
deviceid=
のあとの28-************
には、[ToDo 4]で控えた28-
から始まるDS18B20のデバイスIDを入力するtablename=
のあとの*********
には、DynamoDBのテーブル名を入力する
↓temp-dynamodb.sh↓
#!/bin/bash
# 第1引数がデータの送信間隔となる(デフォルトは15秒)
if [ "$1" = "" ]
then
interval=15
else
interval=$1
fi
# DS18B20のデバイスIDをdeviceidにセット
deviceid=28-************
# DynamoDBのテーブル名をtablemnameにセット
tablename=*********
# ノードのデバイスIDをidにセット
id=id001
while [ 1 ]
do
(
# 日時をtimeにセット
time=`date '+%F %T'`
# 温度を読み取り、tempにセット
temp=$(awk -F= 'END {print $2/1000}' < /sys/bus/w1/devices/$deviceid/w1_slave)
# 送信するJSON文字列を作る
payload='{"ID": {"S":"'$id'"},"time_sensor": {"S":"'$time'"},"temperature": {"N":"'$temp'"}}'
# JSONを画面に表示
echo $payload
# AWS CLIでput-itemする(消費キャパシティのレスポンスなし)
aws dynamodb put-item --table-name $tablename --item="$payload"
# AWS CLIでput-itemする(消費キャパシティのレスポンスあり)
#aws dynamodb put-item --table-name $tablename --item="$payload" --return-consumed-capacity TOTAL
) &
sleep $interval
done
シェルスクリプトを実行します。停止する場合はctrl + C。第1引数(下記では1)が送信間隔で、省略した場合は15秒間隔で送信されます。下記のようにエラーメッセージが表示されず、JSONが連続して表示されていたら成功です。
$ sh temp-dynamodb.sh 1
{"ID": {"S":"id001"},"time_sensor": {"S":"2017-02-12 14:09:48"},"temperature": {"N":"30.437"}}
{"ID": {"S":"id001"},"time_sensor": {"S":"2017-02-12 14:09:49"},"temperature": {"N":"29.937"}}
{"ID": {"S":"id001"},"time_sensor": {"S":"2017-02-12 14:09:50"},"temperature": {"N":"29.562"}}
{"ID": {"S":"id001"},"time_sensor": {"S":"2017-02-12 14:09:51"},"temperature": {"N":"29.312"}}
DynamoDBのテーブルに書き込まれていることを確認する
[ToDo 6] IoT.kyoto VISでグラフ表示する
ブラウザはChrome(Win/Mac)またはSafari(Mac)をお使い下さい。
サインアップ
https://vis.iot.kyoto にアクセスし、「新規登録」をクリックします。
設定
IoT.kyoto VIS公式マニュアルの3~4章を参照してください。
AWSアクセス設定には、[ToDo 1]で作成した「dynamo-read」ユーザーのIAM Keyを使用します。
また、「AWS IoT連携」はOFFにしてください。(AWS IoT(という名前のサービス)から直接DynamoDBにデータを送る場合だけONにします)
下図は設定例です。