1. はじめに

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)があります。

学習内容
- 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. 前提条件
ハードウェア
- 3 つの LP-EM-CC2745R10-Q1 LaunchPad ボード: 1 つはボーダー ルーターに接続された RCP として構成され、2 つは Full Thread Device(FTD)として構成されます。
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 である必要があります。 - 3 個の LP-XDS110ET デバッグ プローブ: LaunchPad ボードごとに 1 個。USB 経由のプログラミングとデバッグに使用されます。
LP-XDS110ET は、LP-EM フォーム ファクタの LaunchPad に必要な別の USB デバッグ プローブです。これには、電力プロファイリング用の EnergyTrace のサポートが含まれています。LP-XDS110 は、同じプログラミング機能とデバッグ機能を提供しますが、EnergyTrace は含まれていない、低コストの代替手段です。別の方法として、LP-EM ボードと個別のデバッグ プローブの代わりに、オンボード XDS110 デバッグ プローブ(LAUNCHXL-CC26X2R1 など)を備えた LaunchPad を使用できます。詳しくは、LaunchPad デバッグ接続ガイドをご覧ください。 - LaunchPad ボードとデバッグ プローブを接続して電源を供給するための 3 本のマイクロ USB ケーブル。
- イーサネット経由でインターネットに接続された Raspberry Pi OS を搭載した Raspberry Pi 4B 以降。これは OT Border Router ホストとして構成されます。

- 2 つ以上の USB ポートとインターネット アクセスを備えた Linux または macOS ホストシステム。ビルド環境には、Bash 互換のシェルが必要です。Windows ユーザーは、Ubuntu で WSL2(Windows Subsystem for Linux 2)を使用する必要があります。
- 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 ボードにファームウェアを書き込む場合
- ot-br-posix: https://github.com/openthread/ot-br-posix
- PuTTY(Windows)、minicom(Linux)、screen(macOS/Linux)などのシリアル ターミナル
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ファームウェアを実行します。

各 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
ブートストラップ スクリプトには、cmake、git、wget、標準のビルドツールが必要です。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 を使用して書き込む
- UniFlash を開きます。接続された LaunchPad ボードは、デバイスの自動検出機能により、[Detected Devices] に表示されます。ボードが自動的に検出されない場合は、[New Configuration] をクリックして
LP-EM-CC2745R10-Q1ターゲットを選択し、XDS110 USB デバッグ プローブを選択します。
- [Board 1](
ot-rcp.outでフラッシュされます)を選択し、[Start] をクリックします。 - [Browse] ボタンをクリックして、
ot-ti/build/bin/ot-rcp.outに移動します。
- [Load Image] をクリックしてファームウェアを書き込みます。ログ領域に進行状況が表示され、完了が確認されます。
- ボード 2 と ボード 3 についてもステップ 2 ~ 4 を繰り返し、それぞれ
ot-ti/build/bin/ot-cli-ftd.outを選択します。
代替手段: Code Composer Studio(CCS)を使用して書き込む
Code Composer Studio は UniFlash の代替として使用でき、さらに完全なデバッグ環境も提供します。
- Code Composer Studio をダウンロードしてインストールします。
- XDS110 デバッガを使用して、LP-EM-CC2745R10-Q1 のターゲット接続(CCXML)を作成します。CCS ユーザーガイド: 手動の方法を参照してください。
- CCS ユーザーガイド: 手動起動の説明に沿って、プロジェクトなしのデバッグ セッションを開始します。
- 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 をプログラミングするには:
- UniFlash を開き、[Detected Devices] から LP-EM-CC2745R10-Q1 ボードを選択します。
- HSM プログラミング パネルに移動し、次のように HSM ファームウェア イメージを読み込みます。

- 画面の指示に沿って 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 はシリアル コンソール アクセス用にホスト コンピュータに接続されたままになります。

