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を取り替えて色を変えて使いやすいようにしていました。
使っていたUSB切り替え機のボタンがすごく押し辛いので、スイッチの部分引っ張り出して、キーボードスイッチつけた。Durock T1 FullPOMになってすごく感触良くなった。 https://t.co/aDm6E5DaGk pic.twitter.com/4QcKhlL5kM
— 74th (@74th) December 25, 2021
しかし、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でも購入することができます。
CH334 industrial grade 4 port USB2.0 high-speed HUB controller 10Pcs/lot - AliExpress
価格もCH334Rが10個 USD 4.83 (送料込み)と高くはありません。
CH334はレギュレータも付属しており、5Vを供給して、数個のコンデンサをつければ動くようです。
CH334のデータシートには、なんと周辺回路の回路図まで載っています。これに従って作ってみれば、とりあえず動くものが実現できそうに思えました。
USBホストの切り替えにリレーを使ってみる
USBホストの切り替えはどうすれば良いのか調べてみると、アマチュアの作例を以下の3つを見つけました。
- メカニカルリレーを使う
- アナログスイッチIC(74HC4066)を使う
- USB信号専用の切り替えICを使う
ネットで検索すると、アマチュアの作例で、メカニカルリレーを使った例、アナログスイッチICを使った例が見つかります。
Stackoverflowで、どのような接続をしたら良いか質問しているページを見つけました。そこでの指摘は、USB信号専用の切り替えICを使うべき、というものでした。
USB信号専用の切り替えICで安価なものは、2ポート切り替えのものが多いことがわかりました。4 ポートにしたいがために、高価はIC使うならば、完成品買った方が良いかと思い、トライしてみたいとは思いませんでした。
そのため、動かなかったらそれでいいやと思いつつ、メカニカルリレーを使った方式を試しに作ってみることにしました。
リレーには2回路入っていて、秋月で買える5Vの941H-2C-5Dを使うことにしました。
USBデバイス、USBホストのポートの電源保護にCH214K、CH217Kを使う
CH334のデータシートの作例には、USBデバイスポートの電源保護にCH217が、USBホストポートの電源保護にCH214が使われていました。CH214、CH217は以前紹介したUSB電源保護ICです。
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を使ってこの機会に確立しました。私が動かしていたコードは以下にあります。
構成図を簡単に書くと、下記のようになります。
加えて、今接続しているUSBホストをRGBLEDのWS2812Bで表現しようと思ったため、その制御にもCH32V003を使いました。
で、上手くいったのか?
上手くいきました! 試しに2つ組み立ててみて、両方とも問題なく動作しました。
これは本当に自分の作りたかったもの感あって満足度が高い。
— 74th (@74th) September 9, 2023
・4ポートUSB Hub
・USBホスト4切替
・全部Type-C・LEDの色でホストが表示されて視認性が高い
・自作キーボードスイッチ使用
・離れた位置に置ける切替コントローラ https://t.co/wu0rY8x0Dr pic.twitter.com/uNaY76RYsV
USB経由でSSDのイメージの書き込みを行ってみましたが、USB2.0で認識し、特に異常なく動くことができました。
ということで、USB2.0であればリレーでもスイッチ制御ができました。
そして、リモートスイッチ部分はディスプレイの上に設置しました。
いったん基板むき出しで、モニター上部に設置しました。
— 74th (@74th) August 31, 2023
ケースはJLCPCBに発注済み。 https://t.co/7cbg2lKMKD pic.twitter.com/oeT7p8HWUL
KicadファイルはGitHubで公開中
今回作ったもののKiCadファイルはGitHub上にアップロードしています。
GitHubに公開状態で上げておくと、Kicanvasで見ることができて便利です。
回路図 Kicanvas
動くことは保証できないけれど、boothにてキット販売中
Relayを使って作った物であり、私の環境では動きましたが、本当に誰の環境でも動くかどうか保証することは難しいと思い、そのような同人商品として Booth で販売中です。 自作PC、MacBookPro、OrangePi5+に接続していますが、特に問題なく期待通り動作しています。 よろしければトライしてみてください。