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


他の記事でも大活躍?のB-L475E-IOT01A - STM32L4 Discovery kit IoT nodeにおいて、、、
改めてAmazon FreeRTOSデモプログラム導入、AWS IoTへの接続確認をしてみましたので、紹介いたします!

はじめに

本記事の肝

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

環境

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

参考1

先駆者でおられるYutaka Kato 様の、以下の記事を参考にさせていただきました。超絶ありがとうございます!
(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

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

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

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

「次へ」をクリック。

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

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

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

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

1-2. ポリシーづくり

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

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

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

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

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

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

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

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

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

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

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

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

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

2. Amazon FreeRTOSデモプログラム準備(ビルドまで)

参考元のYutaka Kato様の記事や、AmazonドキュメントではSystem Workbench for STM32を使用することとなっていますが、前述の通り、最新のIDEであるSTM32CubeIDEを使います。

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

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

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

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

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を起動します。
ワークスペースのディレクトリは展開先にしておくとよさそう。

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

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

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

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

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

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

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

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

2-3. ビルドしてみる

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

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

3. デモプログラム編集

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

3-1. aws_clientcredential.hの編集

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

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

設定値 入力値
clientcredentialMQTT_BROKER_ENDPOINT "エンドポイント値"
clientcredentialIOT_THING_NAME "MyThing"
clientcredentialWIFI_SSID "Wi-Fi SSID"
clientcredentialWIFI_PASSWORD "Wi-Fi パスワード"
clientcredentialWIFI_SECURITY ( eWiFiSecurityOpen | eWiFiSecurityWEP | eWiFiSecurityWPA | 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 | eWiFiSecurityWEP | eWiFiSecurityWPA | eWiFiSecurityWPA2 ) |

3-3. aws_clientcredential_keys.hを生成

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

その後、保存済みの証明書ファイルを指定してから「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)

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

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

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

4. ついにデモ!

4-1. AWSテスト設定

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

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

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

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

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

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

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

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

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

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

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

[^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)

おわりに

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

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