8. ot-cli-ftd デバイスのシリアル コンソールを設定する
LP-EM-CC2745R10-Q1 は、921,600 ボーで USB 経由でアプリケーション UART を公開します。
次の設定を使用して、各 FTD ボードのアプリケーション UART COM ポート(Windows)または /dev/ttyACM* デバイス(Linux/macOS)にシリアル ターミナルを開きます。
パラメータ | 値 |
速度(ボー) |
|
データビット |
|
ストップ ビット |
|
パリティ |
|
フロー制御 |
|
ヒント(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

ここでは、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 のセットアップ
- Raspberry Pi Imager を使用して、Raspberry Pi OS(64 ビット Lite または Desktop)を SD カードに書き込みます。
- Raspberry Pi を起動し、ターミナルを開きます(SSH 経由または直接)。
- パッケージ マネージャーを更新し、インストール済みのパッケージをアップグレードします。
$ sudo apt-get update $ sudo apt-get upgrade -y
更新後、続行する前に Raspberry Pi を再起動します。sudo reboot
ボード 1(RCP)を Raspberry Pi に接続する
ボード 1(ot-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 を接続する場合は、eth0 を wlan0 に置き換えます(また、Pi が Wi-Fi ネットワークにすでに接続されていることを確認します)。ip link show でアクティブなインターフェース名を確認します。
セットアップ スクリプトは、ソースから ot-br-posix をビルドし、otbr-agent と otbr-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 経由で接続されている場合は、eth0 を wlan0 に置き換えます。
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://)で Thread ネットワークのグラフィカル ビューを利用できます。
OTBR エージェントを停止または再起動するには:
$ sudo systemctl stop otbr-agent $ sudo systemctl start otbr-agent
この時点で、次の 3 つのアクティブなコンソールが表示されます。
- ホスト コンピュータ上の Board 2(
ot-cli-ftd 1)のシリアル ターミナル。 - ホストコンピュータ上の Board 3(
ot-cli-ftd 2)のシリアル ターミナル。 ot-ctl(OTBR/RCP)の Raspberry Pi の SSH またはターミナル セッション。
これで、Thread ネットワークを形成する準備が整いました。
10. Thread ネットワークを作成する
RCP(OTBR)を設定する
Raspberry Pi の ot-ctl シェルから新しい Thread ネットワークを作成します。次のコマンドを順番に入力します。
インデックス | コマンド | 説明 | 想定される回答 | ||
1 |
| 新しいネットワーク構成を作成します。 | 完了 | ||
2 |
| 新しいデータセットをアクティブな運用データセットに commit します。 | 完了 | ||
3 |
| Thread インターフェースを有効にします。 | 完了 | ||
4 |
| Thread プロトコル オペレーションを有効にしてアタッチします。 | 完了 | ||
Thread インターフェースが起動するまで 10 秒待ちます。 | |||||
5 |
| デバイスの状態を確認します。リーダーである必要があります。その他の状態: offline、disabled、detached、child、router、leader。 | leader | ||
6 |
| ネットワーク構成を表示します。実際の値は異なります。チャネル、ネットワーク キー、ネットワーク名、PAN ID をメモします。これらは FTD をネットワークに参加させるために必要です。 | Active Timestamp: 1 | ||
Thread ネットワークに FTD を追加する(アウトオブバンド方式)
帯域外コミッショニング方法を使用すると、ネットワーク認証情報を直接指定できます。各 FTD ボードのシリアル ターミナルで、上記の OTBR データセット出力のチャネルとネットワーク キーを使用して、次のコマンドを入力します。
インデックス | コマンド | 説明 | 想定される回答 | ||
1 |
| OTBR に合わせてチャンネルを設定します。 | 完了 | ||
2 |
| ネットワーク キーを設定します。OTBR のネットワーク キーに置き換えます。添付に必要なのはこのキーのみです。 | 完了 | ||
3 |
| 新しいデータセットをアクティブな運用データセットに commit します。 | 完了 | ||
4 |
| Thread インターフェースを有効にします。 | 完了 | ||
5 |
| Thread プロトコル オペレーションを有効にしてアタッチします。 | 完了 | ||
デバイスが参加して構成されるまで 20 秒ほど待ちます。 | |||||
6 |
| デバイスの状態を確認します。 | 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.io と GitHub で、次のようなさまざまな OpenThread リソースをご確認ください。
- 対応プラットフォーム - OpenThread をサポートするすべてのプラットフォームを確認する
- OpenThread をビルドする - OpenThread のビルドと構成に関する詳細
- Thread の概要 - この Codelab で取り上げる Thread のコンセプトをすべて説明しています
- TI ot-ti リポジトリ - SimpleLink デバイス向けの TI の OpenThread 実装。ビルド手順とリリースノートが含まれています
- CC2745R10-Q1 製品ページ - デバイスのデータシート、リファレンス デザイン、その他のドキュメント
- LP-EM-CC2745R10-Q1 LaunchPad - 評価ボードのユーザーガイドとハードウェア ファイル
- OpenThread CLI リファレンス - OpenThread CLI の概要とその使用方法
- OpenThread CLI コマンド - すべての OpenThread CLI コマンドの完全なリファレンス
- TI E2E Community — Thread & Zigbee - Texas Instruments のワイヤレス接続製品のテクニカル サポート コミュニティ