[2020年1月版] B-L475E-IOT01A - STM32L4 Discovery kit IoT nodeでAmazon FreeRTOSを動かす

[他の記事](https://qiita.com/imagou)でも大活躍？の[B-L475E-IOT01A - STM32L4 Discovery kit IoT node](https://www.st.com/ja/evaluation-tools/b-l475e-iot01a.html)において、、、
改めて**Amazon FreeRTOSデモプログラム導入、[AWS IoT](https://aws.amazon.com/jp/iot/)への接続確認**をしてみましたので、紹介いたします！

# はじめに

## 本記事の肝

まず、**「~~2019年12月~~ 2020年1月 現在の最新版での確認」**であることです！
加えて、誰でも簡単に導入できるよう、可能な限り（他の記事の参照は避け、）手順を詳細に記載しております。

## 環境

- ビルド環境: Ubuntu 18.04 LTS（じゃなくてもよいと思うが、WindowsはNG）
- IDE: [STM32CubeIDE 1.1.0](https://www.st.com/ja/development-tools/stm32cubeide.html)
- 評価用ボード: [STM32L4 Discovery kit IoT node](https://www.st.com/ja/evaluation-tools/b-l475e-iot01a.html) - 型番はB-L475E-IOT01A
- Amazon FreeRTOS: バージョン201910.00に続き、[バージョン201912.00](https://console.aws.amazon.com/freertos)でも確認済み

**なお前述の通り、ビルド環境にWindowsを用いた場合、残念ながらエラーとなります。のでLinuxを使いましょう。**
（~~詳細は割愛しますが、~~Makefile自動生成に不具合があり、不正なコマンドラインとなってしまう - [こちらに情報を載せました](#5-1-windowsビルドエラー情報)）

## 参考1

先駆者でおられる[Yutaka Kato](https://mikan.github.io/) 様の、以下の記事を参考にさせていただきました。超絶ありがとうございます！
（2017年12月の記事ですが、これ以降FreeRTOSパッケージは大きく？変更となっています）

**STM32L4 Discovery Kit IoT Node に Amazon FreeRTOS を導入する · Yutaka 🍊 Kato**
https://mikan.github.io/2017/12/13/setup-amazon-freertos-on-stm32l4-discovery-kit-iot-node/

## 参考2

STM32CubeIDEのインストール方法、デバッグ方法は、以下の記事（手前味噌）を参考になさってください。

**STM32CubeIDEで速攻FreeRTOS - Qiita**
https://qiita.com/imagou/items/8af2ad999b2a80009c6f

# 本編

## 1. AWS IoTの設定

以下、AWSアカウントは既に登録済みとして扱います。

### 1-1. モノづくり

まずは、AWS IoTに接続。
https://console.aws.amazon.com/iot

次に、左側メニューより「管理」 - 「モノ」を選択し、「モノの登録」をクリック。

![SnapCrab_AWS IoT - Google Chrome_2019-12-11_16-30-26_No-00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/447304/da626599-a7fe-d538-6731-08a7b6990a57.png)

「単一のモノを作成する」をクリック。

![SnapCrab_AWS IoT - Google Chrome_2019-12-11_16-30-38_No-00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/447304/51081111-54c2-712c-f7e2-8395e3c411e1.png)

モノに適当に名前を付けます。ここでは「MyThing」としました。
その後、下にスクロールし、、、

![SnapCrab_AWS IoT - Google Chrome_2019-12-11_16-30-53_No-00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/447304/d3a90b65-6204-92a8-aa29-33014495bcf4.png)

「次へ」をクリック。

![SnapCrab_AWS IoT - Google Chrome_2019-12-11_16-31-0_No-00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/447304/9609c8af-e802-ed4f-b44b-2bf6aa544f72.png)

「モノに証明書を追加」画面となります。
推奨とある一番上、「証明書の作成」をクリック。

![SnapCrab_AWS IoT - Google Chrome_2019-12-11_16-35-15_No-00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/447304/ffcb1d04-3078-188c-74b9-cd0830470160.png)

晴れて証明書が作成されました！笑
3つともダウンロードした後、最後に「有効化」をクリックしてください。

![SnapCrab_AWS IoT - Google Chrome_2019-12-11_16-37-4_No-00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/447304/e8dd9384-13e4-7a4d-d469-565613555fe9.png)

有効化するとボタンが「無効化」に変わります。
いったんここは「完了」をクリックしてやると、、、

![SnapCrab_AWS IoT - Google Chrome_2019-12-11_16-41-20_No-00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/447304/f2a07641-1dec-8145-a245-0b1d5315e54e.png)

モノ「MyThing」が作成されました！

![SnapCrab_AWS IoT - Google Chrome_2019-12-11_16-41-32_No-00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/447304/687f9060-7aa8-4e4e-d02a-f5e768e27f5f.png)

### 1-2. ポリシーづくり

左側メニューより「安全性」 - 「ポリシー」を選択し、「ポリシーの作成」をクリック。

![SnapCrab_AWS IoT - Google Chrome_2019-12-12_16-24-49_No-00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/447304/a60fc2d3-bf60-1cc6-8950-d373dcca2ecb.png)

名前は「MyPolicy」としました。

![SnapCrab_AWS IoT - Google Chrome_2019-12-12_16-25-2_No-00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/447304/5d7e234b-7ab1-185d-4d40-beab99574abc.png)

同じ画面で、以下4つのステートメントを追加してやります。
リソースARNは自動入力されますが、**末尾の「replaceなんちゃら」を「*（アスタリスク）」に「手動で」置き換える**のがポイントです。

| アクション     | リソース ARN                     | 効果          |
|---------------|---------------------------------|---------------|
| iot:Connect   | replaceWithAClientIdを*に置換    | 許可にチェック |
| iot:Publish   | replaceWithATopicを*に置換       | 許可にチェック |
| iot:Subscribe | replaceWithATopicFilterを*に置換 | 許可にチェック |
| iot:Receive   | replaceWithATopicを*に置換       | 許可にチェック |

**2020/1/6追記**
**アクションを「iot:\*」リソース ARNを単純に「*」としたほうが1つで済み、とっても楽です。**

入力が済んだら、「作成」をクリックしてやると、、、

![SnapCrab_AWS IoT - Google Chrome_2019-12-13_11-43-36_No-00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/447304/af5eb2e1-f066-dfc1-69ea-fd8f50f81365.png)

「MyPolicy」が作成されました。

![SnapCrab_AWS IoT - Google Chrome_2019-12-13_11-43-51_No-00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/447304/763e843c-e160-df93-56f1-0827985a3245.png)

### 1-3. ポリシーのアタッチ

左側メニューより「安全性」 - 「証明書」を選択すると、作成済みの証明書が表示されます。
その証明書の右上「・・・」より、「ポリシーのアタッチ」をクリック。

![SnapCrab_AWS IoT - Google Chrome_2019-12-13_11-48-0_No-00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/447304/e3f4a4a0-a30e-daed-518e-d45c08c7a8e4.png)

先ほど作成した「MyPolicy」にチェックを付け、「アタッチ」をクリックします。

![SnapCrab_AWS IoT - Google Chrome_2019-12-13_11-48-12_No-00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/447304/b6797018-db60-edf2-07d3-422452c678f0.png)

（画面は割愛しますが、これで証明書にポリシーがアタッチされます）

### 1-4. エンドポイントを控える

左側メニューより「設定」をクリックし、「カスタムエンドポイント」の文字列を控えておきます。

![SnapCrab_AWS IoT - Google Chrome_2019-12-16_15-42-38_No-00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/447304/0a7eb900-6aea-d5f2-3c53-11c48b211057.png)

## 2. Amazon FreeRTOSデモプログラム準備（ビルドまで）

参考元の[Yutaka Kato様の記事](https://mikan.github.io/2017/12/13/setup-amazon-freertos-on-stm32l4-discovery-kit-iot-node/)や、[Amazonドキュメント](https://docs.aws.amazon.com/ja_jp/freertos/latest/userguide/getting_started_st.html)では[System Workbench for STM32](https://www.st.com/ja/development-tools/sw4stm32.html)を使用することとなっていますが、前述の通り、最新のIDEである[STM32CubeIDE](https://www.st.com/ja/development-tools/stm32cubeide.html)を使います。

### 2-1. ダウンロードと展開

以下からデモプログラムをダウンロードします。

https://console.aws.amazon.com/freertos

このうち「Connect to AWS IoT - STM32-B-L475E-IOT01A」の「ダウンロード」から実施。

![SnapCrab_AWS IoT - Google Chrome_2019-12-16_9-52-56_No-00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/447304/7620b7e7-3ffd-199d-5b51-c48d17b79a6b.png)

その後、適当なフォルダに展開してやりましょう。

```console
user@user-VirtualBox:~/STM32CubeIDE$ ls -la
合計 16
drwxrwxr-x  4 user user 4096 12月 16 14:28 .
drwxr-xr-x 58 user user 4096 12月 16 14:27 ..
drwxrwxr-x  3 user user 4096 11月 25 09:09 .metadata
drwx------  5 user user 4096 12月 16 14:28 AmazonFreeRTOS
```

### 2-2. プロジェクト変換

STM32CubeIDEを起動します。
ワークスペースのディレクトリは展開先にしておくとよさそう。

![SnapCrab_Ubuntu [実行中] - Oracle VM VirtualBox_2019-12-16_14-30-3_No-00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/447304/2163ae7d-04f8-040e-a4c6-85f318bad2fe.png)


起動後、「File」 - 「Import」をクリック。

![SnapCrab_Ubuntu [実行中] - Oracle VM VirtualBox_2019-12-16_14-30-55_No-00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/447304/b13c65eb-9f48-9f11-07a7-6ba43e7aeac2.png)



「Import ac6 System Workbench for STM32 Project」を選び、「Next >」。

![SnapCrab_Ubuntu [実行中] - Oracle VM VirtualBox_2019-12-16_14-31-6_No-00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/447304/71ad69af-9728-3abc-97cb-2b0e8844d483.png)


「AmazonFreeRTOS/projects/st/stm32l475_discovery/ac6/aws_demos」を選び、「開く(O)」。

![SnapCrab_Ubuntu [実行中] - Oracle VM VirtualBox_2019-12-16_14-31-57_No-00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/447304/bd5d84f7-ecc6-ca4e-ce86-876f85374a8b.png)


変更元のプロジェクトが選択されています。
ここでは特に何も変えず、「Finish」でOK。

![SnapCrab_Ubuntu [実行中] - Oracle VM VirtualBox_2019-12-16_14-32-13_No-00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/447304/b5cc64cd-a946-340f-7865-feec20a751c5.png)


メッセージボックスは何も考えず「OK」。

![SnapCrab_Ubuntu [実行中] - Oracle VM VirtualBox_2019-12-16_14-32-27_No-00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/447304/4daa7072-a9ff-db14-3033-a7fec621f782.png)


MCU選択画面では「STM32L475VGTx」を選び、「OK」で、、、

![SnapCrab_Ubuntu [実行中] - Oracle VM VirtualBox_2019-12-16_14-33-32_No-00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/447304/daf88088-ae97-29ae-93e0-955a1aef3eda.png)


無事変換されたというメッセージボックスが表示され、、、

![SnapCrab_Ubuntu [実行中] - Oracle VM VirtualBox_2019-12-16_14-33-42_No-00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/447304/f510fc22-f531-f80d-07c9-2d895ebaf6fd.png)

はい、見事に取り込まれています！

![SnapCrab_Ubuntu [実行中] - Oracle VM VirtualBox_2019-12-16_14-33-55_No-00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/447304/7a389f32-1b16-ea80-947d-3ac3bc3d7c42.png)

### 2-3. ビルドしてみる

プロジェクトの上で右クリック - 「Build project」してやります。

![SnapCrab_Ubuntu [実行中] - Oracle VM VirtualBox_2019-12-16_15-24-9_No-00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/447304/e7743da0-3d9a-eedc-211d-c1d24621e2b6.png)

ワーニングは出ますが、無事ビルドが通りました。

![SnapCrab_Ubuntu [実行中] - Oracle VM VirtualBox_2019-12-16_15-24-58_No-00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/447304/d92e7d30-7b3e-21a8-fea1-4557e1d54631.png)

## 3. デモプログラム編集

当然このままでは動かないので、適宜編集してやります。

### 3-1. aws_clientcredential.hの編集

IDEにて`demos/include/aws_clientcredential.h`を開きます。

![SnapCrab_Ubuntu [実行中] - Oracle VM VirtualBox_2019-12-16_16-3-53_No-00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/447304/d8326af0-9248-40b6-6863-d5b69483768f.png)

値を下表の通りとします。

| 設定値                               |   入力値                                                                                        |
|--------------------------------------|------------------------------------------------------------------------------------------------|
| clientcredentialMQTT_BROKER_ENDPOINT | "[エンドポイント値](#1-4-エンドポイントを控える)"                                                 |
| clientcredentialIOT_THING_NAME       | "MyThing"                                                                                      |
| clientcredentialWIFI_SSID            | "Wi-Fi SSID"                                                                                   |
| clientcredentialWIFI_PASSWORD        | "Wi-Fi パスワード"                                                                              |
| clientcredentialWIFI_SECURITY        | ( eWiFiSecurityOpen &#x7C; eWiFiSecurityWEP &#x7C; eWiFiSecurityWPA &#x7C; eWiFiSecurityWPA2 ) |

パスワードが平文でいいのかよ、という気もしますが、あくまでデモなので。笑

### 3-2. aws_wifi_config.hの編集

**2020/1/6追記**
**改めて確認したところ、本ファイルは編集不要でした。**

~~続いて`config_files/aws_wifi_config.h`を開き、（似たような雰囲気ですが）値を以下の通りとします。~~

~~| 設定値                             |   入力値                                                                                        |~~
~~|------------------------------------|------------------------------------------------------------------------------------------------|~~
~~| wificonfigACCESS_POINT_SSID_PREFIX | "Wi-Fi SSID"                                                                                   |~~
~~| wificonfigACCESS_POINT_PASSKEY     | "Wi-Fi パスワード"                                                                              |~~
~~| wificonfigACCESS_POINT_SECURITY    | ( eWiFiSecurityOpen &#x7C; eWiFiSecurityWEP &#x7C; eWiFiSecurityWPA &#x7C; eWiFiSecurityWPA2 ) |~~

### 3-3. aws_clientcredential_keys.hを生成

`AmazonFreeRTOS/tools/certificate_configuration/CertificateConfigurator.html`を開きます。

その後、[保存済みの証明書ファイル](#1-1-モノづくり)を指定してから「Generate and save aws_clientcredential_keys.h」をクリック、ヘッダファイルを生成してやります。

- Certificate PEM file: xxxxxxxxxx-certificate.pem.crt
- Private Key PEM file: xxxxxxxxxx-private.pem.key

（画像ではWindowsからsambaでアクセスしていますが、何でもOK）

![SnapCrab_Amazon FreeRTOS Developer Demos Certificate Configuration Tool - Google Chrome_2019-12-16_16-25-3_No-00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/447304/c6454af7-d44a-7863-953a-10a9d61cfcea.png)

生成したファイルを、**`AmazonFreeRTOS/demos/include/aws_clientcredential_keys.h`**に上書きしましょう。
（`AmazonFreeRTOS/tests`配下にも同名のファイルがありますので注意！）

### 3-4. 再度ビルドしてみる

念のためビルドが通るか再確認してください。

## 4. ついにデモ！

### 4-1. AWSテスト設定

AWS IoT画面の左側メニュー、「テスト」をクリック。

次の画面で、「トピックのサブスクリプション」に「iotdemo/topic/#」と入力し、「トピックへのサブスクライブ」をクリック。

![SnapCrab_AWS IoT - Google Chrome_2019-12-17_9-5-10_No-00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/447304/b5053c54-4752-2acd-a3e4-4f38ad7cd9b0.png)

待ち画面に入ります。ワクワクしますね。笑

![SnapCrab_AWS IoT - Google Chrome_2019-12-17_9-5-26_No-00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/447304/3610380c-9fef-155a-e901-bf7eaef535d0.png)

### 4-2. デモプログラムを動かす

STM32CubeIDEでもってデモプログラムを動かします。

動作確認にはシリアル通信ソフトが必要です。私はgtktermを使いました。設定値は以下参照。

![SnapCrab_Ubuntu [実行中] - Oracle VM VirtualBox_2019-12-17_9-10-36_No-00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/447304/264c37a6-6f18-a0a4-9ea1-37fd819b397a.png)

動かしてみて、以下のようなログが出れば成功です。

![SnapCrab_Ubuntu [実行中] - Oracle VM VirtualBox_2019-12-17_9-12-52_No-00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/447304/9aad4a2c-0559-ac69-8bd8-b9f68f7bff5a.png)

対してAWS側の画面には、Hello Worldがたくさん届いているかと思います！万歳！

![SnapCrab_AWS IoT - Google Chrome_2019-12-17_9-14-3_No-00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/447304/1af2c1f0-971c-6f4f-21a9-bfe02859b6be.png)

## 5. トラブルシュートなど

### 5-1. Windowsビルドエラー情報

`unterminated quoted string`なMakefileを自動生成してしまっています。

```console
[^1]: 
20:50:30 **** Incremental Build of configuration Debug for project aws_demos ****
make all 
arm-none-eabi-gcc "C:/Users/imagou/Documents/STM32CubeIDE/AmazonFreeRTOS/vendors/st/stm32l475_discovery/BSP/B-L475E-IOT01/stm32l475e_iot01.c" -mcpu=cortex-m4 -std=gnu11 -g3 -DUSE_HAL_DRIVER -DSTM32L475xx '-DMQTTCLIENT_PLATFORM_HEADER=MQTTCMSIS.h' -DENABLE_IOT_INFO -DENABLE_IOT_ERROR -DSENSOR -DRFU -DUSE_OFFLOAD_SSL -c -O0 -ffunction-sections -Wall -fstack-usage -MMD -MP -MF"vendors/st/stm32l475_discovery/BSP/B-L475E-MT"vendors/st/stm32l475_discovery/BSP/B-L475E-IOT01/stm32l475e_iot01.o"  -mfpu=fpv4-sp-d16 -mfloat-abi=hard -mthumb -o "vendors/st/stm32l475_discovery/BSP/B-L475E-IOT01/stm32l475e_iot01.o" @"vendors/st/stm32l475_discovery/BSP/B-L475E-IOT01/stm32l475e_iot01.c_includes.args"
c:/st/stm32cubeide_1.1.0/stm32cubeide/plugins/com.st.stm32cube.ide.mcu.externaltools.make.win32_1.1.0.201910081157/tools/bin/sh: syntax error: unterminated quoted string
make[1]: *** [vendors/st/stm32l475_discovery/BSP/B-L475E-IOT01/subdir.mk:39: vendors/st/stm32l475_discovery/BSP/B-L475E-IOT01/stm32l475e_iot01.o] Error 2
make: *** [makefile:69: all] Error 2
"make all" terminated with exit code 2. Build might be incomplete.

20:50:58 Build Failed. 2 errors, 0 warnings. (took 28s.531ms)
```

# おわりに

導入にあたりなかなか（いや、かなり）苦労したので、記事にしてみました。
少しでも皆様のお役に立てれば幸いです。

疑問・質問等あれば、遠慮なくコメントください！