Texas Instruments SimpleLink F3 と OpenThread を使用して Thread ネットワークを構築する

1. はじめに

OpenThread のロゴ

Google の OpenThread(OT)は、Thread のオープンソース実装です。Google は、Google Nest 製品で使用されているネットワーキング技術をデベロッパーが幅広く利用できるように OpenThread をリリースしました。これにより、スマートホームや商業ビルのアプリケーション向けの製品開発が加速します。OpenThread は、プラットフォーム抽象化レイヤが狭く、メモリ使用量が小さいため、移植性が非常に高くなっています。システム オン チップ(SoC)とネットワーク コプロセッサ(NCP)の両方の設計をサポートしています。

Thread 仕様では、家庭用および商業ビル用アプリケーション向けの、IPv6 ベースの信頼性が高く安全な低電力のワイヤレス デバイス間通信プロトコルを定義しています。

Texas Instruments は、SimpleLink™ CC27xx デバイス ファミリー向けに OpenThread を実装しました。GitHub の ot-ti リポジトリには、Texas Instruments SimpleLink Connected MCU で OpenThread を実行するために必要なプラットフォーム ドライバとサンプル アプリケーションが含まれています。CC2745R10-Q1 は、TI の SimpleLink CC27xx ファミリーの車載グレード(AEC-Q100 認定)の Thread 認定 IEEE 802.15.4 ワイヤレス MCU です。

この Codelab では、LP-EM-CC2745R10-Q1 LaunchPad 評価ボードと ot-ti リポジトリを使用して OpenThread アプリケーションの開発を開始する方法について説明します。下の図は、この Codelab で使用するハードウェア設定を示しています。OT Border Router(OTBR)と 2 つの Thread Full Thread Device(FTD)があります。

CC2745R10 ハードウェア設定

学習内容

  • Texas Instruments ot-ti ビルド環境をセットアップする方法。
  • OpenThread CLI バイナリを LP-EM-CC2745R10-Q1 ボードにビルドして書き込む方法。
  • ot-br-posix を使用して Raspberry Pi を OpenThread Border Router(OTBR)として設定する方法。
  • OTBR で Thread ネットワークを作成する方法。
  • デバイスを Thread ネットワークに帯域外でコミッショニングします。
  • ping コマンドを使用してノード間の Thread 通信を確認する方法。

2. 前提条件

ハードウェア

  1. 3 つの LP-EM-CC2745R10-Q1 LaunchPad ボード: 1 つはボーダー ルーターに接続された RCP として構成され、2 つは Full Thread Device(FTD)として構成されます。 LP-EM-CC2745R10-Q1 の斜めからの外観CC2745R10-Q1 は、TI の SimpleLink CC27xx ファミリーに属する、自動車グレード(AEC-Q100 認定)の Thread 認定 IEEE 802.15.4 ワイヤレス MCU です。LP-EM-CC2745R10-Q1 は対応する LaunchPad 評価モジュールで、RCP、FTD、MTD、NCP の Thread ロールをサポートしています。LP-EM-CC2340R5 LaunchPad を搭載した CC2340R5 は、RCP としてのみ機能するメモリ容量の少ないオプションです。FTD、MTD、NCP のロールはサポートされていません。ボード 1(RCP)を LP-EM-CC2340R5 に置き換える場合でも、2 つの FTD ボードは LP-EM-CC2745R10-Q1 である必要があります。
  2. 3 個の LP-XDS110ET デバッグ プローブ: LaunchPad ボードごとに 1 個。USB 経由のプログラミングとデバッグに使用されます。 LP-XDS110ET の斜めからの外観LP-XDS110ET は、LP-EM フォーム ファクタの LaunchPad に必要な別の USB デバッグ プローブです。これには、電力プロファイリング用の EnergyTrace のサポートが含まれています。LP-XDS110 は、同じプログラミング機能とデバッグ機能を提供しますが、EnergyTrace は含まれていない、低コストの代替手段です。別の方法として、LP-EM ボードと個別のデバッグ プローブの代わりに、オンボード XDS110 デバッグ プローブ(LAUNCHXL-CC26X2R1 など)を備えた LaunchPad を使用できます。詳しくは、LaunchPad デバッグ接続ガイドをご覧ください。
  3. LaunchPad ボードとデバッグ プローブを接続して電源を供給するための 3 本のマイクロ USB ケーブル
  4. イーサネット経由でインターネットに接続された Raspberry Pi OS を搭載した Raspberry Pi 4B 以降。これは OT Border Router ホストとして構成されます。Raspberry Pi 4
  5. 2 つ以上の USB ポートとインターネット アクセスを備えた Linux または macOS ホストシステム。ビルド環境には、Bash 互換のシェルが必要です。Windows ユーザーは、Ubuntu で WSL2(Windows Subsystem for Linux 2)を使用する必要があります。
  6. Raspberry Pi をインターネットに接続するためのイーサネット ケーブル(1 本以上)。また、Raspberry Pi を Wi-Fi に接続し、wlan0 をインフラストラクチャ インターフェースとして使用することもできます。詳しくは、OTBR のセットアップ手順をご覧ください。

