Relayを使って、USB切り替え機能付きUSB Hubを安価に作った

tl;dr

  • CH334を使うと、レギュレータなしの5V電源と、数個のコンデンサだけで、USB 2.0 Hubを作ることができるよ。
  • USBの切り替え機能もつけたくて、リレーを使ってDM/DPを繋ぎ替えてみたけれど、動いたよ。本来は、USB切り替えICを使うべきだよ。
  • リレーの制御にはCH32V003を使ったよ。5V電源を使うと、GPIOも5Vが出るので、5Vリレーを制御するのに便利だったよ。
  • ディスプレイの裏にUSB Hubをおきつつ、ディスプレイの上に操作盤を置きたくて、CH32V003同士をGroveケーブルで繋いで、I2Cで通信する構成にしたよ

課題感

それまでは市販の2ホスト切り替え機能付きUSB 3.0 Hubを使っていました。主に自作PCとMacBookProにおいて、キーボード、マウス、トラックパッドの接続を切り替えるために使っていました。しかし、課題がありました。

  • SBC(OrangePi+、VisionFive2)など、3つ目の接続が必要になることがあり、そのたびにUSBを接続し直すのが面倒だった。
  • ボタンが装置にしか付いておらず、ケーブルがたくさん刺さった装置を手の届く位置に置く必要があった。
  • LEDでどちらのホストが有効か表示できるが、同じ色のLEDのため、装置に書かれている文字を読まないと、どちらに繋がっているかわからなかった。
  • USB 3.0に対応しているが、メインはキーボード、マウス、トラックパッドの切り替えであり、2.0 どころか 1.0 でほとんど動作していた。
  • USB Type-Aプラグが付いており、USB Type-Cが使えないのが、若干不満だった。

このために、装置のスイッチ部分の配線に改造を加えてディスプレイの端からアクセスできるようにしたり、LEDを取り替えて色を変えて使いやすいようにしていました。

しかし、3つのデバイスを切り替えたいシーンだけはどうすることもできませんでした。

USB 2.0 Hub ならば作れるのか試してみたかった

USB 2.0 Hub ならば、安価にICが出回っていることを知りました。

FE1.1sというもので、LCSCや、aitendo、Aliexpressで購入することができます。

https://www.lcsc.com/product-detail/USB-ICs_Terminus-Tech-FE1-1S-BSOP28BCN_C9359.htmlwww.lcsc.com

インターネット上でもいくつかアマチュアの作例を見つけることができます。ただ、若干データシートが簡素で不安を覚えました。

12MbpsのUSB 1.0ならば自作キーボードやマイコン開発ボードで作っていたため、問題なく作れると思っています。ただし、USB 2.0は480Mbpsもあり、DM/DPの作動回路をきちんと作らないと通信できなさそうに見えました。しかし、ものは試しと作ってみることにしました。

WCH の USB HubコントローラICである CH334 を使う

また、RISC-VマイコンCH32Vシリーズや、USBシリアル変換ICのCH340などでよく使っているWCHからも、USB 2.0 HubコントローラICが出ているのを見つけました。Aliexpressでも購入することができます。

www.wch-ic.com

CH334 industrial grade 4 port USB2.0 high-speed HUB controller 10Pcs/lot - AliExpress

https://www.aliexpress.com/item/1005005274221376.html

価格もCH334Rが10個 USD 4.83 (送料込み)と高くはありません。

CH334はレギュレータも付属しており、5Vを供給して、数個のコンデンサをつければ動くようです。

CH334のデータシートには、なんと周辺回路の回路図まで載っています。これに従って作ってみれば、とりあえず動くものが実現できそうに思えました。

CH334データシートより

USBホストの切り替えにリレーを使ってみる

USBホストの切り替えはどうすれば良いのか調べてみると、アマチュアの作例を以下の3つを見つけました。

  • カニカルリレーを使う
  • アナログスイッチIC(74HC4066)を使う
  • USB信号専用の切り替えICを使う

ネットで検索すると、アマチュアの作例で、メカニカルリレーを使った例、アナログスイッチICを使った例が見つかります。

Stackoverflowで、どのような接続をしたら良いか質問しているページを見つけました。そこでの指摘は、USB信号専用の切り替えICを使うべき、というものでした。

USB信号専用の切り替えICで安価なものは、2ポート切り替えのものが多いことがわかりました。4 ポートにしたいがために、高価はIC使うならば、完成品買った方が良いかと思い、トライしてみたいとは思いませんでした。

www.mouser.jp

そのため、動かなかったらそれでいいやと思いつつ、メカニカルリレーを使った方式を試しに作ってみることにしました。

リレーには2回路入っていて、秋月で買える5Vの941H-2C-5Dを使うことにしました。

akizukidenshi.com

USBデバイス、USBホストのポートの電源保護にCH214K、CH217Kを使う

CH334のデータシートの作例には、USBデバイスポートの電源保護にCH217が、USBホストポートの電源保護にCH214が使われていました。CH214、CH217は以前紹介したUSB電源保護ICです。

74th.hateblo.jp

CH214は500mAの電流を流せるダイオード、リセッタブルフューズとして動作します。CH217は2.7Aまでの指定した電流を流せ、リセッタブルフューズとして動作し、さらに低い電圧しか供給できない場合に、デバイスを壊さないように電流を遮断する機能を持ちます。この2つのICも、AliexpressのWCH公式ショップで購入できるため、取り入れることにしました。

今後作るものも、USBデバイスの電源保護にはCH217を入れるようにしています。

リレーの制御にCH32V003を使う、リモートコントローラとしてもCH32V003を使う

リレーの制御にはCH32V003を使うことにしました。CH32V003は5V電源でも使うことができ、その場合にはGPIOは5Vで動作するため、5Vリレーを制御できます。

そして、当初から作ろうと思っていた機構、離れた位置にコントローラを置けるようにするそのMCUとしてもCH32V003を使うつもりでした。 USBハブ上のCH32V003をI2Cマスター、リモートコントローラのCH32V003をI2Cスレーブとして構築し、Groveケーブルで繋ぎました。

CH32V003をI2Cマスター、スレーブとして使う方法は、ch32v003funを使ってこの機会に確立しました。私が動かしていたコードは以下にあります。

github.com

github.com

構成図を簡単に書くと、下記のようになります。

加えて、今接続しているUSBホストをRGBLEDのWS2812Bで表現しようと思ったため、その制御にもCH32V003を使いました。

で、上手くいったのか?

上手くいきました! 試しに2つ組み立ててみて、両方とも問題なく動作しました。

USB経由でSSDのイメージの書き込みを行ってみましたが、USB2.0で認識し、特に異常なく動くことができました。

ということで、USB2.0であればリレーでもスイッチ制御ができました。

そして、リモートスイッチ部分はディスプレイの上に設置しました。

KicadファイルはGitHubで公開中

今回作ったもののKiCadファイルはGitHub上にアップロードしています。

github.com

GitHubに公開状態で上げておくと、Kicanvasで見ることができて便利です。

回路図 Kicanvas

https://kicanvas.org/?github=https%3A%2F%2Fgithub.com%2F74th%2Frelay-switch-usbhub%2Fblob%2Fmain%2F1.0.1%2Fpcb%2Fusb_relay_hub.kicad_sch

動くことは保証できないけれど、boothにてキット販売中

Relayを使って作った物であり、私の環境では動きましたが、本当に誰の環境でも動くかどうか保証することは難しいと思い、そのような同人商品として Booth で販売中です。 自作PC、MacBookPro、OrangePi5+に接続していますが、特に問題なく期待通り動作しています。 よろしければトライしてみてください。

74th.booth.pm