格安USBホストIC(CH559)を試す
2020-03-15TechCH559, Embedded, Japanese
簡単に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— bitluni (@bitluni) January 5, 2020
CH559というUSBホストコントローラICを使った開発ボード。これを使うとUSBキーボードなどをUARTで読み込めるようだ。 / “CH559 USB Host to UART Bridge Module from MatzElectronics on Tindie” (1 user) https://t.co/6LBOr0K77H
— ina_ani (@ina_ani) February 8, 2020
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でコンパイルするために必要なものが一式そろえてくれていて大変たすかります。
https://github.com/atc1441/CH559sdccUSBHost
データシートの英訳をしてくれている方もいます。
https://github.com/kprasadvnsi/CH559_Doc_English
USBのマウスを接続して、入力を読み取った結果をUARTでESP32に送るサンプルを動かしてみます。
Readmeを参考にドライバをインストールして、手元の環境に合わせてバッチファイルを手直しすれば動くかと思います。
以下がESP32がUARTで受け取ったログです。
マウスを接続したところ、ちゃんと入力を拾っていることが確認できました。
ただし本格的に使用する場合、ディスクリプタの解析は更に作り込み必要です。USBのディスクリプタの解析部分は、Arduinoシールドのようにライブラリがあるわけではないので、自分でデバイスに合わせてなんとかする必要があります。このあたりも今後、ライブラリを作る人が増えると、より嬉しいですね。
いずれにせよ、ICとコンデンサ少し追加するだけで、USBデバイスを色々利用できるになるのは大変夢が広がります。
今後は、Family mrubyにPS/2の代わりにUSBコネクタを搭載したものを作成してみたいと思っています。(合わせてFabGLの入力部分の差し替えも行う必要あるので、けっこう大掛かりな修正になります)
関連記事
直近の活動予定
直近の対外的な活動予定を記載しています。 今後のイベント 特になし (技術書、も ...
独習mrubyバイトコード[SETGLOBAL]
OP_SETGLOBAL Arguments A: レジスタ番号 Bx: シンボ ...
FabGLとmruby-ESP32ボードの構想
(最新状況はこちら) 何気なくTwitterを見ていたら、気になるツイートを発見 ...
技術書典6サークル参加と近況報告
しばらく忙しくて、更新の間が空いてしまいました。 技術書典6にサークル参加します ...
独習mrubyバイトコード[OP_LOADSYM]
OP_LOADSYM Arguments A:レジスタ番号 Bx:シンボル番号 ...
独習mrubyバイトコード[GETIV]
OP_GETIV Arguments A: レジスタ番号 Bx: シンボル番号 ...
ディスカッション
コメント一覧
まだ、コメントがありません