Amazon FreeRTOSをESP32開発ボードESP32-DevKit-Cにセットアップして、マイコンからMQTTのメッセージを送信し、AWS IoTのコンソール上で確認するHello Worldサンプルを動かしてみたので手順をまとめてみました。
FreeRTOSのセットアップ手順は公式ドキュメントの「Espressif ESP32-DevKitC と ESP-WROVER-KIT の開始方法」を参考にしています。
このドキュメントではESP-IDF v3とESP-IDF v4を利用したセットアップ方法が記載されていますが、今回は「ESP-IDF v4」の手順を選択しました。
クイック接続を利用してAWS IoTをセットアップ
クイック接続ワークフローを利用して、AWS IoTのセットアップをしていきます。
マネジメントコンソールにログインして、「FreeRTOS」で検索して、「FreeRTOS」をクリックして開きます。
[FreeRTOS デバイスソフトウェア]のページで、[ESP32-DevKitC]の[クイック接続]をクリックします。
手順の説明が表示されるので[開始方法]をクリックして次のページに進みます。
[Connect to AWS Greengrass – ESP32-DevKitC]のページでは、各入力はデフォルトのまま[作成してダウンロードします]をクリックします。
ここで、FreeRTOSのソースコードがダウンロードされますが、ソースはダウンロードされたものは使用せずGithubからクローンしたものを使用します。
[デバイスの登録]では、[名前]に適当な値を入力して[次へ]をクリックします。
[認証情報のダウンロード]では、[ダウンロードして続行]をクリックします。
認証情報を含む「Credentials.zip」というファイルがダウンロードされます。こちらに含まれるソースは、後で利用します。
[FreeRTOS をデバイス上で設定]が表示されます。表示されているインストラクションに従ってESP32-DevKIT-Cをセットアップしていきます。
[テスト]は、以下のデバイスのセットアップが完了した後、クリックします。
ソースコードの入手
Amazon FreeRTOSはGithubに公開されているので、Githubからクローンしてくるのが最も簡単な入手方法です。
Githubリポジトリ: https://github.com/aws/amazon-freertos
このリポジトリではESP-IDFをはじめ様々な外部モジュールを参照しています。サブモジュールも同時に落としてくるように--recurse-submodules
オプションを付けてクローンします。
$ git clone https://github.com/aws/amazon-freertos.git --recurse-submodules
USBシリアルドライバのインストール
「CP210x USB to UART Bridge VCP Drivers」をインストールします。
Silicon Labsのページを開き[Downloads]タブを開いて「CP210x VCP Mac OSX Driver v6.0」をダウンロードします。
ダウンロードしたら「macOS_VCP_Driver/SiLabsUSBDriverDisk.dmg」を開いて「Install CP210x VCP Driver」をクリックするとインストーラが起動します。
インストーラが起動したらウィザードに沿ってインストールできます。
インストールできたらESP32-DevKit-CをUSB接続してシリアルポートとして認識されているか確認します。
以下のコマンドで「/dev/cu.SLAB_USBtoUART」が表示されればOKです。
$ ls /dev/cu.*
/dev/cu.Bluetooth-Incoming-Port /dev/cu.SOC
/dev/cu.MALS /dev/cu.usbserial-0001
/dev/cu.SLAB_USBtoUART
ツールチェーンのインストール
ツールチェーンに必要なソフトウェアのインストール
Standard Setup of Toolchain for Mac OSに従って、ツールチェーンの前提条件をセットアップします。
Pytohn v3
Installing Python 3には、「将来Mac OSでv2はサポートされなくなるのでv3にしといたほうが良いよ」と書いてあります。また、新しいpipはPython 3をサポートしていないので、Pythonはv3に上げておくのが無難です。
pyenvをhomebrewでインストールし、pyenvで3.9.4をインストールします。
$ brew install pyenv
パスを.bash_profileに指定して反映します。
$ echo 'export PYENV_ROOT="$HOME/.pyenv"' >> ~/.bash_profile
$ echo 'export PATH="$PYENV_ROOT/bin:$PATH"' >> ~/.bash_profile
$ echo 'eval "$(pyenv init -)"' >> ~/.bash_profile
$ source ~/.bash_profile
2021.4.10時点での安定版の最新3.9.4をインストールします。
$ pyenv install 3.9.4
バージョンを確認します。
$ python --version
Python 3.9.4
参考: MacのPythonを2系から3系にアップデートする
pip
パイソンのパッケージマネージャpipをインストールします。
sudo easy_install pip
CMakeとNinja build
cmakeとNinja buildをhomebrewでインストールします。
$ brew install cmake ninja dfu-util
ツールチェーンのインストール
FreeRTOSのソースに含まれるESP-IDFのインストールスクリプトを実行するとツールチェーンを含む必要なライブラリをインストールしてくれます。
$ vendors/espressif/esp-idf/install.sh
...
All done! You can now run:
. vendors/espressif/esp-idf/export.sh
export.sh
を実行してパスを通します。
$ . vendors/espressif/esp-idf/export.sh
...
Done! You can now compile ESP-IDF projects.
Go to the project directory and run:
idf.py build
認証情報をプロジェクトFreeRTOSプロジェクトにコピー
クイック接続の[認証情報のダウンロード]ステップでダウンロードした「Credentials.zip」を解凍して、「aws_clientcredential.h」と「aws_clientcredential_keys.h」の2つのを「amazon-freertos/demos/include」にコピーして既存ファイルを置き換えます。
「aws_clientcredential.h」を開き、ネットワーク設定を入力して保存します。
/*
* @brief Wi-Fi network to join.
*
* @todo If you are using Wi-Fi, set this to your network name.
*/
#define clientcredentialWIFI_SSID ""
/*
* @brief Password needed to join Wi-Fi network.
*
* @todo If you are using WPA, set this to your network password.
*/
#define clientcredentialWIFI_PASSWORD ""
/*
* @brief Wi-Fi network security type.
*
* @see WIFISecurity_t.
*
* @note Possible values are eWiFiSecurityOpen, eWiFiSecurityWEP, eWiFiSecurityWPA,
* eWiFiSecurityWPA2 (depending on the support of your device Wi-Fi radio).
*/
#define clientcredentialWIFI_SECURITY eWiFiSecurityWPA2
また、demos/coreMQTT/mqtt_demo_mutual_auth.cを開き、mqttexampleTOPICの値を「/example/topic」から「/iotdemo/topic/1」に変更して保存します。
/**
* @brief The topic to subscribe and publish to in the example.
*
* The topic name starts with the client identifier to ensure that each demo
* interacts with a unique topic name.
*/
#define mqttexampleTOPIC democonfigCLIENT_IDENTIFIER "/iotdemo/topic/1"
ビルドしてデバイスにフラッシュ
「CMake FreeRTOS で をビルドしてフラッシュする」の手順でソースをビルドして、デバイスにフラッシュします。
buildディレクトリを作成して、cmakeコマンドを実行してビルドファイルを生成します。
$ mkdir build
$ cmake -DVENDOR=espressif -DBOARD=esp32_wrover_kit -DCOMPILER=xtensa-esp32 -S . -B ./build -DAFR_ENABLE_ALL_MODULES=1 -DAFR_ENABLE_TESTS=0
...
=========================================================================
-- Configuring done
-- Generating done
-- Build files have been written to: /Users/hrendoh/workspace/amazon-freertos/build
Ninjaを使う場合
$ cmake -DVENDOR=espressif -DBOARD=esp32_wrover_kit -DCOMPILER=xtensa-esp32 -S . -B ./build -DAFR_ENABLE_ALL_MODULES=1 -DAFR_ENABLE_TESTS=0 -GNinja
make erase_flash
で開発ボードのフラッシュメモリを消去してから、
make flash
でビルドし、ESP32-DevKIT-Cにフラッシュします。
シリアルポートは自動で検出してくれますが、環境変数ESPPORTでデバイスのシリアルポートを指定することもできます。
$ export ESPPORT=/dev/cu.SLAB_USBtoUART
$ make -C ./build erase_flash
$ make -C ./build flash
...
Writing at 0x000c8000... (97 %)
Writing at 0x000cc000... (100 %)
Wrote 1134176 bytes (710755 compressed) at 0x00020000 in 62.6 seconds (effective 144.9 kbit/s)...
Hash of data verified.
Leaving...
Hard resetting via RTS pin...
[100%] Built target flash
テストクライアントでMQTTメッセージの受信を確認する
AWSマネジメントコンソールに戻り、クリック接続の[FreeRTOS をデバイス上で設定]のページの[テスト]をクリックします。
しかし、このテスト画面では受信できませんでした。。
この画面は[完了]して閉じ、気を取り直して、IoTの左のメニュから[テスト] > [テストクライアント]を開きます。
モニターを開始します。
$ vendors/espressif/esp-idf/tools/idf.py -p /dev/cu.SLAB_USBtoUART -B build monitor
モニターは 「Ctrl + ]」で閉じることができます。
少し待つと受信したメッセージが表示されます。