もう結構前の話になってしまいますが、 re:Invent 2017で Amazon FreeRTOS が発表されました。
そもそも RTOS とはなんぞやというような説明はここでは割愛しますが、発表されてから気になっていたので今回は実機でチュートリアルに従ってサンプルを動かすまでをやってみました。
開始方法はこちらで紹介されています。
Amazon FreeRTOS – 開始方法 – AWS
対象ハードウェア
公式にサポートされているハードウェアは開始方法のページでも紹介されていて、まだまだ限定的ですが、その中でも Espressif の ESP32-DevKitC は秋月電子で簡単に購入できそうだったので今回はこちらを使用してみます。
ESP32-DevKitC は以前 ESP-WROOM-32 を使ってみようとした時に、突入電流対策が取られていなかったようなので ESPr Developer 32 の方を選択したのですが、今回は多少の不安はありつつも楽観的に考えて使ってみることにしました。
チュートリアルは対象ハードウェア別に用意されていて、 ESP32-DevKitC のチュートリアルは下記ページになります。
事前準備
各ハードウェア向けの作業をする前にいくつか事前準備をしておきます。まずは使用する AWS アカウントの IAM ユーザに下記ポリシーを追加し、 FreeRTOS と AWS IoT 関連の権限を付与しておきます。
AmazonFreeRTOSFullAccess
AWSIoTFullAccess
次に AWS IoT コンソールから、デバイスで使用するためのポリシーを作成しておきます。 AWS IoT のコンソールの左メニューから 安全性
-> ポリシー
を選択して、 ポリシーの作成
をクリックします。
ポリシーの作成画面になりますので、自分でわかりやすい名前を入力し、ポリシーの設定方法を アドバンストモード
に変更した上で、 Json ドキュメントを入力して設定します。チュートリアルで記載されている Json は下記のようなものになります。
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": "iot:Connect", "Resource":"arn:aws:iot:<aws-region>:<aws-account-id>:*" }, { "Effect": "Allow", "Action": "iot:Publish", "Resource": "arn:aws:iot:<aws-region>:<aws-account-id>:*" }, { "Effect": "Allow", "Action": "iot:Subscribe", "Resource": "arn:aws:iot:<aws-region>>:<aws-account-id>:*" }, { "Effect": "Allow", "Action": "iot:Receive", "Resource": "arn:aws:iot:<aws-region>:<aws-account-id>:*" } ] }
しかしこれだと実際に動かしてみた時に権限が足りず、 AWS IoT に接続できなかったので、細かくどの権限が足りなかったのかは確認しませんでしたが、とりあえず AWS IoT に関して全ての操作が可能なように下記のように設定しました。
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "iot:*" ], "Resource": [ "*" ] } ] }
入力したら 作成
ボタンをクリックしてポリシーを作成します。
次に今回使用するハードウェアをモノ(Thing)として登録します。 AWS IoT コンソールの左メニューから 管理
-> モノ
と選択して、 作成
ボタンをクリックします。
今回は1つだけ登録するので、 単一のモノを作成する
をクリックします。
作成フォームが表示されたら登録するモノの名前を入力して 次へ
をクリックします。
モノで使用する証明書を作成します。 「1-Click 証明書作成」の 証明書の作成
ボタンをクリックします。
証明書が作成されたら証明書とキーを ダウンロード
をクリックしてダウンロードしておきます。また 有効化
ボタンをクリックして証明書を有効化して、 ポリシーのアタッチ
ボタンをクリックします。
先ほど作成したポリシーを選択して、 モノの登録
ボタンをクリックします。これでひとまずの事前準備は終了です。
Toolchain のセットアップ
ここからは対象とするハードウェアを使うための設定になります。まずは Toolchain のセットアップです。 Espressif のサイトからダウンロードして展開します。
$ cd $ mkdir esp $ cd esp $ wget https://dl.espressif.com/dl/xtensa-esp32-elf-osx-1.22.0-80-g6c4433a-5.2.0.tar.gz $ tar zxf xtensa-esp32-elf-osx-1.22.0-80-g6c4433a-5.2.0.tar.gz
あとはパスを通すために .bashrc などに下記のように export を追加すればOKです。
$ tail -2 ~/.bashrc ### ESP32 toolchain export PATH=$PATH:$HOME/esp/xtensa-esp32-elf/bin
Amazon FreeRTOS のダウンロード
Amazon FreeRTOS は下記のリポジトリで公開されています。
これを git clone でローカルに取得します。
$ git clone https://github.com/aws/amazon-freertos.git
$ cd amazon-freetos
プロジェクト設定
FreeRTOS をビルドするには Python 2.7.10 以上の環境が必要になります。最新の 3.6.5 で試してみたところ make に失敗したので、 pyenv で2系の最新の 2.7.15 の環境を用意しました。
$ pyenv versions system * 2.7.15 (set by /Users/akanuma/workspace/amazon-freertos/.python-version) 3.6.5
pyserial と boto3 も必要なので、 pip でインストールします。
$ pip install pyserial $ pip install boto3
ダウンロードした FreeRTOS の中にはセットアップを簡単にするための設定ファイルが含まれています。下記ファイルの中の設定を実際に資料する環境に合わせて変更します。
$ cat demos/common/tools/aws_config_quick_start/configure.json { "thing_name":"ESP32-DevKitC", "wifi_ssid":"xxxxxxxxxx", "wifi_password":"xxxxxxxxxxxxx", "wifi_security":"eWiFiSecurityWPA2" }
そしてセットアップスクリプトを実行します。
$ cd demos/common/tools/aws_config_quick_start
$ python SetupAWS.py setup
ここまで来たら ESP32-DevKitC を Mac に USB ケーブルで接続します。すると私の環境では /dev/cu.SLAB_USBtoUART
のように認識されました。
次に下記コマンドを実行して Espressif IoT Development Framework の設定メニューを表示させます。
$ cd demos/espressif/esp32_devkitc_esp_wrover_kit/make/
$ make menuconfig
メニューが表示されたら Serial flasher config
メニューを選択します。
Default serial port を環境に合わせて設定します。
必要に応じて Default baud rate
の設定も行い、設定を保存してメニューを終了させます。
あとはこれで最後に make コマンドを実行すれば AWS IoT に接続して MQTT のメッセージの送受信を行うデモが実行されるのですが、私の場合は途中で Python のバージョンの切り替えをしたりしていたせいか、 demos/common/tools/aws_config_quick_start/configure.json
に設定した Wi-Fi の AP の情報が反映されておらず、また、証明書の情報も設定されていなかったので、下記ファイルを直接変更して設定しました。
$ ls -l demos/common/include/aws_clientcredential* -rw-r--r-- 1 akanuma staff 2814 May 27 03:43 demos/common/include/aws_clientcredential.h -rw-r--r--@ 1 akanuma staff 3873 May 27 03:55 demos/common/include/aws_clientcredential_keys.h
Wi-Fi AP の情報は aws_clientcredential.h を直接編集しました。また、 aws_clientcredential_keys.h の方は生成ツールが下記パスに用意されています。
demos/common/devmode_key_provisioning/CertificateConfigurationTool/CertificateConfigurator.html
これをブラウザで開くとクライアント証明書とプライベートキーのファイルをアップロードできるフォームが開きますので、事前準備で AWS IoT コンソールからダウンロードしたファイルを指定し、 aws_clientcredential_keys.h を生成します。
サンプルの実行
それではサンプルを実行します。下記のように make コマンドを実行すると、ファームウェアが実機に書き込まれ、実行されます。
$ cd demos/espressif/esp32_devkitc_esp_wrover_kit/make/
$ make flash monitor
内容としては、ファームウェアのビルド、実機への書き込み、 Wi-Fi 接続、AWS IoT への接続が行われ、 MQTT によるメッセージの送信が12回行われて終了します。エラーなく最後に下記のログが出力されれば成功です。
352 6936 [MQTTEcho] MQTT echo demo finished.
AWS IoT コンソールからもメッセージの送受信が行われたことが確認できます。
まとめ
とりあえずチュートリアルに従うことで実機でサンプルを動作させることはできました。実際に自前のファームウェアを実装していく方法はまだよくわかってませんが、 Amazon FreeRTOS には Greengrass 等の AWS サービスと連携するためのライブラリも含まれていたり、 OTA でのファームウェアアップデートもできるようなので、そのあたりの使い方も今後調べてみたいと思います。