Amazon FreeRTOS のサンプルを実機で動かしてみる

 もう結構前の話になってしまいますが、 re:Invent 2017で Amazon FreeRTOS が発表されました。

aws.amazon.com

 そもそも RTOS とはなんぞやというような説明はここでは割愛しますが、発表されてから気になっていたので今回は実機でチュートリアルに従ってサンプルを動かすまでをやってみました。

開始方法はこちらで紹介されています。
Amazon FreeRTOS – 開始方法 – AWS

対象ハードウェア

 公式にサポートされているハードウェアは開始方法のページでも紹介されていて、まだまだ限定的ですが、その中でも Espressif の ESP32-DevKitC は秋月電子で簡単に購入できそうだったので今回はこちらを使用してみます。

akizukidenshi.com

 ESP32-DevKitC は以前 ESP-WROOM-32 を使ってみようとした時に、突入電流対策が取られていなかったようなので ESPr Developer 32 の方を選択したのですが、今回は多少の不安はありつつも楽観的に考えて使ってみることにしました。

 チュートリアルは対象ハードウェア別に用意されていて、 ESP32-DevKitC のチュートリアルは下記ページになります。

docs.aws.amazon.com

事前準備

 各ハードウェア向けの作業をする前にいくつか事前準備をしておきます。まずは使用する AWS アカウントの IAM ユーザに下記ポリシーを追加し、 FreeRTOS と AWS IoT 関連の権限を付与しておきます。

  • AmazonFreeRTOSFullAccess

  • AWSIoTFullAccess

 次に AWS IoT コンソールから、デバイスで使用するためのポリシーを作成しておきます。 AWS IoT のコンソールの左メニューから 安全性 -> ポリシー を選択して、 ポリシーの作成 をクリックします。

f:id:akanuma-hiroaki:20180527175213p:plain

 ポリシーの作成画面になりますので、自分でわかりやすい名前を入力し、ポリシーの設定方法を アドバンストモード に変更した上で、 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": [
        "*"
      ]
    }
  ]
}

 入力したら 作成 ボタンをクリックしてポリシーを作成します。

f:id:akanuma-hiroaki:20180527175232p:plain

 次に今回使用するハードウェアをモノ(Thing)として登録します。 AWS IoT コンソールの左メニューから 管理 -> モノ と選択して、 作成 ボタンをクリックします。

f:id:akanuma-hiroaki:20180527175311p:plain

 今回は1つだけ登録するので、 単一のモノを作成する をクリックします。

f:id:akanuma-hiroaki:20180527175329p:plain

 作成フォームが表示されたら登録するモノの名前を入力して 次へ をクリックします。

f:id:akanuma-hiroaki:20180527175530p:plain

 モノで使用する証明書を作成します。 「1-Click 証明書作成」の 証明書の作成 ボタンをクリックします。

f:id:akanuma-hiroaki:20180527175709p:plain

 証明書が作成されたら証明書とキーを ダウンロード をクリックしてダウンロードしておきます。また 有効化 ボタンをクリックして証明書を有効化して、 ポリシーのアタッチ ボタンをクリックします。

f:id:akanuma-hiroaki:20180527175726p:plain

 先ほど作成したポリシーを選択して、 モノの登録 ボタンをクリックします。これでひとまずの事前準備は終了です。

f:id:akanuma-hiroaki:20180527175757p:plain

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 は下記のリポジトリで公開されています。

github.com

 これを 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 メニューを選択します。

f:id:akanuma-hiroaki:20180527205232p:plain

 Default serial port を環境に合わせて設定します。

f:id:akanuma-hiroaki:20180527205430p:plain

 必要に応じて 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 を生成します。

f:id:akanuma-hiroaki:20180527210214p:plain

サンプルの実行

 それではサンプルを実行します。下記のように 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 コンソールからもメッセージの送受信が行われたことが確認できます。

f:id:akanuma-hiroaki:20180527212406p:plain

まとめ

 とりあえずチュートリアルに従うことで実機でサンプルを動作させることはできました。実際に自前のファームウェアを実装していく方法はまだよくわかってませんが、 Amazon FreeRTOS には Greengrass 等の AWS サービスと連携するためのライブラリも含まれていたり、 OTA でのファームウェアアップデートもできるようなので、そのあたりの使い方も今後調べてみたいと思います。