ソフトウェア

  • TI ot-ti リポジトリ: https://github.com/TexasInstruments/ot-ti
  • GNU ARM Embedded Toolchain 12.2(ブートストラップ スクリプトによって自動的にインストールされます)
  • SysConfig 1.27.0(ブートストラップ スクリプトによって自動的にインストールされます)
  • TI UniFlash: LaunchPad ボードにファームウェアを書き込む場合

3. ハードウェアのセットアップ

この Codelab では、3 つの LP-EM-CC2745R10-Q1 ボードを使用します。

  • ボード 1(RCP): ot-rcp ファームウェアを実行します。ボーダー ルーターの無線コプロセッサとして USB 経由で Raspberry Pi に接続されます。
  • ボード 2(FTD 1): フル Thread デバイスとして ot-cli-ftd ファームウェアを実行します。
  • ボード 3(FTD 2): Full Thread Device として ot-cli-ftd ファームウェアを実行します。

LP-EM-CC2745R10-Q1 の上面図

各 LaunchPad をマイクロ USB 経由でホスト コンピュータに接続します。USB 接続により、オンボードの XDS110 デバッグ プローブを介して電源とデバッグ/プログラミング機能の両方が提供されます。

LP-EM-CC2745R10-Q1 は、USB 経由で接続すると、2 つの仮想シリアルポートとして表示されます。1 つは XDS110 デバッグ インターフェース用、もう 1 つはアプリケーション UART 用です。シリアル コンソールを開くときは、補助データポートではなく、アプリケーション/ユーザー UART ポートに接続します。

ハードウェア接続図

4. リポジトリの設定とビルド

ot-ti ビルドシステムは CMake を使用し、Bash シェルが必要です。このセクションのコマンドはすべて、Linux または macOS ホスト(または Windows の WSL2)で実行されます。

1. リポジトリのクローンを作成する

$ git clone https://github.com/TexasInstruments/ot-ti.git
$ cd ot-ti
$ git submodule update --init

2. ブートストラップ スクリプトを実行する

ブートストラップ スクリプトは、GNU ARM ツールチェーンや SysConfig などの必要な依存関係をインストールします。

$ ./script/bootstrap

ブートストラップ スクリプトには、cmakegitwget、標準のビルドツールが必要です。Ubuntu/Debian では、sudo apt-get install -y cmake git make wget tar ninja-build を使用して前提条件をインストールします。

3. LP_EM_CC2745R10_Q1 のファームウェアをビルドする

LP-EM-CC2745R10-Q1 ボードのすべてのファームウェア イメージをビルドします。

$ ./script/build LP_EM_CC2745R10_Q1

LP_EM_CC2745R10_Q1 ビルド ターゲットは、CC27xx SimpleLink ファミリー(Arm Cortex-M33F コア)の CC2745R10-Q1 デバイスに対応しています。サポートされているすべてのボードを表示するには、引数なしで ./script/build を実行します。

ビルドが成功すると、ELF バイナリは build/bin/ にあります。

$ ls build/bin/
ot-cli-ftd.out  ot-cli-mtd.out  ot-ncp-ftd.out  ot-rcp.out

