こんにちは。島村です。
M5Stack Core2 for AWS が発売されてすぐに 購入したものの、手をつけていませんでした。
先日、物を整理していたときに見かけたので触ってみました。
M5StackをAWS IoT Coreに登録するところまで、試します。
私自身、AWSのIoT分野のサービスはあまり触れる機会がないのと、IoT分野の知識は疎いので 備忘録として調べたことを本ブログでまとめられたらと思います。
M5Stackとは
M5Stackとは、CPU(ESP32)や無線通信、カラーディスプレイや、microSDスロットなどもあらかじめ組み込まれており
ハードウェアの構成をせずとも、開発をスタートできる手軽さがある製品です。
Stackとついている名前の通り、専用のモジュールを積み重ねて使用することで機能拡張もできるようになっています。
M5Stack Core2 for AWSは、M5Stack Core2という製品に、M5 GO Bottom2(Core2専用バッテリーボトム)と
Microchip社製セキュアエレメント(Trust&GO暗号認証チップ)が付与されているモデルです。
~補足~ AWS IoTのデバイス認証について
Microchip社製セキュアエレメント(Trust&GO暗号認証チップ)の存在が気になったので少し調べてみました。
Trust&GO暗号認証チップには出荷された段階で、証明書とマニフェストファイルが格納されています。
暗号認証チップに含まれている秘密鍵と証明書、マニフェストファイルを使用して、AWS IoTに証明書を登録し、デバイス認証ができるようになります。
ジャストインタイム登録の方法を使用するようにすればモノの登録を自動で行うことができます。
デバイス認証を行うにはクライアント証明書の他にもCognitoやIAMも利用ができます。
クライアント証明書の場合、証明書を発行し、デバイスに格納する必要があります。
セキュアエレメントを利用する場合は、これらの手間が省かれることになります。
M5Stack Core2 for AWSを使用したAWS公式のWorkshopでは、セキュアエレメントの証明書を利用したハンズオンもありますので、
今後試したいと思います。
今回は、AWS IoTで発行できるクライアント証明書を利用します。
環境
今回使用した環境とバージョンを記載します。
項目 | バージョン |
---|---|
MacBook Pro M1 Pro | Ventura ver.13.4 |
M5 Bunner | バージョン3.0.0 (3.0.0) |
UI Flow | 1.12.2 |
試してみる
環境準備
USB DRIVER&M5 Bunnerのインストール
まずは環境を作成していきます。
端末とM5 Stackを接続するためにUSBシリアルドライバとファームウェアの書き込みにM5 Bunnerを利用するので、
以下のサイトからダウンロードします。
ネットのブログ記事などでは、Mac OSの場合ドライバをインストールしなくとも接続ができたという方がいらっしゃいましたが
私はインストールしないと動作しませんでした。
M5Stack Core2 for AWS 仕様書のUSBシリアルの欄を確認すると、CP2104になっていました。
通常のM5Stack Core2ではCP2104かCP9102のどちらかのようなので、通常のCore2であればCP9102もインストールしておいた方がいいと思います。
M5Stack Core2 for AWS - ESP32 IoT開発キット — スイッチサイエンス
M5 Bunnerは解凍した後、アプリケーションフォルダに移動しないとファームウェアが表示されないので注意してください
ファームウェアの書き込み
M5 Bunnerを開きます。
左メニューからCore2&TOUCHを選択し、<UIFlow_Core2>をダウンロードしてください。
※スクリーンショットはすでにダウンロードしてある画面になります。
M5Stack Core2 for AWSに付属のUSBケーブル(AtoC)でPCと接続します。
正常に接続ができると右上にデバイスが見つかった旨表示されます。
[Burn]を押し、ファームウェアを書き込んでください。
ファームウェアの書き込みが正常に完了した後、[Configure]を選択します。
USBシリアルポートを選択し、設定をロードします。
設定の追加と変更を行なっていきます。
以下変更点です。
設定項目 | 値 |
---|---|
start mode | Internet Mode |
Boot Beep | OFF |
WIFI SSID | 利用しているWifiのSSID |
WIFI Password | 利用しているWifiのパスワード |
設定変更が完了したらSaveし、M5 Stackが再起動します。
API Keyの表示とWifiに接続しているアイコンが表示されれば問題ありません。
AWS IoT の設定
AWS IoTでモノの登録を進めていきます。
IoTコンソールへ移動しましょう。
モノの登録
IoTコンソールへ移動したら、[すべてのデバイス]→[モノ]→[モノを作成]を選択します。
今回は1つのデバイスなので、[1つのモノを作成]を選択します。
[モノのプロパティ]ではモノの名前だけ入力します。追加設定は行いません。
デバイスシャドウは使用しません。
次に証明書の設定です。
今回はAWS IoTで証明書を発行します。
AWS IoTポリシーで証明書にアタッチする権限を選択します。
リソースとアクションに制限をかけないポリシーを作成し、アタッチします。
[モノを作成]を押します。
証明書がダウンロードできるので、取得しておきます。
準備ができたので、UI Flowで動作を作っていきます。
UI Flow
デバイスに記載されているURLをWebブラウザに入力し、アクセスします。
UI Flowのバージョンを選択する画面が出るので、バージョン1を選択します。
API キーの入力が求められるので、デバイスの画面に記載されている値を入力します。
問題なく接続できたら、動作を作り込んでいきます。
ブロックを組み合わせて、ロジックを作っていくこともできますし、Pythonで記述することもできます。
今回は、ボトム側のバッテリーについている温度の値をトピックに発行したいと思います。
ブロックで構成すると画像の通りになります。
コードは次のとおりです。
from m5stack import * from m5stack_ui import * from uiflow import * from IoTcloud.AWS import AWS import json import time screen = M5Screen() screen.clean_screen() screen.set_screen_bg_color(0xFFFFFF) temp = M5Label('text', x=34, y=57, color=0x000, font=FONT_MONT_14, parent=None) def fun_core2_msg_(topic_data): # global params temp.set_text(str(topic_data)) pass aws = AWS( things_name='m5stack_core2_aws', host='ag1j7karewlsm-ats.iot.ap-northeast-1.amazonaws.com', port=8883, keepalive=60, cert_file_path="/flash/res/certificate.pem.crt", private_key_path="/flash/res/private.pem.key" ) aws.subscribe(str('core2/msg'), fun_core2_msg_) aws.start() while True: aws.publish(str('core2/msg'),str((json.dumps(({'temp':(power.getTempInAXP192())}))))) wait(5) wait_ms(2)
試してみる
接続を試してみます。
AWS IoTコンソールに移動し、[モノ]から作成したデバイスを選択、[アクティビティ]→[MQTTクライアントのテスト]を選択します。
トピックをサブスクライブします。
コードで指定したトピックを指定します。今回の場合だと、[core2/msg]ですね。
いよいよ実行です。UI Flowから[Run]を押して、コードを実行していきます。
コードを実行すると、トピックにメッセージを発行します。
5秒おきにサブスクライブしたトピックにメッセージが来ていることが確認できると思います。
デバイスの画面では、トピックから取得した値を表示するようになっています。
最後に
私自身、AWS IoT関連のサービスに触れる機会はあまりありませんでしたが、なんとか登録することができました。
ジャストインタイム登録の方法が便利だなと感じたので、今後検証を通して利用してみたいと思います。
また、テントサウナで使用できる一酸化炭素センサーを作ってみようと思いました。
IoTは日常のアイデアを利用していろいろ作れたら楽しくなりそうです。
参考
島村 輝 (Shimamura Hikaru) 記事一覧はコチラ
最近ECS周りをキャッチアップ中。趣味は車・バイク全般。
一応、AWS12冠です。