Amazon FreeRTOS を STM32L4 Discovery Kit IoT Node で評価してみる

投稿者: | 2018年5月24日

Evaluating Amazon FreeRTOS on STMicroelectronics STM32L4 Discovery Kit IoT Node.

今日は、流行り(?)の Amazon FreeRTOS(+ IoT)を、STMicro の STM32L4 Discovery Kit IoT Node(名前が長い!)で評価してみようと思います。

本評価ボードは、MPU として STM32L475VGT6 を搭載しています。コアは ARM Cortex-M4 で、クロックは最大 80MHz です(ただし、本体 MPU のためのクリスタルを標準では搭載していないため、正確な 80MHz にはならないようです。)。MPU のデータシートはこちらからダウンロードできます。

Amazon AWS IoT のセットアップ

実は、ここがいちばん取っ付きにくい部分かも知れません。ここに日本語の解説があるのですが、残念ながら AWS IoT ボタンは、まだ日本で購入できないのです。そこで、いきなり Amazon FreeRTOS のチュートリアル(ユーザーガイド)を見ながら設定をしていくことにします。こちらはまだ、日本語の資料はないのですが頑張りましょう。

読んでいくと、AWS Account and Permissions という項でいきなり IAM (Identity and Access Management) の説明が出てきます。IAM とは、AWS のアカウントを登録した人「以外」のユーザーを登録し、また、そのユーザーに様々なアクセス権を設定して管理することのできる機能なのですが、AWS に登録した本人であれば IAM の設定なしで、そのまま AWS コンソールから AWS IoT の設定を続けられますので、今回は IAM を無視することにします。つまり、ここの説明にある root 権限で使用します。今後、AWS に慣れてきたら IAM ユーザー設定をすると良いかと思います。

そこで、Registering Your MCU Board with AWS IoT の項に移ります。ここで必要になるのは、AWS リージョンを決めることと、自分の AWS account number を知ることです。説明を読むと、さらっと AWS  CLI(AWS を PC 等のコマンドラインで制御するツール)の説明がありますが、実は、AWS CLI がなくても AWS リージョンは決められます。今回は「東京リージョン」を使うことを前提にしましょう。違うリージョンを使いたい方はチュートリアルの説明を読みましょう。東京リージョンの場合、aws-region は「ap-northeast-1」となります。AWS コンソールで AWS IoT の設定をする際は、画面右上で「東京リージョン」を選択していることを確認しながら設定作業をしていきましょう。

ここからしばらくはチュートリアルに従いますが、実は、現在(5月22日)のチュートリアルには誤植があって、私はここでハマりました。説明に

    {
         "Effect": "Allow",
         "Action": "iot:Subscribe",
         "Resource": "arn:aws:iot:<aws-region>>:<aws-account-id>:*"
    },

という設定がありますが、ここの「>」は一つ余計で、以下が正しいです。

    {
         "Effect": "Allow",
         "Action": "iot:Subscribe",
         "Resource": "arn:aws:iot:<aws-region>:<aws-account-id>:*"
    },

テキストをコピーして一括置換すると、後で悩むことになります。設定ですが、具体的には

"arn:aws:iot:ap-northeast-1:123456789012:*"

のような感じになります。123456789012 は、皆さんの AWS アカウント ID に置き換えてください。

Registering Your MCU Board with AWS IoT の項の作業が終わったら、ここからは使用するデバイス(ボード)に依って作業が異なってきます。チュートリアルも、そこから枝分かれしています。現状で Amazon FreeRTOS に正式対応しているボードは以下の通りです。

  • Texas Instruments CC3220SF-LAUNCHXL
  • STMicroelectronics STM32L4 Discovery Kit IoT Node
  • NXP LPC54018 IoT Module
  • Microchip Curiosity PIC32MZEF
  • Espressif ESP32-DevKitC and the ESP-WROVER-KIT

今回は、STMicroelectronics 社の STM32L4 Discovery Kit IoT Node を使ってみることにしました。選定の理由ですが、

  • ARM Cortex-M4 を搭載していること
  • 評価しやすいヘッダピンやソケットが付いていること(特殊なコネクタでないこと)
  • 開発ツールが無償で、Mac OS でも動作すること

です。ただし現状の Amazon FreeRTOS バージョンでは STM32L4 Discovery Kit IoT Node は OTA デモが対応していないようなので、OTA を実験してみたい方は Texas Instruments CC3220SF-LAUNCHXL も候補に上るかも知れません。

