ちょっと話題の記事

Amazon FreeRTOSがESP32に対応したのでさっそく試してみた

Amazon FreeRTOSでESP32の対応が追加されました。実際にESP32ボードで動作させて、IoT Device Managementで確認してみました。
2018.05.18

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

はじめに

昨年末のre:Invent 2017で発表されたAmazon FreeRTOSですが、先日のアップデートで、新しくESP32のサポートが追加されました。

ESP32とは、WiFi/Bluetoothがオンチップになったマイコンチップです。ESP32は、国内でも工事認証済みのデバイスが入手しやすいメリットがあります。個人的には、開発環境がMac/Linuxで用意しやすいこともポイントの一つです。

さっそく、Amazon FreeRTOSをESP32で試してみましたのでレポートします。

手順

開発プロセスの概要はこちらで紹介されていますが、

https://aws.amazon.com/jp/freertos/getting-started/

ESP32向けについての詳細はこちらのガイドがありますので、この手順で進めます。

https://docs.aws.amazon.com/freertos/latest/userguide/getting_started_espressif.html

ざっくり下記のような手順となります。

  • ハードウェアの準備
  • aws cliの準備
  • FreeRTOSをダウンロード
  • ツールチェインを用意
  • デバイス情報とWiFiをスクリプトで設定
  • ファームウェアをビルド、デバイスへ書き込み
  • シリアル経由でデバイスの動作を確認
  • マネージメントコンソールのIoT Device Management画面で確認

ハードウェア

ガイドには下記がサポートハードウェアとして紹介されています。

  • ESP32-DevKitC
  • ESP-WROVER-KIT

ESP32-DevKitCの他、各種のESP32デバイスが、秋月電子やスイッチサイエンスさん等から入手可能です。

今回は手元にあった、ESP-WROOM-32ボード(自作)を使用します。機能的にはESP32-DevKitCとほぼ同じです。

AWSアカウントの準備

Amazon FreeRTOSのサンプルを試すには、AWSアカウントが必要になります。そしてAWS CLIが使えるようにしておく必要があります。aws configureコマンド等で、クレデンシャルを設定しておいてください。またboto3が必要になりますので、こちらもインストールしておきます。

$ pip install awscli
$ aws configure
AWS Access Key ID [****************XXXX]:
AWS Secret Access Key [****************xxxx]:
Default region name [ap-northeast-1]:
Default output format :
$ pip install boto3

Amazon FreeRTOSのダウンロード

FreeRTOSはgithubから提供されていますので、手元にcloneします。

$ git clone https://github.com/aws/amazon-freertos
$ cd amazon-freertos

ツールチェインの準備

こちらに詳細が解説されています。

http://esp-idf.readthedocs.io/en/latest/get-started/macos-setup.html

シリアルで接続しますので、pyserialをpipで入れておきます。python環境によってはsudoが必要な場合があります。

$ pip install pyserial

Espressif社のサイトから、ツールチェインをダウンロードして、~/esp以下に展開しておきます。

mkdir -p ~/esp
cd ~/esp
curl -O https://dl.espressif.com/dl/xtensa-esp32-elf-osx-1.22.0-80-g6c4433a-5.2.0.tar.gz
tar -xzf xtensa-esp32-elf-osx-1.22.0-80-g6c4433a-5.2.0.tar.gz

パスを通しておきます。

$ export PATH=$PATH:$HOME/esp/xtensa-esp32-elf/bin

プロジェクト設定

用意されているスクリプトを使って、主にWiFiに関する設定を行いますが、同時にAWSに関する設定も行われます。

さきほどgithubから持ってきたファイルのうち、amazon-freertos/demos/common/tools/aws_config_quick_start/configure.json をエディタで開きます。

thing_nameに「モノの名前」としてmyfreertosthingを設定しました。SSIDやパスワード、WiFiセキュリティ(eWiFiSecurityOpen/eWiFiSecurityWEP/eWiFiSecurityWPA/eWiFiSecurityWPA2)を適宜設定します。

{
    "thing_name":"myfreertosthing",
    "wifi_ssid":"YourSSID",
    "wifi_password":"XXXXXXXX",
    "wifi_security":"eWiFiSecurityWPA"
}

config.jsonができたら、設定スクリプトを実行します。

$ cd amazon-freertos/demos/common/tools/aws_config_quick_start
$ python SetupAWS.py setup

設定したthing_nameでthingが作成され、証明書やポリシーなど必要なリソースが用意されます。いくつかサブコマンドがあり、確認することができます。

$ python SetupAWS.py list_certificates
$ python SetupAWS.py list_policies
$ python SetupAWS.py list_things

ビルドと書き込み

シリアル接続時のデバイス名が必要になりますので、調べておきます。USBケーブルを、コネクタに接続するとデバイスを認識し、/dev/cu.xxxx というデバイスノードが現れます。これをメモっておきましょう。

$ ls /dev/cu.*
/dev/cu.usbserial-XXXXXXXX

プロジェクトのディレクトに移動してmake menuconfigコマンドを実行します。

$ cd amazon-freertos/demos/espressif/esp32_devkitc_esp_wrover_kit/make
$ make menuconfig

そうすると設定画面が現れます。

ここで必須の設定項目は、シリアルのデバイス名です。Serial flasher config ---> Default serial portを選び、調べておいたシリアルデバイス名(/dev/cu.usbserial-XXXXXXXX)を入力します。

その他はデフォルトでOKです。Exitを選び、設定を保存します。