この Codelab で使用する 2 つの画像は次のとおりです。

  • ot-rcp.out: ボーダー ルーター ボードの無線コプロセッサ ファームウェア。
  • ot-cli-ftd.out: 2 つの FTD ボード用の Full Thread Device CLI ファームウェア。

オプションの最小限の Thread デバイス: フル Thread デバイスではなくスリーピー エンドデバイスを試す場合は、ボード 2 と 3 で ot-cli-ftd.out の代わりに ot-cli-mtd.out をフラッシュできます。MTD は Thread トラフィックをルーティングせず、低電力スリープ状態に移行できるため、バッテリー駆動のアプリケーションに適しています。この Codelab の Thread ネットワークの形成手順は、どちらのデバイスタイプでも同じです。

オプションのネットワーク コプロセッサ(NCP): ot-ncp-ftd.out バイナリは NCP アーキテクチャを実装します。このアーキテクチャでは、OpenThread スタックがデバイス上で実行され、ホスト プロセッサが Spinel プロトコルを介してそれを駆動します。NCP の使用は、この Codelab の範囲外です。詳細については、NCP README をご覧ください。

5. ファームウェアの書き込み

TI UniFlash を使用して、ELF イメージを LaunchPad ボードに書き込みます。

UniFlash を使用して書き込む

  1. UniFlash を開きます。接続された LaunchPad ボードは、デバイスの自動検出機能により、[Detected Devices] に表示されます。ボードが自動的に検出されない場合は、[New Configuration] をクリックして LP-EM-CC2745R10-Q1 ターゲットを選択し、XDS110 USB デバッグ プローブを選択します。UniFlash で検出されたデバイス
  2. [Board 1](ot-rcp.out でフラッシュされます)を選択し、[Start] をクリックします。
  3. [Browse] ボタンをクリックして、ot-ti/build/bin/ot-rcp.out に移動します。UniFlash のフラッシュ ページ
  4. [Load Image] をクリックしてファームウェアを書き込みます。ログ領域に進行状況が表示され、完了が確認されます。
  5. ボード 2ボード 3 についてもステップ 2 ~ 4 を繰り返し、それぞれ ot-ti/build/bin/ot-cli-ftd.out を選択します。

代替手段: Code Composer Studio(CCS)を使用して書き込む

Code Composer Studio は UniFlash の代替として使用でき、さらに完全なデバッグ環境も提供します。

  1. Code Composer Studio をダウンロードしてインストールします。
  2. XDS110 デバッガを使用して、LP-EM-CC2745R10-Q1 のターゲット接続(CCXML)を作成します。CCS ユーザーガイド: 手動の方法を参照してください。
  3. CCS ユーザーガイド: 手動起動の説明に沿って、プロジェクトなしのデバッグ セッションを開始します。
  4. Arm Cortex-M33 コアに接続し、[Load] をクリックして ELF イメージを読み込みます。

デフォルトの CCXML 構成では、デフォルトの LP-EM-CC2745R10-Q1 ジャンパー構成に合わせて 2 線式 cJTAG が使用されます。JTAG 経由でプログラミングした後、ボードの電源を入れ直して、起動停止フラグをクリアします。

6. HSM をプログラミングする

CC2745R10-Q1 には、Thread やその他の安全なアプリケーション ファームウェアを実行する前にプロビジョニングする必要があるハードウェア セキュリティ モジュール(HSM)が含まれています。LP-EM-CC2745R10-Q1 ボードの HSM がまだプログラミングされていない場合は、ここでこの手順を完了します。

UniFlash を使用して HSM をプログラミングするには:

  1. UniFlash を開き、[Detected Devices] から LP-EM-CC2745R10-Q1 ボードを選択します。
  2. HSM プログラミング パネルに移動し、次のように HSM ファームウェア イメージを読み込みます。

UniFlash HSM プログラミング

  1. 画面の指示に沿って HSM のプロビジョニングを完了します。このオペレーションは UniFlash 出力コンソールに記録されます。

