| 開発秘話
本システムの開発は、当初想定していたよりもはるかに困難なものでした。
最初は、手元にあった ATMEGA32U4 を使用して開発を開始しました。
しかし調査の結果、このマイコンのUSBポートはデバイスとしては動作するものの、
USBホストとしては利用できないことが判明しました。
そこで新たに ESP32-S3 を購入し、開発環境を移行することになりました。
■ Arduino IDEからESP-IDFへ
当初は Arduino IDE を使用してESP32-S3のプログラムを作成し、AT-300の制御部分については
比較的短時間で実装することができました。
しかし、YAESU無線機(FT-891)とのUSB接続によるCAT通信がどうしても動作せず、ここで大きな壁に突き当たります。
この問題を解決するため、Arduino環境を離れ、ESP-IDFへ移行。
C++による低レベル制御で、USBデバイスとの直接通信に取り組むことになりました。
■ CP2105ドライバーの自作
YAESU無線機のUSBインターフェースには、Silicon Labs製の CP2105 が使用されています。
しかし、ESP32-S3用のCP2105ドライバーはGitHub上を探しても見つかりませんでした。
そこで最終的に選択したのが、Linuxカーネルのソースコードを参考にする方法です。
Linuxのドライバー(cp210x.c)を読み込み、必要な処理だけを抜き出し、ESP32-S3用に再実装しました。
この作業には約5日を要しましたが、結果としてFT-891とのCAT通信に成功しました。
■ FTDX3000と内蔵USB
HUBの壁
次にFTDX3000での動作確認を行ったところ、さらに大きな問題が発生しました。
FTDX3000では、CP2105の手前にUSB HUBが内蔵されていることが判明し、
単純なデバイス接続では通信できない構造になっていました。
試行錯誤を重ねても、HUBの先にあるCP2105と通信することができず、開発は完全に行き詰まります。
■ HUBドライバーの移植
この問題を解決するため、再びLinuxカーネルに戻り、今度は hub.c を解析。
USB HUB制御に必要な処理をESP32-S3へ移植しました。
USBの列挙、ポート制御、デバイス認識などを一つ一つ確認しながら実装を進めるという、非常に根気のいる作業でした。
■ 諦めかけた瞬間
開発途中、何度も行き詰まり、解決の糸口が見えなくなる場面がありました。
そのたびにChatGPTから「ESP32ではなく、Raspberry Pi 3 や Zero 2W を使った方が簡単ではないか」言われました。
実際、アドバイスとしてもその方向を勧められることが多く、環境を変えるべきか真剣に悩んだ時期もありました。
■ 約30日間の試行錯誤の末に
それでもESP32-S3での実現にこだわり、試行錯誤を続けた結果、
約30日間に及ぶ開発の末、FTDX3000でも正常に動作するドライバーが完成しました。
■ 振り返って
今回の開発は、
- USBホスト制御
- Linuxカーネルの解析
- デバイスドライバーの移植
- 状態機械による制御設計
といった、組み込み開発の中でも非常に深い領域に踏み込むものでした。
結果として、ESP32-S3単体でYAESU無線機とアンテナチューナーを連携させる、
完全スタンドアロンの制御システムを実現することができました。
この経験は、非常に大きな技術的財産になったと感じています。
|