読者です 読者をやめる 読者になる 読者になる

Mana Blog Next

ガジェット好きIT系母ちゃんが二人の子どもを育てながらIoTに挑戦するブログ。

スポンサーリンク

母ちゃんがソラコムとAWS IoTでプラレールを動かしてみた話

IoT IoTプラレール 母ちゃんRaspberry Pi 人気記事

「SORACOM Advent Calendar 2016」12月19日分の予約投稿記事です。

SORACOM Advent Calendar 2016 - Qiita

AWS IoT対応のきっかけ

サーバーワークスに入社して2週間経ちました。

通常の業務をしながら、AWSの構築研修を受けています。嬉しい事に、検証環境としてAWSが使えるのでこの機会に「IoTプラレールをAWS IoTに対応させよう!」というアイデアが思い浮かびました。

お得なキャンペーンのお知らせ

本題に入る前に、お得なキャンペーンの紹介をします。

【クリスマスシーズン限定!】日本のお客様だけの期間限定キャンペーン

aws.amazon.com

アマゾン ウェブ サービス(AWS)では、2016年12月26日(月)18 時までAWSアカウントの新規取得ユーザーに対してお得なキャンペーンを実施中のようです。なんと、キャンペーンで25ドル分のクーポンがプレゼントとのこと(日本限定)。また、本キャンペーンと併せて、AWS が提供する1年間の無料利用枠も利用できるという太っ腹ぶり!ぜひ、このお得なキャンペーンを利用して、皆さんもAWSを始めてみましょう。

それでは、以下本題に入ります。

IoTプラレールの仕組み

今回は、IoTプラレールを展示用に使用することを想定し、SORACOM SIMを使って通信しています。

  1. ブラウザ上でWebアプリのボタンを押す【前進 / 停止】(MQTTパブリッシャー)
  2. AWS IoT でメッセージを受け取る (MQTTブローカー)
  3. AWS IoT とプラレール間をソラコムSIMで通信する
  4. プラレールに搭載されているRaspberry Pi Zeroでメッセージを受け取り(MQTTサブスクライバー)、モーターの制御をする(GPIO)

AWS IoTには「MQTTクライアント」というテストページがあって、今回は【前進・停止】のメッセージをPublishしてプラレールを制御しています。

f:id:mana-cat:20161218231844j:plain

用意するもの

f:id:mana-cat:20161219123427j:plain:w300

部品についてはIoTプラレールで使用したものを用意しています。なお、IoTプラレールの作り方については、過去エントリーを参照してみて下さい。

製品名 メーカーまたは販売元
単二電池で動くプラレール(DD51や金太郎など) タカラトミー
プラレール KF-10 トミカ搭載貨車 タカラトミー
Raspberry Pi Zero Raspberry Pi財団
プロトタイピングボード ProtoZero Pimoroni
ブラシモーター制御IC「BD65496MUV」 ROHM
2ピン JST プラグ コネクタ ケーブル ワイヤ オス+メス 100mm GAOHOU
DC-DCコンバーター 「POW00900M」 Seeed Studio
ミニ4駆グレードアップパーツ No.292 ラジ4駆 マルチセッティングウエイト タミヤ
Canvas 3200mAh IoT機器対応 モバイルバッテリー ホワイト CHE-061 cheero
SORACOM SIM ソラコム
Wi-Fi アダプター RTL8188CUS 802.11n WLAN Adapter Realtek Semiconductor Corp.
Pocket Wi-Fi GL04P HUAWEI

Pocket Wi-Fiについてはイーモバイル用の端末ですが、ソラコム SIMも問題無く使えます。じゃんぱらで中古980円で大変お得です。

必要情報の確認

AWSにログインし、マネージメントコンソールでAWS IoTを選択します。AWS IoTでThingsの新規作成まで終わったら、endpointのURLを確認してみましょう。Registry → Things → THING名 → Interact → HTTPS を選択すると確認できます。

  • xxxxxxxxxxx.iot.ap-northeast-1.amazonaws.com

f:id:mana-cat:20161219001717p:plain

証明書のダウンロード

AWS IoTへ繋ぐために、以下の証明書ファイルをダウンロードします。

f:id:mana-cat:20161219000701j:plain

必要な証明書ファイルをダウンロード後、「Attach policy」でポリシーを適用します。

