Amazon FreeRTOSがESP32に対応したのでさっそく試してみた
はじめに
昨年末の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ボタンのようなデバイスは簡単に作れそうです。
こちらからは以上です。