なお、多くのボードが日本国内の工事認証未取得のようですので、評価の際は電波暗室等が必要な場合があります。御注意をお願いします。

STM32 開発環境と Amazon FreeRTOS のインストール

続いて、STM32L4 Discovery Kit IoT Node の開発環境をインストールします。チュートリアルの枝分かれ先から Getting Started with the STMicroelectronics STM32L4 Discovery Kit IoT Node を選ぶと、無償開発ツール System Workbench for STM32 のインストールについての説明があります。OpenSTM32 のサイトでユーザー登録してからダウンロードページに移ります。Windows だけでなく、Linux 版や Mac OS 版が提供されているのが嬉しいところです。

さらに、Amazon FreeRTOS のパッケージをダウンロードします。チュートリアルにあるように、AWS コンソールにログインした後、コンソール上の Amazon FreeRTOS を選び、Connect to AWS IoT – ST をクリックしてダウンロードします。(他のデバイスの場合は、異なる名称になります。)

ところで、今日ダウンロードしてみたところ、数日前にダウンロードしたものと内容が異なっていました。前回ダウンロードしたものはバージョン 1.2.5 で、今回は 1.2.6 でした。Amazon FreeRTOS の GitHub サイトを見れば確認できるのですが、できたら上記 AWS コンソールのダウンロードサイトでも、バージョンの同定ができるようになっていたら嬉しいな、と思いました。

ちなみに 1.2.5 と 1.2.6 の差分はドキュメントとソースコードのコメント程度のようで、実質的な違いはなさそうです。

パッケージ(Connect_to_AWS_IoT_-_ST.zip)をダウンロードしたら、チュートリアル通りに展開して Eclipse のプロジェクトとして取り込みます。私は workspace の下に AmazonFreeRTOS というディレクトリが来るように展開して、Eclipse からプロジェクトインポートしました。(どこか別のところに展開し、それをインポートするときに Copy projects into workspace をチェックボックスで指定する方法では、インポート後にディレクトリ参照で警告が出てしまいました。Copy … を指定するのではなく、別ディレクトリを参照する方法であれば問題ないかも知れませんが、私は workspace 下にプロジェクトディレクトリをまとめたかったため、このような方法を選びました。)

さらに、チュートリアル上の Configure Your Project に進みます。ここで、説明には aws_demos/application_code/common_demos/include というディレクトリが出てきますが、私がダウンロードしたバージョン 1.2.6 では、AmazonFreeRTOS/demos/common/include が正しいようでした。

チュートリアルに従って

  • aws_clientcredential.h
  • aws_clientcredential_keys.h

を編集したら、Eclipse 上でプロジェクトを再ビルドします。続いてこれもチュートリアル通りに AWS コンソールを開き、「MQTT クライアント」を実行します。MQTT クライアントでは freertos/demos/echo を subscribe します。なお、MQTT の基本的な考えについては、IBM のここのサイトが分かりやすいです。

加筆(2018/12/27)

AWS IoT チュートリアルのページでは、エンドポイント名の取得について記述がありますが、現状ではその方法では確認できないようです。こちらが参考になりますが、IoT Core のページから Manage → Thing で該当 Thing 名をクリックし、Interact というところをクリックするとエンドポイント名が表示されます。HTTPS というところに表示されている「なんとかかんとか.iot.リージョンコード.amazonaws.com」というのが、エンドポイント名です。

もう一つ。今日になって Amazon FreeRTOS v1.4.2 を評価したところ、MQTT Echo のデモが動かなくなってしまいました。どうも、新しく生成したエンドポイントが ATS エンドポイントというものになっていて、従来の root CA では証明書がエラーになってしまう、ということのようです。tlsVERISIGN_ROOT_CERTIFICATE_PEM に代えて tlsATS1_ROOT_CERTIFICATE_PEM を使うようにしたところ、うまく認証されるようになりました。この問題は、最近の v1.4.5 では解決されているようです。

MQTT デモコードの実行

なお、Eclipse から STM32L4 Discovery Kit IoT Node 上でプログラムを実行しても、Eclipse 上のコンソールには何もメッセージが表示されず困惑します。実は、プログラムのデバッグログは STM32L4 マイコンの UART1 に出力されており、ボード上の別のマイコン STM32F103 により USB ブリッジされています。パソコンの(仮想)UART ポートを見つけ 115200 bps でシリアルターミナルを接続してやることでログを見ることができます。

