Amazon FreeRTOS(以下FreeRTOS)は様々なデバイスにインストールすることができエッジ側にAWSの環境を拡張する手段を提供しているが、ここでは手に入りやすいEspressif ESP32-DevKitC(以下ESP32)にFreeRTOSをインストールする手順を示す。

waves ESP32 DevKitC V4 ESP-WROOM-32 ESP-32 WiFi BLE 技適取得済 国内発送AMAZON JP

動作環境

FreeRTOSを使うにあたりあらかじめ以下をインストールしておく。

⦿ Pytyoh 2.7.10以降 (3.xでよいが、2.xを使う場面あり)
⦿ pip
⦿ AWS SDK for Python (boto3)
⦿ AWS CLI

$ python --version
Python 3.6.8

$ python2 --version
Python 2.7.15+

$ pip --version
pip 19.3.1 from /usr/local/lib/python3.6/dist-packages/pip (python 3.6)

$ pip list | grep boto3
boto3               1.9.253  

$ aws --version
aws-cli/1.16.263 Python/3.6.8 Linux/4.15.0-65-generic botocore/1.12.253

ツールチェーンインストール

まずEspressif公式サイトからUbuntu用のツールチェーンをダウンロードしてインストールする。

⦿ 以下をダウンロード & インストール

xtensa-esp32-elf-linux64-1.22.0-80-g6c4433a-5.2.0.tar.gz

$ mkdir ~/esp
$ cd ~/esp
$ tar zxvf ~/Downloads/xtensa-esp32-elf-linux64-1.22.0-80-g6c4433a-5.2.0.tar.gz

⦿ 環境変数設定

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

⦿ バージョン確認

$ xtensa-esp32-elf-gcc --version
xtensa-esp32-elf-gcc (crosstool-NG crosstool-ng-1.22.0-80-g6c4433a) 5.2.0
Copyright (C) 2015 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

CMakeインストール

次にFreeRTOSビルド用のCMakeをインストールする。

Amazon FreeRTOSではCMake 3.13以降がサポートされるが、Ubuntuのパッケージリポジトリには3.10しか用意されていないためCMake公式サイトからダウンロードしてインストールする。

⦿ 以下をダウンロード & インストール

cmake-3.15.4-Linux-x86_64.tar.gz

$ mkdir ~/tmp
$ cd ~/tmp
$ tar zxvf ~/Downloads/cmake-3.15.4-Linux-x86_64.tar.gz
$ sudo cp -r cmake-3.15.4-Linux-x86_64/{bin,doc,share} /usr/local

manファイルについては格納場所/usr/local/manが/usr/local/share/manへのシンボリックリンクのためmanファイルのみ以下のようにしてコピーする。

$ sudo cp -r cmake-3.15.4-Linux-x86_64/man /usr/local/share

⦿ バージョン確認

$ cmake --version
cmake version 3.15.4

Amazon FreeRTOSダウンロード & 設定

ビルドの準備が整ったらAmazon FreeRTOS公式GitHubからソース一式をダウンロードする。

$ cd ~/tmp
$ git clone https://github.com/aws/amazon-freertos.git --recurse-submodules

次にセットアップスクリプト用の設定ファイルを編集する。

$ cd amazon-freertos/tools/aws_config_quick_start
$ vi configure.json
{
    "afr_source_dir":"../..", <----------- 上記ダウンロードディレクトリ(amazon-freertosディレクトリのフルパス)
    "thing_name":"$thing_name", <--------- ESP32に付けるThing Name
    "wifi_ssid":"$wifi_ssid", <----------- Wi-FiネットワークのSSID
    "wifi_password":"$wifi_password", <--- Wi-Fiネットワークの接続パスワード
    "wifi_security":"$wifi_security" <---- Wi-Fiネットワークのセキュリティタイプ
}

設定ファイルが編集できたらセットアップスクリプトを実行する。

$ python SetupAWS.py setup

これによりAWS IoT上のリソースが自動的に作られ、リソース間の関連付けも行われる。

⦿ モノ(Thing)作成

⦿ 証明書作成

⦿ ポリシー作成

⦿ 証明書にポリシーをアタッチ

⦿ モノに証明書をアタッチ

⦿ 証明書関連のファイル作成

$ ls -l ESP32_01_*
-r--r--r-- 1 xxx xxx   64 10月 22 08:46 ESP32_01_cert_id_file <----------- 証明書ID
-r--r--r-- 1 xxx xxx 1220 10月 22 08:46 ESP32_01_cert_pem_file <---------- 公開鍵
-r--r--r-- 1 xxx xxx 1675 10月 22 08:46 ESP32_01_private_key_pem_file <--- 秘密鍵

⦿ MQTTエンドポイント、Wi-Fiネットワーク情報をデモ用aws_clientcredential.hファイルに追加

$ cat -n ../../demos/include/aws_clientcredential.h
:
    35  /*
    36   * MQTT Broker endpoint.
    37   */
    38  #define clientcredentialMQTT_BROKER_ENDPOINT "xxxxxxxxxxxxxx-ats.iot.ap-northeast-1.amazonaws.com"
    39  
    40  
    41  /* Use of a "define" and not a "static const" here to be able to
    42  * use pre-compile concatenation on the string. */
    43  #define clientcredentialIOT_THING_NAME "ESP32_01"
