アンテナの調整をする場合、給電点 (測定点) と調整点は離れていることが多いなというコンテキストで、NanoVNA の Bluetooth シリアル化を試すというのを前にやりましたがイマイチで、実用に及びませんでした。なので別の方法を検討します。

「古いスマフォでUSBシリアルを中継したほうが」と前述のエントリで書いていましたが、ESP32 で Wi-Fi AP にする方法をやってみたかったので試してみました。

構成

  • USB Host (CDC デバイスをUARTにする)
  • 無線インターフェイス (Wi-Fi)

NanoVNA とは USB 接続して、スマフォから Wi-Fi で繋ぐと計測結果が見れるようなイメージのものです。なので本体への改造はありません。

アーキテクチャ

既存の資産 (NanoVNA-WebApp) をそのまま生かしたいため、USBシリアル通信層を置き換えて Wi-Fi 経由にするイメージにします。双方向の小さなパケットのやりとりなので、自然と WebSocket を想定し、これにそのままシリアル通信を乗せます。こうするとクライアントの多重接続はできませんがとりあえず考えないことにします。

作成

USB ホスト CDC と UART の中継

まずは USB CDC のホストになれるデバイスを作ります。ESP32 は直接的に USB Host になるような機能・実装はないため、別の MCU を使います。

STM32F4 系は USB Host になれるようになっており、WeAct MiniF4 という小さいボードが安価 (400円ほど) で Type-C コネクタ付きで販売されているので、これを利用します。

特に難しいことはせず、USB CDC と UART を中継する役目だけをさせます。面倒だったので CubeMX の生成コードを活用して実装しました。

この段階のデバッグはまた別途 USB Serial デバイスを使ってやりました。UART を中継するという役目だけなので、独立したコンポーネントになっておりデバッグは楽です。これが SPI 中継だとさらにややこしくなるので、UART で中継というのはスピードが出ない以外は良い選択だと思います。

UART のボーレートは 4M baud です。4M baud / (8 bit +1 stopbit) = 444444 bytes。444kbytes/sec です。これは CPU の HCLK が 64MHz で、PCLK1 (APB1 clock) が 32MHz であることからくる最大の制限です。PCLK1 はこのデバイスの UART2 のベースクロックで、UART2 を8倍のオーバーサンプリングにしているため、4M baud が最大クロックとなります。HCLK は実はもう少し早くできるのですが、デバッガの関係で 64MHz にしています。実用上は 4M baud で十分に感じます。

なお RTS/CTS によるハードウェアフローコントロールを有効にしています。これがないとデータ抜けが発生したりしてややこしいです。

Wi-Fi インターフェイス

UART と WebSocket の中継

あとは ESP32 上でいろいろと実装を作ります。ESP32 はかなり高級なMCUなので、ゴリゴリ処理を書いてリソースを書きこんでいけます。

まずは WebSocket に UART を中継する実装を行いました。開発PC側ではさらにターミナルと WebSocket を中継するような実装を node.js で書き、まずこれで WebSocket 経由で NanoVNA のシェルを不自由なく使えるレベルにしました。

ちなみに、この段階では家庭内の Wi-Fi ルーターに接続するコードにしておき、いちいち AP を繋ぎなおすようなことはしていません。

シェルぐらいなら WebSocket・Wi-Fi 経由で問題なく動くぐらい安定して動くことが確認できたので次の段階を作りはじめました。

ウェブインターフェイスの実装

前述の通り、NanoVNA-WebApp を生かすように WebSocket でシリアル通信を行うような実装を追加しました。まだここでは、いちいち書きこんでデバッグするようなことはせず、コンテンツ配信のウェブサーバは手元で起動し、WebSocket のみを ESP32 で処理するようにしてデバッグしました。ウェブアプリのデバッグとプロトコルの中継をわけて実行できるので割と開発しやすいです。

手動で操作するシェルと違い、自動的にゴリゴリシリアル通信をしはじめるとタイミングの競合などが出てくるので、それらを潰していきました。

Capative Portal 化

Wi-Fi の AP としてアクセスできるのはいいとして、AP 接続後にいちいちブラウザを開いて特定のアドレスを入力するというプロセスがだるいです。

