Amazon Web Services 資料一覧

ESP32-DevKitCにAmazon FreeRTOSをインストールする

2019/10/22更新

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

動作環境

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 + ]で終了

参考サイト