:
    56  /*
    57   * Wi-Fi network to join.
    58   */
    59  #define clientcredentialWIFI_SSID       "xxxxxxxxxxxxxxxx"
    60  
    61  /*
    62   * Password needed to join Wi-Fi network.
    63   */
    64  #define clientcredentialWIFI_PASSWORD   "xxxxxxxxxxxxx"
    65  
    66  /**
    67   * @brief Security type
    68   * WPA2 Security, @see WIFISecurity_t
    69   * Possible values are - eWiFiSecurityOpen, eWiFiSecurityWEP, eWiFiSecurityWPA,
    70   * eWiFiSecurityWPA2
    71   */
    72  #define clientcredentialWIFI_SECURITY   xxxxxxxxxxxxxxxxx
    73  
    74  #endif

⦿ 証明書とプライベートキーをBase64エンコードしてデモ用

aws_clientcredential_keys.hファイルに追加

$ cat -n ../../demos/include/aws_clientcredential_keys.h
:
    29  /*
    30   * PEM-encoded client certificate
    31   *
    32   * Must include the PEM header and footer:
    33   * "-----BEGIN CERTIFICATE-----\n"\
    34   * "...base64 data...\n"\
    35   * "-----END CERTIFICATE-----\n"
    36   */
    37  #define keyCLIENT_CERTIFICATE_PEM \
    38  "-----BEGIN CERTIFICATE-----\n"\
:
    57  "-----END CERTIFICATE-----\n"
    77  /*
    78   * PEM-encoded client private key.
    79   *
    80   * Must include the PEM header and footer:
    81   * "-----BEGIN RSA PRIVATE KEY-----\n"\
    82   * "...base64 data...\n"\
    83   * "-----END RSA PRIVATE KEY-----\n"
    84   */
    85  #define keyCLIENT_PRIVATE_KEY_PEM \
    86  "-----BEGIN RSA PRIVATE KEY-----\n"\
:
   112  "-----END RSA PRIVATE KEY-----\n"
:

FreeRTOSデモプロジェクトビルド & ESP32書き込み & 実行

設定が終わったのでCMakeでFreeRTOSをビルドし、ESP32に書き込んで実行する。

⦿ ビルド

$ cd ../..
$ cmake -DVENDOR=espressif -DBOARD=esp32_devkitc -DCOMPILER=xtensa-esp32 -S . -B build
$ cd build
$ make all -j4
:
[100%] Built target app

⦿ ESP32書き込み

ここでESP32をホストPCに接続し、まず以下を実行してESP32の中身を消去する。

$ cd ..
$ ./vendors/espressif/esp-idf/tools/idf.py erase_flash -B build
ESP-IDF currently only supports Python 2.7, and this is Python 3.6.8. Search for 'Setting the Python Interpreter' in the ESP-IDF docs for some tips to handle this.

ただ当該環境ではPython3がデフォルトなので上記のエラーになる。

idf.pyを書き換えてPython2を明示的に指定して再度実行する。

$ vi ./vendors/espressif/esp-idf/tools/idf.py
(変更前)
#!/usr/bin/env python

(変更後)
#!/usr/bin/env python2

$ ./vendors/espressif/esp-idf/tools/idf.py erase_flash -B build
Setting IDF_PATH environment variable: ...
:
Chip erase completed successfully in 3.8s
Hard resetting via RTS pin...
Done

続いてFreeRTOSをESP32に書き込む。

$ cd build
$ make flash
[  0%] Built target blank_ota_data
[  1%] Built target partition_table
[  1%] Built target idf_component_ulp
:
Wrote 953520 bytes (585067 compressed) at 0x00020000 in 14.5 seconds (effective 526.8 kbit/s)...
Hash of data verified.

Leaving...
Hard resetting via RTS pin...
[100%] Built target flash

⦿ AWS上のMQTTメッセージのモニタリング

AWS IoTコンソールでMQTTクライアントを使ってESP32がAWSに送信するメッセージをサブスクライブしておく。

[テスト]をクリックするとMQTTクライアントが開くので[トピックのサブスクリプション]フィールドに「iotdemo/#」と入力して[トピックへのサブスクラ…]をクリックする。

いまサブスクライブしたトピックの[iotdemo/#]をクリックしてメッセージを待ち受ける。

⦿ デモプログラム実行

この状態でデモプログラムを実行するとMQTTでパブリッシュが行われ、AWS IoTコンソール上でもメッセージが受信できていることが確認できる。

$ cd ..
$ ./vendors/espressif/esp-idf/tools/idf.py monitor -p /dev/ttyUSB0 -B build
:
157 914 [iot_thread] [INFO ][DEMO][9140] Demo completed successfully.
158 918 [iot_thread] [INFO ][INIT][9180] SDK cleanup done.
159 918 [iot_thread] [INFO ][DEMO][9180] -------DEMO FINISHED-------
-> Ctrl + ]で終了

参考サイト

元記事はこちら

[Amazon Web Services] ESP32-DevKitCにAmazon FreeRTOSをインストールする