以上で準備は完了ですので、makeでビルドします。うまくいくことを祈りましょう。

$ make

メッセージをチェックして、エラーがないことを確認しましょう。

ビルドがうまくいったら、USBで接続されている状態で、書き込みを行います。

$ make flash

動作確認

シリアルに流れてくるログを確認します。ここではscreenコマンドを使いました。シリアルデバイス名と速度115200を指定します。(ガイドにはmake monitorでシリアル出力を確認できると書かれていたのですが、動作しませんでした)

$ screen /dev/cu.usbserial-XXXXXXXX 115200

何か表示されるかもしれません。最初のブートシーケンスから動作を確認するために、一度リセットボタンを押します。

こんなブートシーケンスが取得できました。

ets Jun  8 2016 00:22:57

rst:0x1 (POWERON_RESET),boot:0x13 (SPI_FAST_FLASH_BOOT)
flash read err, 1000
Falling back to built-in command interpreter.
OK
>ets Jun  8 2016 00:22:57

...snip...

0 5 [Tmr Svc] WiFi module initialized. Connecting to AP YourSSID...

...snip...

I (1763) WIFI: SYSTEM_EVENT_STA_CONNECTED1 309 [IP-task] vDHCPProcess: offer c0a80313ip
I (3233) event: sta ip: 192.168.3.19, mask: 255.255.255.0, gw: 192.168.3.1
I (3233) WIFI: SYSTEM_EVENT_STA_GOT_IP

まずは、設定したSSIDや、DHCPでIPアドレスが取得できていることを確認しましょう。

ネットワーク接続ができているようであれば、それに続いてMQTTのコードが動いているのが確認できると思います。

5 321 [MQTTEcho] MQTT echo attempting to connect to xxxxxxxxxxxx.iot.ap-northeast-1.amazonaws.com.
6 321 [MQTTEcho] Sending command to MQTT task.
7 322 [MQTT] Received message 10000 from queue.
8 329 [IP-task] Socket sending wakeup to MQTT task.

...snip...

27 841 [MQTTEcho] Command sent to MQTT task passed.
28 841 [MQTTEcho] MQTT Echo demo subscribed to freertos/demos/echo
29 841 [MQTTEcho] Sending command to MQTT task.
30 842 [MQTT] Received message 30000 from queue.
31 848 [IP-task] Socket sending wakeup to MQTT task.
32 848 [MQTT] Received message 0 from queue.
33 848 [MQTT] MQTT Publish was successful.
34 848 [MQTT] Notifying task.
35 849 [MQTTEcho] Command sent to MQTT task passed.
36 849 [MQTTEcho] Echo successfully published 'Hello World 0'
37 851 [IP-task] Socket sending wakeup to MQTT task.
38 851 [MQTT] Received message 0 from queue.
39 851 [Echoing] Sending command to MQTT task.
40 852 [MQTT] Received message 40000 from queue.
41 856 [IP-task] Socket sending wakeup to MQTT task.
42 856 [MQTT] Received message 0 from queue.
43 859 [IP-task] Socket sending wakeup to MQTT task.
44 859 [MQTT] Received message 0 from queue.
45 859 [MQTT] MQTT Publish was successful.
46 859 [MQTT] Notifying task.
47 859 [Echoing] Command sent to MQTT task passed.
48 861 [Echoing] Message returned with ACK: 'Hello World 0 ACK'

freetos/demos/echoというチャネルにHello World というメッセージが送られていることがわかります。うまく動いているようです。

マネージメントコンソールで動作確認する

デバイスはうまく動いているようですが、相手にちゃんと届いているのでしょうか。それはAWSマネージメントコンソールで確認することができます。

マネージメントコンソールを開いて、サービスからIoT Device Managementを選択します。(テキストボックスに一部を入力すると、候補から選ぶことができます)。

IoT Device Managementの画面が開いたら、まずは管理>モノを選んで、デバイスが登録されているかを確認してみましょう。さきほど設定した、myfreertosthingが表示されていることが確認できます。

モニタリングをクリックすると、接続数やメッセージ授受の状況が確認できます。

テストをクリックすると、メッセージを確認することができます。トピック名を入力してサブスクリプションを追加します。

そして、左に追加されたトピック名をクリックすると、メッセージが受信できていることがわかります。うまく動いているようです。

MQTT Echoという簡単なデモアプリケーションですが、動作を確認することができました。

ちなみに

マネージメントコンソールには、マイクロコントローラの種類や環境を設定してAmazon FreeRTOSのプロジェクトをダウンロードする機能がありますが、ESP32は選択肢に見当たりませんでした。対応はこれからのようです。

ついでに先日紹介したM5Stackで動作させられるか試してみたのですが、残念ながらブートの途中で止まってしまい動作しませんでした。ESP32というMCUは同じなのですが、ESP-WROOM-32とは違いがあるので、原因はそのあたりにあるかもしれません。惜しい感じです。

まとめ

Amazon FreeRTOSにESP32対応が追加されたので、試してみました。MQTTのサンプルが無事動くことを確認できました。

ESP32のデバイスは、日本国内で使うことができる開発ボードの種類も多く、豊富に出回っていますので、IoT開発の敷居が下がりそうです。開発ツールもLinux/macOS/Windowsと幅広い環境がサポートされているのも嬉しいところです。

今回はサンプルそのままの動作確認でしたが、ボタンを追加して、そのボタンをクリックするとMQTTメッセージを送信するような、なんちゃって1-Clickボタンのようなデバイスは簡単に作れそうです。

こちらからは以上です。

参考