過去、PS/2マウス、キーボードをArduino Nanoを介して98に接続してきました。プロトタイプ機まで作り問題なく動作しています。
今回は、最終の目標であるUSBキーボード、マウスを98に接続したものです。一応目標として
- EPS32を一つでマウス・キーボードを変換
- USBワイヤレスキーボード、USBワイヤレスマウスをつないでワイヤレス化
- セットアップメニュー起動、24/31KHz起動など98特有の起動に対応
- CAPS、カナ、NumLkのLEDの実装
です。
マイコンの準備
今回利用するマイコンはNanoではなくESP32を使います。PSRAMとか不要なのでスタンダードなESP-WROOM-32です。
Auto Amazon Links: プロダクトが見つかりません。
ESP-WROOM-32であればTypeCだろうが、MicroUSBだろうがなんでもいいと思います。ただしスケッチを書き込むときに自動書き込みがうまく働かない機体があるので確認したほうがよいです。もし自動書き込みができないものをつかまされたときは
を参考に、誤家庭に転がってるコンデンサをつけてみるとうまくいきます。
この投稿をInstagramで見る
USBホストシールドの準備
ESP32には直接USBを接続できないのでUSBホストシールドを接続して制御できるようにします。USBホストシールド自体はArduinoに接続するものが多いですがESP32にも接続できます。通常サイズのUSB ホストシールドは大きすぎます
Auto Amazon Links: プロダクトが見つかりません。
基本、シールドというのは、Arduinoのピンヘッダに重ねて使うことを前提としているので接続するマイコンのサイズに合わせられています。今回はProMicroに接続するミニUSBホストシールドを使おうと思います。そうすれば小型化が可能です。
ちょっと値段が高めですね。AliExpressで買ってもいいと思います。アマゾンのレビューを見ればわかりますが、この商品は改造しないと使えませんので安いやつを複数個買っといたほうが無難です。失敗対策ですねw。使い方は以下のサイトが参考になります
ホストシールド自体はロジック電圧3.3Vですので同じロジック電圧のESP32とは接続が容易です。
参考サイトの抜粋です。上を参考にESP32と接続します。
注意点は、アマゾンレビューや参考サイトで述べられていますが、このシールド、USB部に供給する電圧が5Vでなく3.3Vであることです。通常USB機器は5Vなので電圧不足です。なぜこういう仕様になったのか…不思議です。というわけで3.3Vを供給するパターンをカットして5VをVBUSに供給してあげる必要があります。ミニUSBホストシールドのRAWは、どこにも接続されていないので、RAWとVBUSをバスパスしてRAWピンに5Vを供給してやればよいとのことです。
参考サイトを熟読してESP32と結線すればOK。配線カットをちゃんとしないと5VがUSBホスト制御のICに流れ込んで破損するので確認しながら行ってください。次にUSB Host Shield Library 2.0をインストールしてサンプルコードを動かしてチェックを行います。
USB Host Shield Library 2.0インストとサンプルの動作
上からZipをDLしてライブラリに入れてもよし、Arduino IDEのライブラリマネージャからインストールしてもよしです。
ライブラリのインストールは上記のような各種サイトで説明されていますので詳細は割愛します。
次にサンプルコードを動かしてみます。example/HIDの中にあるサンプルスケッチを利用していきます。
USBHIDBootKbd.ino | キーボード用(一応ハブ対応) |
USBHIDBootMouse.ino | マウス用(一応ハブ対応) |
USBHIDBootKbdAndMouse.ino | 複合デバイス(キーボード・マウスが1ドングルになっているような)対応用 |
USBHIDMultimediaKbd.ino | 非対応デバイスのひな形みたいなもの |
とザックリ考えてた方がよいです。色々試してみました。ほとんどの機器は接続できるんですが汎用で作るには難しく各HIDUSB機器毎にコードを書く必要があると思います。ドライバを書いているような感じですね。
とりあえず、複合デバイスで、うまくいった製品がありましたので、それで行きたいと思います。
上の商品がうまくいきました。USBドングルをHost Shieldにつけます。USBHIDBootKbdAndMouse.inoを動かしてみます。そのまま動かしてもいいのですが、注意事項として、USBHIDBootKbdAndMouse.inoではHIDBoot(各デバイス用クラス)でHidComposite、HidKeyboard、HidMouseが宣言されています。HidComposite、HidKeyboard、HidMouseにはすべてレポートパーサー(データを受け取ったときに処理するクラス)がセットされていますが、複合デバイスを純粋に認識する場合はHidCompositeのみでいいので、HidKeyboard、HidMouseは不要です。キーボードだけ動いてマウスが動かないという症状はHidKeyboardからパーサーが呼び出されておりHidCompositeは何も働いていない状態と思います。「複合デバイスも対応させる」という感じの仕様と思いますが、問題の切り分けがしにくくなるのでコメントアウトした方がよいです。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 |
~ 略 ~ USB Usb; USBHub Hub(&Usb); HIDBoot < USB_HID_PROTOCOL_KEYBOARD | USB_HID_PROTOCOL_MOUSE > HidComposite(&Usb); //HIDBoot<USB_HID_PROTOCOL_KEYBOARD> HidKeyboard(&Usb); //HIDBoot<USB_HID_PROTOCOL_MOUSE> HidMouse(&Usb); KbdRptParser KbdPrs; MouseRptParser MousePrs; void setup() { Serial.begin( 115200 ); #if !defined(__MIPSEL__) while (!Serial); // Wait for serial port to connect - used on Leonardo, Teensy and other boards with built-in USB CDC serial connection #endif Serial.println("Start"); if (Usb.Init() == -1) Serial.println("OSC did not start."); delay( 200 ); HidComposite.SetReportParser(0, &KbdPrs); HidComposite.SetReportParser(1, &MousePrs); //HidKeyboard.SetReportParser(0, &KbdPrs); //HidMouse.SetReportParser(0, &MousePrs); } ~ 略 ~ |
これでバッファローのBSKBW125SBKのマウス・キーボードからデータを受信できるはずです。
ちなみにほかのキーボード・マウスの複合デバイスが全部これで対応できるわけではありません。同一メーカーであるバッファローコクヨサプライのBSKBW07シリーズは接続しても沈黙を貫きました(笑)。
この商品はこのコードでは対応できないのでUSBHIDMultimediaKbd.inoをベースとしたコードで対応することになります(後日別記事にて)。
ここで、様々なHIDUSB機器の認識について書くとPC-98との接続との話まで永遠に行きそうにないので、使用機材は、このバッファローのBSKBW125SBKの複合デバイス決め打ちで話をすすめます。
長くなりそうなので記事を改めます