f:id:mana-cat:20161219001310p:plain

AWS IoTへ接続するように変更する

  1. IoTプラレールのプログラムをAWS IoTへ接続するように変更します(paho-mqttを使用)
  2. sslライブラリのインポート及びポート番号8883を使用するように変更します
  3. 前手順でダウンロードした証明書ファイルをRaspberry Pi Zeroのホームディレクトリ(/home/pi)配下に置いて以下プログラムでパスを指定します
pi@dd51:~/python $ vi aws_dd51_subscriber.py

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

import RPi.GPIO as GPIO
import paho.mqtt.client as mqtt
import json
import ssl
from time import sleep

endpoint="xxxxxxxxxxxx.iot.ap-northeast-1.amazonaws.com"
rootca_path = "/home/pi/root-CA.crt"
cert_path = "/home/pi/xxxxxxxxx-certificate.pem.crt"
key_path = "/home/pi/xxxxxxxxx-private.pem.key"

state = "stop"
IN_A = 29 #GPIO:5
IN_B = 31 #GPIO:6

def on_connect(client, userdata, flags, rc):
    print("Connected with result code "+str(rc))
    client.subscribe("dd51")
    return

def on_message(client, userdata, msg):
    value = json.loads(msg.payload)
    mode = value.get('mode')
    motor_mode(mode)
    return

def gpio_init():
        GPIO.setmode(GPIO.BOARD)
        return


def gpio_cleanup():
        GPIO.cleanup()
        return

def motor_init():
        gpio_init()
        GPIO.setup(IN_A,GPIO.OUT)
        GPIO.setup(IN_B,GPIO.OUT)
        motor_stop()
        return

def motor_forward():
        GPIO.output(IN_A,True)
        GPIO.output(IN_B,False)
        return

def motor_stop():
        GPIO.output(IN_A,False)
        GPIO.output(IN_B,False)
        return

def motor_mode(mode):
    state = mode

    print "mode: {0}".format(mode)

    if mode == "forward":
        motor_forward()
    elif mode == "stop":
        motor_stop()
    else:
        motor_stop() # fail safe
    return

def main():
        motor_init()
        motor_mode("stop")
        client = mqtt.Client()
        client.on_connect = on_connect
        client.on_message = on_message

        try:
            client.tls_set(rootca_path, certfile=cert_path, keyfile=key_path, cert_reqs=ssl.CERT_REQUIRED, tls_version=ssl.PROTOCOL_TLSv1_2, ciphers=None)
            client.connect(endpoint, 8883, keepalive=60)
            client.loop_start()
            while True:
                sleep(5)
        except KeyboardInterrupt:
            print "exit"
            client.loop_stop()
            gpio_cleanup()

if __name__ == "__main__":
    main()

接続テスト

Raspberry Pi Zeroでプログラムを実行します。プラレールの電源はONにしてください。注意点としては、レールが無い場所でいきなり動作させるとどこかに行ってしまうので、プラレールは車体を横にして車輪を浮かせておくことをオススメします。

pi@dd51:~/python $ python aws_dd51_subscriber.py

f:id:mana-cat:20161218231844j:plain

AWS IoTでテストページを開き、以下のメッセージを貼り付けてパブリッシャーの動作テストをします。IoTプラレールに送信するため、「Publish to topic」ボタンを押します。そうすると、プラレールは前進・または停止をします。

プラレール前進の場合

{
  "mode": "forword"
}

モーターが動きます。

プラレール停止

{
  "mode": "stop"
}

モーターが停止します。

次回やること

無事、IoTプラレールをAWS IoT対応することができました。今回は時間が取れずに以下のことができませんでしたが、また時間を作って挑戦してみますのでお楽しみに。(週末、まさかのぽんぽんぺいん→ノロウィルスでした)

  • SORACOM Beamを使ってみる ←これやりたい
  • AWS IoT用のPython SDKを使ってみる
  • Amazon Dash Buttonを改造してプラレールの制御に使えないか挑戦してみる

執筆・取材のご依頼もお待ちしております。お気軽にお問い合わせしてね!

ラズパイマガジン 2017年2月号 (日経BPパソコンベストムック)

ラズパイマガジン 2017年2月号 (日経BPパソコンベストムック)

関連ページ

© Manami Taira