SimpleLink Low Power F3 SDK 内の必要なファームウェア イメージ パスなど、HSM プログラミングの完全な手順については、TI Resource Explorer の CC2745R10-Q1 クイック スタートガイドを参照してください。

7. ファームウェアの概要

この時点で、3 つのボードすべてがフラッシュされているはずです。

  • ボード 1: ot-rcp.out: ホスト コンピュータから切断し、USB 経由で Raspberry Pi に接続します。
  • ボード 2: ot-cli-ftd.out: ホスト コンピュータに接続したままにします。
  • ボード 3: ot-cli-ftd.out: ホスト コンピュータに接続したままにします。

ハードウェアの設定は、次の図のようになります。ボード 1 は OTBR の無線コプロセッサとして Raspberry Pi に接続され、ボード 2 と 3 はシリアル コンソール アクセス用にホスト コンピュータに接続されたままになります。

FTD を使用した CC2745R10 ハードウェアの設定

8. ot-cli-ftd デバイスのシリアル コンソールを設定する

LP-EM-CC2745R10-Q1 は、921,600 ボーで USB 経由でアプリケーション UART を公開します。

次の設定を使用して、各 FTD ボードのアプリケーション UART COM ポート(Windows)または /dev/ttyACM* デバイス(Linux/macOS)にシリアル ターミナルを開きます。

パラメータ

速度(ボー)

921600

データビット

8

ストップ ビット

1

パリティ

None

フロー制御

None

ヒント(Linux/macOS): ボードを接続する前と後で ls /dev/ttyACM* を実行し、どのエントリが表示されるかを確認して、正しいデバイスノードを特定します。各 LP-EM-CC2745R10-Q1 は 2 つのエントリを作成します。番号の小さいポートは XDS110 デバッグ UART で、番号の大きいポートはアプリケーション UART です。たとえば、ボードが /dev/ttyACM0/dev/ttyACM1 を作成する場合は、/dev/ttyACM1 を使用します。

ヒント(Windows): ボードを接続したら、デバイス マネージャーを開き、[ポート(COM と LPT)] に 2 つの新しい COM ポートが表示されていることを確認します。通常、XDS110 デバッグ データポートが最初に表示されます。アプリケーション コンソールには 2 番目(番号が大きい方)の COM ポートを使用します。

ターミナルで Enter キーを押して、OpenThread CLI プロンプト(>)を取得します。使用可能なコマンドの一覧については、OpenThread CLI リファレンスをご覧ください。FTD が動作していることを確認します。

> state
disabled
Done

シリアル ターミナル FTD

ここでは、RCP ボードのシリアル コンソールは設定しません。Raspberry Pi の OTBR は RCP と直接通信します。次のステップでは、Raspberry Pi を OpenThread ボーダー ルーターとして構成します。

9. Raspberry Pi をボーダー ルーターとしてセットアップする

OTBR は、オープンソースの OpenThread Border Router プロジェクトである ot-br-posix からビルドされています。Border Router は Raspberry Pi で動作し、USB 経由で Board 1(RCP)を 802.15.4 無線として使用します。

Raspberry Pi のセットアップ

  1. Raspberry Pi Imager を使用して、Raspberry Pi OS(64 ビット Lite または Desktop)を SD カードに書き込みます。
  2. Raspberry Pi を起動し、ターミナルを開きます(SSH 経由または直接)。
  3. パッケージ マネージャーを更新し、インストール済みのパッケージをアップグレードします。
    $ sudo apt-get update
    $ sudo apt-get upgrade -y
    

更新後、続行する前に Raspberry Pi を再起動します。sudo reboot

ボード 1(RCP)を Raspberry Pi に接続する

ボード 1ot-rcp でフラッシュ済み)をマイクロ USB 経由で Raspberry Pi に接続します。接続後、デバイスノードが表示されることを確認します。

$ ls /dev/ttyACM*
/dev/ttyACM0
/dev/ttyACM1

通常、RCP ボードのアプリケーション UART は /dev/ttyACM1 です(XDS110 デバッグ UART は /dev/ttyACM0 です)。後のステップで OTBR エージェントが起動したときに応答することを確認して、どのポートがアプリケーション UART であるかを確認します。他の USB シリアル デバイスが接続されている場合、デバイスノード番号は異なることがあります。OTBR 構成のパスを適宜調整します。