Wi-Fi 接続時に OS のログインダイアログを出させる方法 (Captive portal) というのを書きましたが、この方法だと Wi-Fi 接続と同時にウェブアプリを起動させることができて便利になります。実際の動作状況は以下の通り

esp32 には mDNS サーバの実装はあるものの、DNS サーバーの実装がないため、独自に簡単なものを実装しました

今後の課題

  • ちゃんとケースに入れて実用できるようにしたい
  • 電源
    • USB Host は NanoVNA 側にも電源供給源になる必要があり、要求電流量が多い
    • 電圧降下すると NanoVNA が起動しなかったりするので工夫がいりそう
  1. トップ
  2. tech
  3. NanoVNA のリモート化 (Wi-Fi 中継)

TDR (Time Domain Reflectometry) はともかく、TDT (Time Domain Transmissometry) の使い道がよくわからなかったので調べていた。

TDRの横軸と縦軸

  • 横軸は時間
  • 縦軸はその時間における反射係数。または反射係数から導きだせるもの

特定の箇所のインピーダンスだとかSWRがわかる。

TDTの横軸と縦軸

  • 横軸は時間
  • 縦軸はその時間における透過係数。または透過係数から導きだせるもの

例えば透過係数の大きさをとれば、どのタイミングで信号が伝わってきたかがわかる。もしマルチパスがあるような伝送経路だとそれぞれが可視化される。

TDR と TDT

このスクリーンショットは、青色が TDT、黄色が TDR を表示している。単に VNA の入出力に 2m の同軸ケーブルを繋いでいる (ダイナミックレンジが高くないとわかりにくいでのS-A-A-2 でのスクショ)

  1. TDT は片道なのでまず最初に(0sに近いほうで)現われる。そしてVNAの入力ポートで一部は反射されて戻っていく
  2. TDR 側は戻ってきた反射を観測する。そしてVNAの出力ポートで一部は反射されてまた戻っていく
  3. TDT はまた出力ポートから反射されてきた信号を観測する

という挙動がわかる。キーサイトの時間領域透過率測定の項目 だとトリプルトラベルパスと書いてある。

光速で伝達する波がしっかり往復しているのをぱっと観察できて面白い。

ref

  1. トップ
  2. tech
  3. VNA の TDR と TDT

Aliexpress を徘徊していたらそういうものが出ていたので買ってみた (400円ほど)。これ元ネタはおそらく SDRKit のVNWA Testboard kit というものだと思う。

自分が手に入れたものは以下のセットであった

  • 基板 (PWB)
  • 49.9Ωチップ抵2抗 * 2 0805
  • 丸ピンヘッダ
  • SMA メスエッジコネクタ * 6
  • ナット・ビス 4セット

フィルタ用のパターンがあるが今のところ使う予定がないのでコネクタも実装してない。

冒頭の写真はわざと誘導性の非連続を作って観察してるところで、教科書通り?の波形が見えて結構おもしろい。

  1. トップ
  2. tech
  3. NanoVNA Test board kit というやつ

無料 Wi-Fi なんかでよくある、接続時にログインさせられるやつ。あれの名前は Captive portal というやつらしい。各OSともにこれを検出したときはログインダイアログを表示するような実装になっている。

Captive portal が出る条件は (OSによって違うだろうけど)

  • OS 側が用意するドメインへの http アクセスをリダイレクトすること

のようだ。OS側が用意するドメインとは例えば

  • captive.apple.com (macOS)
  • connectivitycheck.gstatic.com (Android)

みたいなやつ

やることとしては

  1. DNS サーバを立てる。全ての A レコードクエリに対し captive portal の IP アドレスを返すようにする
  2. DHCP の DNS サーバに自分の IP アドレスを指定
  3. captive portal は HTTP サーバを立て、自分以外のホストへのリクエストをすべて自分のホストへリダイレクトする

これで macOS と Android でダイアログが出ることは確認した。

メモ

自力で DNS Server を実装するとOSの違いに気付くことがある

  • macOS は DNS response に QUERY が含まれていなくても (ANSWER だけで) 認識する
  • Android は DNS response にQUERY が含まれていないと認識しない
  1. トップ
  2. tech
  3. Wi-Fi 接続時に OS のログインダイアログを出させる方法 (Captive portal)