組込機器に無線インタフェースをつけるのって案外面倒？その4

## ～ 無線ドライバが不要！USB接続タイプ ～

前回はホストCPU側に無線ドライバが必要な環境について、u-blox MAYA-W2を使った実現例を解説しました。今回は「無線ドライバが不要」という更に組込機器にやさしい(?)実現例について解説します。

今回使用した無線デバイスは2.4/5GHzデュアルバンド WiFi6に対応した[NXP社 RW610](https://www.nxp.jp/products/wireless-connectivity/wi-fi-plus-bluetooth-plus-802-15-4/wireless-mcu-with-integrated-radio-1x1-wi-fi-6-plus-bluetooth-low-energy-5-4-radios:RW610)です。この無線デバイスはARM Cortex-M33のCPUが内蔵されているのが特徴で、無線デバイスの設定・制御はこの内蔵CPUから行うため、ホストCPU側では無線ドライバが不要なのです。

そして、今回はRW610が搭載された無線モジュール[サイレックス・テクノロジー株式会社 IM-100](https://www.silex.jp/products/wireless-module/intelligent/im100)の評価ボードIM-100-EVBを使いました。IM-100-EVBにはUSB Type-C、有線LAN(100Base-TX)、GPIOピンヘッダ(Raspberry pi用40ピンGPIO対応）のインタフェースがあり、組込機器とはUSB Type-Cにて接続することになります。機能としてはUART to 無線LANブリッジ機能、有線LAN to 無線LANブリッジ機能もありますが、我々はネットワークI/Fとして使いたいので、USB経由のRNDISを使用します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3032022/c17f9940-37c0-2391-3433-1c76f27053bc.png)

 
サイレックス・テクノロジー株式会社 IM-100-EVB
（出典: https://www.silex.jp/products/wireless-module/intelligent/im100 ）

ホストCPU側はITRONが動く、USBホストI/Fがあるものならなんでも良いです。今回は「担当したエンジニアがすぐに試せるUSB-RNDIS環境がそろっていたから」という理由で、ESPT-SH7673という弊社製の組込基板を使いました。

さて、IM-100-EVBにはUSB Type-Cの口が2つあり、一方がCP2102という独自クラスのUSBシリアル変換のデバイスで、専用コマンドを使ってIM-100の設定・制御を行います。もう一方がRNDISのデバイスで、IPパケットを送受信します。おそらくPCに両方接続して評価することを想定されているものと思いますが、ESPT-SH7673にはUSBの口が1つしかありませんし、あったとしてもCP2102の独自クラスドライバを新規に実装する必要があります。そのため、今回はCP2102側のUSBをPCに接続してあらかじめ設定を書き込んでおき、以後IM-100-EVB を起動させたら直ちに設定されたAPと通信が開始するようにします。RNDISデバイス側のUSBを[ESPT-SH7673](https://www.cente.jp/product/cente-hardware/espt-sh7673/)と接続します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3032022/5da4077f-0ee3-1b7b-43df-70b8491edda7.png)
IM-100-EVB(左下)とESPT-SH7673（左上）およびPCの接続

そして、ホストCPU上のソフトウエアについてです。面倒な無線ドライバは存在せず、UART経由で簡単なコマンドでSSIDやパスワードを流し込んで、実際のIP通信はRNDIS経由で行います。結果、ホストCPU上のソフトウエア構成は以下のようになります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3032022/2462f071-6057-3358-2a9b-874a73923b8a.png)
ソフトウエア構成図

Centeでは上図のRNDISクラスとUSBホストコントローラドライバをパッケージしてご用意しています。ホストCPUがルネサス社のRX71MやSTMicro社のSTM32Fシリーズであれば、すぐにお使いいただけます（その他のCPU向けに有償にて開発もお請けできますので、お気軽にお問い合わせください）。
今回は実装しませんでしたが、組込CPUから無線デバイスの設定を行う場合は上図ソフトウエアの他にUARTドライバとコマンドの送受信を行うアプリケーションが別途必要となります。

今回の環境で動作させるにあたり、RNDISデバイスとして認識させるためUSBベンダID、プロダクトIDは設定しましたが、基本的にはCente USBパッケージを導入するだけで組込機器での無線環境が実現できました。最大の課題の1つだった無線ドライバを考慮する必要がないため、非常に簡単です。

ただ、実際にRNDISでIM-100-EVBを使ってみて気付いた点があります。
・リンク状態の問い合わせに対して、常にリンクアップを返す。
・APとの接続/切断イベントが通知されない。
これだと何が困るかというと、ホストCPU側から見ると常にAPとの接続が確立しているように見えるため、例えばAPと接続が完了していないのにホストCPU側ではDHCPでのIPアドレス取得を開始してしまいます。できればリンクアップ/ダウンのイベント、リンク状態はAPとの接続状態と同期するようにしていただけるとありがたいと考えました。これらについては、サイレックス・テクノロジー社に改善要望点としてお伝えし、今後の機能拡張計画の中で対応検討いただくことになりました。

ここまで「組込機器でWiFi環境を実現する」際に考えること・決めることを解説し、Centeでの実現方法をご紹介しました。ただ、やはりこれも「概要」であり「一例」です。実際の製品開発に対しては説明不足な点、説明とは異なる点が多々あると思います。「この組込機器をWiFiにしたい」という段階から、是非Centeにお声がけください。

Cente：
https://www.cente.jp/
お問合せはこちら：
https://www.cente.jp/otoiawase/

## ■今日の閑話
以前我々は製品にそのまま組み込んでお使いいただくことを想定した名刺サイズのCPU基板[「ESPT」シリーズ](https://www.cente.jp/product/cente-hardware/)を開発・販売していました。しばらくその上でCenteミドルウエアを開発していたため、この「組込機器のファームウエアを書く」環境が普段着のように馴染んでしまっています。そのため、今回のようにホストCPUが何でもよい・USBドライバがもう動いている、となるとEPSTを使うのが一番早いし楽だったわけです。

そして、この環境が便利すぎたため、私は組込機器に関係ないちょっとしたプログラムを動かすときも、ESPTのファームにプログラムを足してESPT上で実行、が普通でした。

それまで組込機器のファームウエアの入れ替えは結構手間がかかるものでしたが、ESPTは[以前の記事](https://qiita.com/Cente_mw/items/465781978ecfe1355bf5)で仕組みをご説明したとおり、PC上でプログラムをビルド→LAN上のESPTの電源オンという手順だけでファームウエアが起動します。まさに「以後ずっと楽をするために今全力を出す」エンジニアの典型ですね。