ot-br-posix をビルドしてインストールする

Raspberry Pi で、ot-br-posix のクローンを作成してビルドします。

$ git clone https://github.com/openthread/ot-br-posix.git
$ cd ot-br-posix
$ ./script/bootstrap

設定スクリプトを実行し、イーサネット インターフェースをバックボーン(インフラストラクチャ)インターフェースとして指定します。

$ INFRA_IF_NAME=eth0 ./script/setup

eth0 は、有線イーサネット インターフェースの一般的な名前です。イーサネットではなく Wi-Fi 経由で Raspberry Pi を接続する場合は、eth0wlan0 に置き換えます(また、Pi が Wi-Fi ネットワークにすでに接続されていることを確認します)。ip link show でアクティブなインターフェース名を確認します。

セットアップ スクリプトは、ソースから ot-br-posix をビルドし、otbr-agentotbr-web のシステム サービスをインストールして、ネットワーキング スタックを構成します。このプロセスには通常、Raspberry Pi 4B で 10 ~ 20 分かかります。

OTBR エージェントを構成する

OTBR エージェントの構成ファイルを編集して、RCP デバイスのパスとボーレートを指定します。

$ sudo nano /etc/default/otbr-agent

OTBR_AGENT_OPTS 行を見つけて、RCP アプリケーション UART を参照するように更新します。

OTBR_AGENT_OPTS="-I wpan0 -B eth0 spinel+hdlc+uart:///dev/ttyACM1?uart-baudrate=921600"

Raspberry Pi が Wi-Fi 経由で接続されている場合は、eth0wlan0 に置き換えます。

OTBR_AGENT_OPTS="-I wpan0 -B wlan0 spinel+hdlc+uart:///dev/ttyACM1?uart-baudrate=921600"

LP-EM-CC2745R10-Q1 RCP アプリケーション UART は 921600 ボーで動作します。デバイスパス(この例では /dev/ttyACM1)が RCP ボードの Application UART と一致していることを確認します。

OTBR エージェントを再起動して、構成を適用します。

$ sudo systemctl restart otbr-agent
$ sudo systemctl enable otbr-agent

エージェントが実行されていることを確認します。

$ sudo systemctl status otbr-agent

RCP ノードを操作する

ot-ctl ツールを使用して RCP ノードと通信します。

$ sudo ot-ctl state
disabled
Done

OTBR エージェントのログで接続とステータスのメッセージをモニタリングできます。

$ sudo journalctl -u otbr-agent -f

必要に応じて、OTBR ウェブ インターフェース(http://:80)で Thread ネットワークのグラフィカル ビューを利用できます。

OTBR エージェントを停止または再起動するには:

$ sudo systemctl stop otbr-agent
$ sudo systemctl start otbr-agent

この時点で、次の 3 つのアクティブなコンソールが表示されます。

  1. ホスト コンピュータ上の Board 2ot-cli-ftd 1)のシリアル ターミナル。
  2. ホストコンピュータ上の Board 3ot-cli-ftd 2)のシリアル ターミナル。
  3. ot-ctl(OTBR/RCP)の Raspberry Pi の SSH またはターミナル セッション。

これで、Thread ネットワークを形成する準備が整いました。

10. Thread ネットワークを作成する

RCP(OTBR)を設定する

Raspberry Pi の ot-ctl シェルから新しい Thread ネットワークを作成します。次のコマンドを順番に入力します。

インデックス

コマンド

説明

想定される回答

1

dataset init new

新しいネットワーク構成を作成します。

完了

2

dataset commit active

新しいデータセットをアクティブな運用データセットに commit します。

完了

3

ifconfig up

Thread インターフェースを有効にします。

完了

4

thread start

Thread プロトコル オペレーションを有効にしてアタッチします。

完了

Thread インターフェースが起動するまで 10 秒待ちます。

5

state

デバイスの状態を確認します。リーダーである必要があります。その他の状態: offline、disabled、detached、child、router、leader。