私が最初に試したときは、WiFi failed to connect to AP… というエラーを出して停まってしまいました。AP の設定を修正したところ、無事に動くようになりました。(問題切り分けのため、異なる Wi-Fi AP を試してみるというのも一つの方法です。)

また、Wi-Fi AP に接続しても、AWS IoT エンドポイントへの接続や MQTT の接続で認証エラーになることがあります。その場合は、AWS コンソールで AWS IoT の設定を見直してみてください。

無事に動作すると、STM32 マイコンの UART1 コンソールには

143 119121 [MQTTEcho] Sending command to MQTT task.
144 119125 [MQTT] Received message 170000 from queue.
145 121600 [MQTT] MQTT Publish was successful.
146 121604 [MQTT] Notifying task.
147 121960 [MQTTEcho] Command sent to MQTT task passed.
148 121965 [Echoing] Sending command to MQTT task.
149 121969 [MQTTEcho] Echo successfully published 'Hello World 10'
150 121975 [MQTT] Received message 180000 from queue.
151 123241 [MQTT] MQTT Publish was successful.
152 123245 [MQTT] Notifying task.

のようなメッセージがしばらく出力され、AWS IoT MQTT クライアント には、Hello World なんとかかんとか、というメッセージが同様に出力されます。

無事に AWS IoT、MQTT テスト、評価ボードの動作確認が出来ました!  とりあえず、今日はここまで。

追記 1: Wi-Fi モジュールについて(2018/05/24)

NXP Semiconductors 社の Amazon FreeRTOS 評価ボードもそうだったのですが、この STMicroelectronics 社のボードも、なぜか搭載している Wi-Fi モジュール(チップ)が自社製ではありません。NXP は Qualcomm のチップを、この STMicroelectronics 社のボードは Cypress Semiconductor が(一部門を)買収した旧 Broadcom BCM43362 を使っています。

回路図を見たところでは、実際には Inventek という会社の Wi-Fi モジュール(BCM43362 搭載)になっていて、SPI インターフェイスで STM32L4 に接続されています。BCM43362 自身は SDIO インターフェイスを持っているようですが、Inventek のモジュールと STM32L4 の間は UART と SPI が両方接続されていて、この STMicroelectronics 社製ボードでは、デフォルトでは SPI インターフェイス経由で Wi-Fi を AT コマンドによって制御しているようです。

参考: https://community.cypress.com/docs/DOC-2922

いつも思うのですが、Wi-Fi 周りのインターフェイスはいつも混乱しています。IEEE 802.3(Ethernet)のように MDI とか MII が明確に規定されていないからなのか、あるいは TCP/IP スタックをホストマイコンに載せるのがユーザーの負担と考えられているのか、おそらく後者のような気がしますが、AT コマンドがベンダ間で統一化されている訳ではないので、厄介なところです。特にバークレイソケットインターフェイスをエミュレートして複数のソケットを使えるようにしているものは、なかなか面倒です。

追記 2: 搭載センサ群について(2018/05/24)

ところでこの評価ボード STM32L4 Discovery Kit IoT Node ですが、搭載センサおよび通信機能が多岐にわたり非常に興味深いです。TI の SensorTag も驚きでしたが、それに近いものがあります。

ユーザーマニュアルから転記してみますと、以下の通りです。

  • Bluetooth v4.1 モジュール(これは日本の工事認証が取れているようです!)
  • サブ GHz の通信モジュール(日本では使えません。残念)
  • Wi-Fi モジュール(日本の工事認証が取れていないと思います。残念)
  • NFC タグ(同上。残念)
  • 2つの MEMS マイクロフォン
  • 相対湿度および温度センサ
  • 3軸磁気センサ
  • 3軸加速センサおよびジャイロスコープ
  • 絶対気圧センサ
  • ToF(レーザー測距モジュール)
  • 2つの押しボタン

他に、Arduino 互換のコネクタと、PMOD コネクタが付いています。USB OTG のコネクタもあります。素晴らしいです。

追記 3: 開発環境 SW4STM32 について(2018/05/24)

こちらのリストを見ると、System Workbench for STM32 は STM32L476 をサポートしているようです。STM32L4 Discovery Kit IoT Node が搭載している MPU は STM32L475 ですが、違いといえば、暗号化アクセラレータと LCD ドライバの有無だけのようですので、おそらく問題なく利用できるのではないかと思います。(Amazon FreeRTOS でサポートしている開発環境ですし)

今後、詳細を調査したいと思います。