チュートリアル: Eclipse ThreadX を使用して STMicroelectronics B-L475E-IOT01A Discovery kit を IoT Hub に接続する
このチュートリアルでは、Eclipse ThreadX を使用して、STMicroelectronics B-L475E-IOT01A Discovery kit (以降、STM DevKit) を Azure IoT に接続します。
次のタスクを実行します。
- C で STM DevKit をプログラミングするための、一連の組み込み開発ツールをインストールする
- イメージをビルドして STM DevKit にフラッシュする
- Azure CLI を使って、STM DevKit が安全に接続できる Azure IoT ハブを作成し、管理する
- Azure IoT エクスプローラーを使用して、IoT ハブへのデバイスの登録、デバイスのプロパティの表示、デバイス テレメトリの表示、デバイスでのダイレクト コマンドの呼び出しを行う
前提条件
Windows 10 または Windows 11 を実行している PC
有効な Azure サブスクリプション Azure サブスクリプションをお持ちでない場合は、開始する前に 無料アカウント を作成してください。
リポジトリを複製するための Git
Azure CLI。 このチュートリアルで Azure CLI コマンドを実行するには、次の 2 つのオプションがあります。
- ブラウザーで CLI コマンドを実行する対話型シェルである Azure Cloud Shell を使用します。 何もインストールする必要がないため、このオプションをお勧めします。 Cloud Shell を初めて使用する場合は、Azure portal にサインインします。 Cloud Shell のクイックスタートの手順に従って、Cloud Shell を起動し、Bash 環境を選択します。
- 必要に応じて、お使いのローカル コンピューターで Azure CLI を実行します。 Azure CLI が既にインストールされている場合は、
az upgrade
を実行して、CLI と拡張機能を最新バージョンにアップグレードします。 Azure CLI のインストール方法については、「Azure CLI をインストールする」をご覧ください。
ハードウェア
- B-L475E-IOT01A (STM DevKit)
- Wi-Fi 2.4 GHz
- USB 2.0 A male to Micro USB male ケーブル
開発環境の準備
開発環境を設定するには、まず、チュートリアルで必要なすべての資産を含む GitHub リポジトリを複製します。 次に、一連のプログラミング ツールをインストールします。
リポジトリを複製する
次のリポジトリを複製して、すべてのサンプル デバイス コード、設定スクリプト、オフライン バージョンのドキュメントをダウンロードします。 このリポジトリを別のチュートリアルで複製している場合は、もう一度実行する必要はありません。
リポジトリを複製するには、次のコマンドを実行します。
git clone --recursive https://github.com/eclipse-threadx/getting-started.git
ツールのインストール
複製されたリポジトリには、必要なツールをインストールして構成する設定スクリプトが含まれています。 別の組み込みデバイスのチュートリアルでこれらのツールをインストールしてある場合は、もう一度インストールする必要はありません。
ツールをインストールするには:
リポジトリ内の次のパスに移動し、get-toolchain.bat という名前の設定スクリプトを実行します。
getting-started\tools\get-toolchain.bat
新しいコンソール ウィンドウを開き、設定スクリプトによって行われた構成の変更を確認します。 このコンソールを使用して、チュートリアルの残りのプログラミング タスクを実行します。 Windows CMD、PowerShell、または Git Bash for Windows を使用できます。
次のコードを実行して、CMake バージョン3.14 以降がインストールされていることを確認します。
cmake --version
クラウド コンポーネントを作成する
IoT Hub の作成
Azure CLI を使用して、デバイスのイベントとメッセージングを処理する IoT ハブを作成できます。
IoT ハブを作成するには:
CLI アプリを起動します。 このクイックスタートの以降の部分で CLI コマンドを実行するには、コマンド構文をコピーして CLI アプリに貼り付け、変数の値を編集して Enter キーを押します。
- Cloud Shell を使ってい場合は、こちらの Cloud Shell のリンクを右クリックし、新しいタブで開くオプションを選びます。
- Azure CLI をローカルで使用している場合は、CLI コンソール アプリを起動し、Azure CLI にサインインします。
az extension add を実行して、azure-iot 拡張機能をインストールするか、最新バージョンにアップグレードします。
az extension add --upgrade --name azure-iot
az group create コマンドを実行してリソース グループを作成します。 次のコマンドでは、MyResourceGroup という名前のリソース グループが centralus リージョンに作成されます。
注意
必要に応じて、別の
location
を設定することもできます。 利用可能な場所を確認するには、az account list-locations を実行します。az group create --name MyResourceGroup --location centralus
az iot hub create コマンドを実行して、IoT ハブを作成します。 IoT ハブの作成には数分かかることがあります。
YourIotHubName: コード内のこのプレースホルダーは、IoT Hub の実際の名前に置き換えてください。 IoT ハブ名は Azure でグローバルに一意である必要があります。 このプレースホルダーは、このクイックスタートの残りの部分で、一意の IoT ハブ名を表すために使用されます。
--sku F1
パラメーターにより、Free レベルの IoT ハブが作成されます。 Free レベルのハブは機能セットが限られており、概念実証アプリケーションに使用されます。 IoT Hub のレベル、機能、価格の詳細については、「Azure IoT Hub の価格」を参照してください。az iot hub create --resource-group MyResourceGroup --name {YourIoTHubName} --sku F1 --partition-count 2
IoT ハブが作成されたら、コンソールに JSON 出力を表示し、後の手順で使用するために
hostName
値をコピーします。hostName
値は次の例のようになります。{Your IoT hub name}.azure-devices.net
IoT エクスプローラーの構成
このクイックスタートの残りの部分では、IoT エクスプローラーを使用して、IoT ハブへのデバイスの登録、デバイスのプロパティとテレメトリの表示、デバイスへのコマンドの送信を行います。 このセクションでは、作成した IoT ハブに接続して、パブリック モデル リポジトリからプラグ アンド プレイ モデルを読み取るように、IoT エクスプローラーを構成します。
IoT ハブへの接続を追加するには:
Azure IoT エクスプローラーをインストールします。 このツールは、Azure IoT リソースを監視および管理するためのクロスプラットフォーム ユーティリティです。
CLI アプリで az iot hub connection-string show コマンドを実行して、IoT ハブの接続文字列を取得します。
az iot hub connection-string show --hub-name {YourIoTHubName}
引用符で囲まずに接続文字列をコピーします。
Azure IoT エクスプローラーで、左側のメニューの [IoT Hub] を選びます。
[+ 接続の追加] を選択します。
接続文字列を [接続文字列] ボックスに貼り付けます。
[保存] を選択します。
接続が成功すると、IoT エクスプローラーが [デバイス] ビューに切り替わります。
パブリック モデル リポジトリを追加するには:
IoT エクスプローラーで、 [ホーム] を選択してホーム ビューに戻ります。
左側のメニューで、[IoT プラグ アンド プレイの設定] を選択します。
https://devicemodels.azure.com
のエンドポイントを含む既存のパブリック リポジトリ エントリがあることを確認します。Note
パブリック リポジトリのエントリがない場合は、 [+追加] を選択し、ドロップダウン メニューから [パブリック リポジトリ] を選択し、
https://devicemodels.azure.com
エンドポイントの値を指定して、[保存] を選択します。パブリック リポジトリの完了したエントリは、次のスクリーンショットのようになります。
デバイスの登録
このセクションでは、新しいデバイス インスタンスを作成し、作成した IoT ハブに登録します。 新しく登録したデバイスの接続情報を使用して、後のセクションで物理デバイスを安全に接続します。
デバイスを登録するには:
IoT エクスプローラーのホーム ビューで、 [IoT Hub] を選択します。
前に追加した接続が表示されます。 接続プロパティの下にある [View devices in this hub](このハブのデバイスを表示) を選択します。
[+ 新規] を選択し、デバイスのデバイス ID (例:
mydevice
) を入力します。 他のプロパティはすべてそのままにしておきます。[作成] を選択します。
コピー ボタンを使って、[デバイス ID] と [主キー] フィールドをコピーしておきます。
次のセクションに進む前に、前の手順で取得した次の各値を安全な場所に保存します。 次のセクションでは、これらの値を使ってデバイスを構成します。
hostName
deviceId
primaryKey
デバイスの準備
STM DevKit を Azure に接続するには、Wi-Fi と Azure IoT の設定の構成ファイルを変更し、イメージをリビルドして、イメージをデバイスにフラッシュします。
構成を追加する
テキスト エディターで次のファイルを開きます。
getting-started\STMicroelectronics\B-L475E-IOT01A\app\azure_config.h
次に示すように、ファイルの先頭付近にある次の行をコメントアウトします。
// #define ENABLE_DPS
Wi-Fi 定数をローカル環境の次の値に設定します。
定数名 値 WIFI_SSID
{自分の Wi-Fi SSID} WIFI_PASSWORD
{自分の Wi-Fi パスワード} WIFI_MODE
{ファイル内の列挙された Wi-Fi モード値のいずれか} Azure IoT デバイス情報の定数を、Azure リソースの作成後に保存した値に設定します。
定数名 値 IOT_HUB_HOSTNAME
{自分の IoT ハブの hostName 値} IOT_HUB_DEVICE_ID
{自分のデバイス ID 値} IOT_DEVICE_SAS_KEY
{自分のプライマリ キー値} ファイルを保存して閉じます。
イメージをビルドする
コンソールまたはエクスプローラーで、次のパスのバッチ ファイル rebuild.bat を実行してイメージをビルドします。
getting-started\STMicroelectronics\B-L475E-IOT01A\tools\rebuild.bat
ビルドが完了したら、次のパスにバイナリ ファイルが作成されたことを確認します。
getting-started\STMicroelectronics\B-L475E-IOT01A\build\app\stm32l475_azure_iot.bin
イメージをフラッシュする
STM DevKit MCU で、リセット ボタン (1)、USB STLink というラベルが付いた Micro USB ポート (2) 、ボードの部品番号 (3) を見つけます。 次の手順でこれらの項目を参照します。 次の図でこれらのすべてが強調表示されています。
マイクロ USB ケーブルを STM DevKit の USB STLINK に接続し、それからコンピューターに接続します。
Note
STM DevKit の詳細なセットアップ情報については、パッケージの手順を参照するか、B-L475E-IOT01A のリソースに関するページを参照してください
エクスプローラーで、前のセクションで作成したバイナリ ファイルを見つけます。
stm32l475_azure_iot.bin という名前のバイナリ ファイルをコピーします。
エクスプローラーで、コンピューターに接続されている STM DevKit を見つけます。 デバイスは、DIS_L4IOT というドライブ ラベルでシステム上のドライブとして表示されます。
バイナリ ファイルを STM Devkit のルート フォルダーに貼り付けます。 自動的に点滅が始まり、数秒後に完了します。
Note
フラッシュ プロセス中、STM DevKit で LED が赤と緑の間で切り替わります。
デバイス接続の詳細を確認する
Termite アプリを使用して、通信を監視し、デバイスが正しく設定されていることを確認できます。
Termite を開始します。
ヒント
Termite を Devkit に接続できない場合は、ST-LINK ドライバーをインストールして、もう一度やり直してください。 追加の手順については、トラブルシューティングに関する記事を参照してください。
[設定] を選択します。
[Serial port settings](シリアルポートの設定) ダイアログで、次の設定を確認し、必要に応じて更新します。
- Baud rate(ボー レート) : 115,200
- Port (ポート) : STM DevKit が接続されているポート。 ドロップダウンに複数のポート オプションがある場合は、使用する適切なポートを見つけることができます。 Windows のデバイス マネージャーを開き、 [ポート] を表示して、使用するポートを特定します。
[OK] を選択します。
デバイス上のリセット ボタンを押します。 ボタンは黒で、デバイス上にラベルが付いています。
Termite アプリで、次のチェックポイント値を確認して、デバイスが初期化され、Azure IoT に接続されていることを確認します。
Starting Azure thread Initializing WiFi Module: ISM43362-M3G-L44-SPI MAC address: **************** Firmware revision: C3.5.2.5.STM SUCCESS: WiFi initialized Connecting WiFi Connecting to SSID 'iot' Attempt 1... SUCCESS: WiFi connected Initializing DHCP IP address: 192.168.0.35 Mask: 255.255.255.0 Gateway: 192.168.0.1 SUCCESS: DHCP initialized Initializing DNS client DNS address 1: ************ DNS address 2: ************ SUCCESS: DNS client initialized Initializing SNTP time sync SNTP server 0.pool.ntp.org SNTP time update: Nov 18, 2022 0:56:56.127 UTC SUCCESS: SNTP initialized Initializing Azure IoT Hub client Hub hostname: *******.azure-devices.net Device id: mydevice Model id: dtmi:eclipsethreadx:devkit:gsgstml4s5;2 SUCCESS: Connected to IoT Hub
重要
DNS クライアントの初期化が失敗し、Wi-Fi ファームウェアが最新でないと通知される場合は、Wi-Fi モジュールのファームウェアを更新する必要があります。 Inventek ISM 43362 Wi-Fi モジュール ファームウェア更新プログラムをダウンロードしてインストールします。 次に、デバイスのリセットボタンを押して接続を再確認し、このチュートリアルを続行します。
Termite は、次の手順でデバイスの出力を監視するために開いたままにしておきます。
デバイスのプロパティを表示する
Azure IoT エクスプローラーを使用して、デバイスのプロパティを表示および管理できます。 以降のセクションでは、IoT エクスプローラーに表示されるプラグ アンド プレイ機能を使って、STM DevKit の管理と操作を行います。 これらの機能は、パブリック モデル リポジトリで STM DevKit 用に公開されているデバイス モデルに依存します。 このチュートリアルの前の方で、このリポジトリでデバイス モデルを検索するように IoT エクスプローラーを構成しました。 多くの場合、IoT エクスプローラーのメニュー オプションを選ぶことで、プラグ アンド プレイを使わずに同じアクションを実行できます。 ただし、プラグ アンド プレイを使用すると、エクスペリエンスが強化されることが多々あります。 IoT エクスプローラーでは、プラグ アンド プレイ デバイスで指定されたデバイス モデルを読み取り、そのデバイスに固有の情報を提示できます。
IoT エクスプローラーでデバイスの IoT プラグ アンド プレイ コンポーネントにアクセスするには:
IoT エクスプローラーのホーム ビューで [IoT Hub] を選択し、 [View devices in this hub](このハブのデバイスを表示) を選択します。
デバイスを選択します。
[IoT プラグ アンド プレイ コンポーネント] を選択します。
[既定のコンポーネント] を選択します。 IoT エクスプローラーに、デバイスに実装されている IoT プラグ アンド プレイ コンポーネントが表示されます。
[インターフェイス] タブで、デバイス モデルの [説明] の JSON コンテンツを確認します。 JSON には、デバイス モデルの各 IoT プラグ アンド プレイ コンポーネントの構成の詳細が含まれています。
Note
既定のコンポーネントの名前と説明では、STM L4S5 ボードが参照されています。 STM L4S5 プラグ アンド プレイ デバイス モデルは、このチュートリアルの STM L475E ボードにも使用されます。
IoT エクスプローラーの各タブは、デバイス モデルの IoT プラグ アンド プレイ コンポーネントの 1 つに対応しています。
タブ Type 名前 説明 Interface インターフェイス STM Getting Started Guide
STM DevKit のモデル例 プロパティ (読み取り専用) プロパティ ledState
LED がオンかオフか プロパティ (書き込み可能) プロパティ telemetryInterval
デバイスがテレメトリを送信する間隔 コマンド コマンド setLedState
LED のオン/オフを切り替えます
Azure IoT エクスプローラーを使用してデバイスのプロパティを表示するには:
[プロパティ (読み取り専用)] タブを選びます。LED がオンかオフかを示す 1 つの読み取り専用プロパティがあります。
[プロパティ (書き込み可能)] タブを選択します。テレメトリが送信される間隔が表示されます。
telemetryInterval
を 5 に変更し、 [Update desired value](必要な値の更新) を選択します。 これにより、デバイスでは、この間隔を使用してテレメトリが送信されるようになります。IoT エクスプローラーは通知で応答します。 Termite で更新を監視することもできます。
テレメトリの間隔を 10 に戻します。
Azure CLI を使用してデバイスのプロパティを表示するには:
az iot hub device-twin show コマンドを実行します。
az iot hub device-twin show --device-id mydevice --hub-name {YourIoTHubName}
コンソール出力でデバイスのプロパティを調べます。
利用統計情報データを表示する
Azure IoT エクスプローラーを使用すると、デバイスからクラウドへのテレメトリのフローを表示できます。 必要に応じて、Azure CLI を使用して同じタスクを実行することもできます。
Azure IoT エクスプローラーでテレメトリを表示するには:
IoT エクスプローラーで、デバイスの [IoT プラグ アンド プレイ コンポーネント] (既定のコンポーネント) ペインから、 [テレメトリ] タブを選択します。 [Use built-in event hub](組み込みのイベント ハブを使用する) が [はい] に設定されていることを確認します。
[スタート] を選択します。
デバイスからクラウドにメッセージが送信されるときのテレメトリを表示します。
Note
Termite アプリを使用して、デバイスからテレメトリを監視することもできます。
[Show modeled events](モデル化されたイベントを表示する) チェック ボックスをオンにして、デバイス モデルで指定されたデータ形式でイベントを表示します。
[停止] を選択して、イベントの受信を終了します。
Azure CLI を使用してデバイス テレメトリを表示するには:
az iot hub monitor-events コマンドを実行します。 Azure IoT で以前に作成した、デバイスと IoT ハブの名前を使用します。
az iot hub monitor-events --device-id mydevice --hub-name {YourIoTHubName}
コンソールに JSON 出力を表示します。
{ "event": { "origin": "mydevice", "module": "", "interface": "dtmi:eclipsethreadx:devkit:gsgmxchip;1", "component": "", "payload": "{\"humidity\":41.21,\"temperature\":31.37,\"pressure\":1005.18}" } }
Ctrl + C キーを押して監視を終了します。
デバイス上のダイレクト メソッドを呼び出す
Azure IoT エクスプローラーを使用して、デバイスに実装したダイレクト メソッドを呼び出すこともできます。 ダイレクト メソッドには名前があり、必要に応じて、JSON ペイロード、構成可能な接続、メソッドのタイムアウトを設定できます。 このセクションでは、LED のオン/オフを切り替えるメソッドを呼び出します。 必要に応じて、Azure CLI を使用して同じタスクを実行することもできます。
Azure IoT エクスプローラーでメソッドを呼び出すには:
IoT エクスプローラーで、デバイスの [IoT プラグ アンド プレイ コンポーネント] (既定のコンポーネント) ペインから [コマンド] タブを選択します。
setLedState コマンドで、 [state] を [true] に設定します。
[コマンドの送信] を選択します。 IoT エクスプローラーに通知が表示され、デバイスの緑色の LED ライトがオンになります。
[state] を [false] に設定し、[コマンドの送信] を選択します。 LED がオフになります。
必要に応じて、Termite で出力を表示してメソッドの状態を監視することもできます。
Azure CLI を使用してメソッドを呼び出すには:
az iot hub invoke-device-method コマンドを実行し、メソッド名とペイロードを指定します。 このメソッドでは、
method-payload
をtrue
に設定すると LED がオンになり、false
に設定するとオフになります。az iot hub invoke-device-method --device-id mydevice --method-name setLedState --method-payload true --hub-name {YourIoTHubName}
CLI コンソールに、デバイスでのメソッド呼び出しの状態が表示されます。
204
は成功を示しています。{ "payload": {}, "status": 200 }
デバイスを調べて LED の状態を確認します。
Termite ターミナルを表示して、出力メッセージを確認します。
Received command: setLedState Payload: true LED is turned ON Sending property: $iothub/twin/PATCH/properties/reported/?$rid=15{"ledState":true}
トラブルシューティングとデバッグ
デバイス コードのビルド、デバイスのフラッシュ、または接続で問題が発生した場合は、トラブルシューティングに関する記事を参照してください。
アプリケーションのデバッグについては、「Visual Studio Code を使用したデバッグ」を参照してください。
リソースをクリーンアップする
このクイックスタートで作成した Azure リソースが不要になった場合は、Azure CLI を使用して、リソース グループとそのすべてのリソースを削除できます。
重要
リソース グループを削除すると、元に戻すことができません。 リソース グループとそこに含まれるすべてのリソースは完全に削除されます。 間違ったリソース グループやリソースをうっかり削除しないようにしてください。
名前でリソース グループを削除するには、以下の手順を実行します。
az group delete コマンドを実行します。 このコマンドにより、作成したリソース グループ、IoT Hub、デバイスの登録が削除されます。
az group delete --name MyResourceGroup
az group list コマンドを実行して、リソース グループが削除されていることを確認します。
az group list
次のステップ
このチュートリアルでは、Eclipse ThreadX サンプル コードを含むカスタム イメージをビルドし、そのイメージを STM DevKit デバイスにフラッシュしました。 STM DevKit を Azure に接続し、テレメトリの表示やデバイスでのメソッドの呼び出しなどのタスクを実行しました。
次の手順として、次の記事を読んで、埋め込み開発オプションの詳細を確認してください。
重要
Eclipse ThreadX は、通信をセキュリティで保護し、基になる MCU/MPU ハードウェア保護メカニズムを使用してコードとデータの分離を作成するためのコンポーネントを OEM に提供します。 ただし、各 OEM は最終的に、そのデバイスが進化するセキュリティ要件を確実に満たすようにする役目を負っています。