leader
完了

6

dataset

ネットワーク構成を表示します。実際の値は異なります。チャネル、ネットワーク キー、ネットワーク名、PAN ID をメモします。これらは FTD をネットワークに参加させるために必要です。

Active Timestamp: 1
Channel: 20
Channel Mask: 0x07fff800
Ext PAN ID: 39ba71f7fc367160
Mesh Local Prefix: fd5c:c6b:3a17:40b9::/64
Network Key: 81ae2c2c17368d585dee71eaa8cf1e90
Network Name: OpenThread-008c
PAN ID: 0x008c
PSKc: c98f0193d4236025d22dd0ee614e641f
Security Policy: 0, onrcb
Done

Thread ネットワークに FTD を追加する(アウトオブバンド方式)

帯域外コミッショニング方法を使用すると、ネットワーク認証情報を直接指定できます。各 FTD ボードのシリアル ターミナルで、上記の OTBR データセット出力のチャネルとネットワーク キーを使用して、次のコマンドを入力します。

インデックス

コマンド

説明

想定される回答

1

dataset channel 20

OTBR に合わせてチャンネルを設定します。20 は、OTBR のチャネル値に置き換えます。

完了

2

dataset networkkey 81ae2c2c17368d585dee71eaa8cf1e90

ネットワーク キーを設定します。OTBR のネットワーク キーに置き換えます。添付に必要なのはこのキーのみです。

完了

3

dataset commit active

新しいデータセットをアクティブな運用データセットに commit します。

完了

4

ifconfig up

Thread インターフェースを有効にします。

完了

5

thread start

Thread プロトコル オペレーションを有効にしてアタッチします。

完了

デバイスが参加して構成されるまで 20 秒ほど待ちます。

6

state

デバイスの状態を確認します。

child
完了

Thread ネットワークは自己構成型であり、これらは Full Thread Device であるため、FTD のいずれかまたは両方が最終的にルーターになる可能性があります。現在のロールは、state コマンドでいつでも確認できます。

Thread デバイス間の通信

ping コマンドを使用して、デバイスが通信できることを確認します。ipaddr を使用して、各デバイスの IPv6 アドレスを取得します。

> ipaddr
fd5c:c6b:3a17:40b9:0:ff:fe00:fc00		# Leader Anycast Locator (ALOC)
fd5c:c6b:3a17:40b9:0:ff:fe00:1800		# Routing Locator (RLOC)
fd5c:c6b:3a17:40b9:84e2:bae8:bd5b:fa03		# Mesh-Local EID (ML-EID)
fe80:0:0:0:c449:ca4a:101f:5d16			# Link-Local Address (LLA)
Done

両方の FTD から、RLOC アドレスを使用して OTBR に ping を送信します。

> ping fd5c:c6b:3a17:40b9:0:ff:fe00:1800
Done
>
> 16 bytes from fd5c:c6b:3a17:40b9:0:ff:fe00:1800: icmp_seq=3 hlim=64 time=30ms
16 bytes from fd5c:c6b:3a17:40b9:0:ff:fe00:1800: icmp_seq=3 hlim=64 time=52ms

成功したレスポンスは、Thread ネットワークが動作しており、デバイスが通信できることを確認します。この手順を繰り返して、OTBR(sudo ot-ctl ping )から各 FTD に ping を送信します。

11. 完了

TI CC2745R10-Q1 ボードで Thread ネットワークを作成しました。

これで、次のことがわかりました。

  • Texas Instruments ot-ti ビルド環境をセットアップする方法。
  • LP-EM-CC2745R10-Q1 LaunchPad に OpenThread CLI バイナリをビルドして書き込む方法。
  • ot-br-posix を使用して Raspberry Pi を OpenThread Border Router(OTBR)として設定する方法。
  • OTBR で Thread ネットワークを作成する方法。
  • デバイスを Thread ネットワークに帯域外でコミッショニングします。
  • ping コマンドを使用してノード間の Thread 通信を確認する方法。

関連情報

openthread.ioGitHub で、次のようなさまざまな OpenThread リソースをご確認ください。