
簡単にUSBホスト機能を自作のプロジェクトに追加できる方法を知ったので紹介したいと思います。
背景
開発中のFamily mrubyというプロジェクトの基板で、PS/2キーボードを使用しているのですが、最近ではPS/2キーボードを購入することもなかなか難しいので、USBキーボードに対応したいと考えていました。
マイコンと連携させやすいUSBキーボード、USB HIDデバイスへの対応方法としては以下のような事例があります。
- Arduino用のUSBホストシールドを使う
- USBにも対応しているPICを使う
USBホストシールドはMAX3421EというICを使用しており、SPIで制御します。
PICを使用する場合、検索するといくつか作例が出てきます。
Family mrubyに搭載しようとした場合、ESP32の空きピンがほとんどないため、SPIで直接制御ができず、間に別の制御マイコンを挟む必要があり、困っていました。一応試作はしてみたものの、まだうまく動かせていないです。
PICの場合は、ソフトの書き込みにライターが必要になるとの、開発環境を整えるのが億劫で敬遠してました。
そんな中、CH559というICがいけてそうという情報を見つけました。
Microcontroller with *two* USB Hosts for $1? Meet the CH559!
I used it to add USB gamepad support to my ESP32 game console. https://t.co/6yJWtwLl0c
CH559というUSBホストコントローラICを使った開発ボード。これを使うとUSBキーボードなどをUARTで読み込めるようだ。 / “CH559 USB Host to UART Bridge Module from MatzElectronics on Tindie” (1 user) https://t.co/6LBOr0K77H
CH559とは
USBホスト(+デバイス)機能を備えたICです。
内部にはE8051が搭載されており、プログラムを書き込んで実行させることができます。(ROM 64KB、RAM 6KB)
ICをUSBデバイスとして認識させることで、ライター不要で、PC直結でソフトの書き込みを行うことができます。
価格はLCSCでひとつ120円程度(10個買いの場合)。(2020/3/14時点)
MAX3421Eと比較すると1/3程度でした。(MAX3421EはDigiKeyで探すと更に高いです)
クロックの外付けなし、プログラムの実行機能までオールインワンなので、安くてお手軽で言うことなしです。
ESP32で色々な作品を作ってる、bitluniさんと、atc1441さんが協力して、使いやすい環境をgithubに提供してくれています。以下の動画を参照ください。
試してみる
実際にLCSCから購入して、実験してみました。
開発環境は、atc1441さんが、githubに準備してくれています。
本家の環境の使い方を把握するには、中国語のデータシートを読み解いたりする必要があってかなりハードル高いのですが、Windowsでコンパイルするために必要なものが一式そろえてくれていて大変たすかります。
GitHub - atc1441/CH559sdccUSBHost: USB host to Arduino Interface with the Cheap CH559 uCUSB host to Arduino Interface with the Cheap CH559 uC - atc1441/CH559sdccUSBHostGitHubデータシートの英訳をしてくれている方もいます。
GitHub - kprasadvnsi/CH559_Doc_English: Documentation for CH559 Microcontroller.Documentation for CH559 Microcontroller. Contribute to kprasadvnsi/CH559_Doc_English development by creating an account on GitHub.GitHub
CH559T on a breakout board
USBのマウスを接続して、入力を読み取った結果をUARTでESP32に送るサンプルを動かしてみます。
Readmeを参考にドライバをインストールして、手元の環境に合わせてバッチファイルを手直しすれば動くかと思います。
Wired CH559
Simple UART test
以下がESP32がUARTで受け取ったログです。
Result of sample code
マウスを接続したところ、ちゃんと入力を拾っていることが確認できました。
ただし本格的に使用する場合、ディスクリプタの解析は更に作り込み必要です。USBのディスクリプタの解析部分は、Arduinoシールドのようにライブラリがあるわけではないので、自分でデバイスに合わせてなんとかする必要があります。このあたりも今後、ライブラリを作る人が増えると、より嬉しいですね。
いずれにせよ、ICとコンデンサ少し追加するだけで、USBデバイスを色々利用できるになるのは大変夢が広がります。
今後は、Family mrubyにPS/2の代わりにUSBコネクタを搭載したものを作成してみたいと思っています。(合わせてFabGLの入力部分の差し替えも行う必要あるので、けっこう大掛かりな修正になります)