Amazon FreeRTOS(以下FreeRTOS)は様々なデバイスにインストールすることができエッジ側にAWSの環境を拡張する手段を提供しているが、ここでは手に入りやすいEspressif ESP32-DevKitC(以下ESP32)にFreeRTOSをインストールする手順を示す。
- Espressif ESP32-DevKitC と ESP-WROVER-KIT の開始方法 (Amazon Web Services)
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 + ]で終了
参考サイト
- AWS IoT情報 (Qiita)
元記事はこちら
「[Amazon Web Services] ESP32-DevKitCにAmazon FreeRTOSをインストールする 」