◆プリント基板の情報はこのページの下部にあります。
S1でUSBキーボードを使う
以前の記事でPS/2キーボードを使えるようにしましたが今はUSBが主流。そこで今回はS1にUSBキーボードを接続して使えるようにしたいと思います。
まずはマイコン選び
毎度のことながら横着できるところはするということで、USBまわりはハードウェアで行ってくれるもの、またUSBホスト機能がついているものをネットで探してみます。
その結果、USB機能を持つマイコンはいくつか見つかり、その中でお値段と入手しやすさからマイクロチップ社のPICシリーズであるPIC32MXにしました。これは32ビットCPUでインストラクションコードにMIPSを採用しているPICの中では最上位モデルになるそうです。 秋月で購入したのはDIPタイプでプログラムメモリが64KBあるPIC32MX230F064B。
サンプルプログラムで動作確認
次に開発環境を整えていきます。マイクロチップ社のサイトからMPLAB Xの最新版、そしてサンプルコードが含まれているHarmonyとMLAを入手してPCにインストール。マイコンに書き込むためのプログラマは以前に購入したPicKit3(たぶんパチモン)を使用します。Lチカでとりあえずマイコンが動作することが確認できたところで、サンプルプログラムを試していきます。
サンプルプログラムは、Harmonyに含まれるUSBキーボードからの入力をシリアル端末に出力するもの(apps\usb\host\hid_basic_keyboard)。ソースコードはマイクロチップ社から出ている評価ボード用に作られているので、これの設定に合わせてブレッドボード上に回路を組んでいきます。
このマイコンは3.3V動作、一方、USBデバイスには5Vを供給する必要があるので、5VのスイッチングACアダブタを接続し、マイコンには3端子レギュレータを介して3.3Vを供給するようにします。また、シリアル出力はUARTからFT232でUSBに、それをPCに接続しTera Termで表示させるようにします。
サンプルプログラムのビルドは問題なく完了したもののプログラムサイズが約54KBに。そんなに使うの!?とちょっとびっくり。32ビットマイコン&USBを扱うフレームワークが大きい のが要因のようです。これをマイコンに書き込んで電源ON。USBキーボードを接続すると問題なく認識しました。キーボードを押すとTera Termから文字が出力されます。どうやら正常に動作しているようです。
プログラムサイズを小さくしたい
プログラムサイズがもう少し小さくならないかと最適化オプションを弄るもFree版ではこれ以上は小さくならない模様。そこでMLAのサンプルプログラムを試してみようとするも、こちらはPIC32MX用が用意されていない。うーん、仕方がないので勉強も兼ねてPIC32MXで動くようコードを変更することに。
PIC32MM用のコードを参考にしてなんとか動く形にしてビルドするとプログラムサイズは約40KBとHarmonyよりは小さくなりました。さらに、似た処理をしている関数をまとめたりといろいろ変更して約35KBまで小さくできました。 なお、有償のPRO版が60日お試しで使えるのでこちらでビルドすると約22KBまで小さくなるので、まだまだできそうですが面倒なのでこの辺りで妥協することにしました。
キーコード変換処理を実装
少々前置きが長くなりましたので本題のS1のキーコードに変換する処理へいきます。これは以前作成したPS/2用のアルゴリズムを参考に、MLAのサンプルプログラムに追加していく形でC言語で実装します。とはいえ以前のコードを見ても今一つ理解できない(^^;;;;ので、ここでおさらいをします。
- HPP信号の立ち上がりで割り込み発生。8ビットのカウンタをアップする。ただし、ここでKRES1信号が"L"ならばカウンタの下位4ビットをクリア、KRES2信号が"L"ならばカウンタの上位4ビットをクリアする。ここでカウンタ(スキャンコード)と一致するキーが押されていたらY信号を"L"にする。
- HPP信号の立ち下がりで別の割り込み発生。ここでY信号を"H"に戻す。また、LED信号が"L"ならばカウンタの値に従ってカタ/ひら/CAPSの各LEDを変更する。
- ブレークキーが押されていればBREAK信号を"L"にする。メインループでブレークキーを監視し信号の状態はその都度更新する。
周辺の回路も変更します。PIC32MXには一部5Vトレラントなピンがあるのですが足らない、のでS1へ送る信号だけ使用し、S1からの信号は10KΩでプルダウンして電圧を下げ普通のピンに接続することにしました。これらのピンはオープンドレインに設定しておきます。
水晶発振子は12MHzですが、内部クロックはPLLで逓倍して48MHzで動かします。また、デバッグ用にサンプルプログラムで使ったUARTも残しておきます。
上記機能を実装してビルドするとプログラムサイズは約36KB。なんだ変換処理は1KB使っているかいないかぐらいじゃないか。そんな心配することでもなかったんだなぁ…。では、これをマイコンに書き込んで実機でテストと行きましょう。
実機でテスト
S1に接続して電源ON。キーボードとしては認識していますが押したキーと違う文字が表示されます。これは変換テーブルのバグなのでこれを直すと問題なく入力できるようになりました。キーボード側のLEDも問題なく点灯しました。
特に問題なさそうなので、この回路をユニバーサル基板で作ります。作る工程は写真を撮るのを忘れたのでバッサリ省略。いや、はんだ付けが下手なので見せたくないだけでしょ(^^;;
USBキーボード接続時、認識していることをデバッグ用のUARTで確認していましたが、完成版では、ひらがなLED点滅で認識したことを確認できるように変更しました。
問題なく動いているようなので、あとはタカチのプラスチックケースに入れて完成。
まとめ
これで、USBキーボードが使えるようになりました。そういえば、ここまでシンプルな日本語キーボードだけで他は試していませんでした。試しにUSBポートのついたMacのキーボードを接続してみると…認識しませんでした。プログラムにUSBハブは除外するような処理があったのでこれが原因かもしれません。USBの仕様をまだあまり理解していないのでこの辺りの対応は今後の課題とします。(おわり)
プリント基板にしました
通常タイプ
こちらは表面実装タイプ
ダウンロード
ソフトウェア (PICマイコン用)
バージョン 0.2
- usbkeyboard4s1_020_source.zip (626KB, 2023-10-22)
[MD5:c0b4b9cb68e52035d227e6a996773cba]
バージョン 0.1
- usbkeyboard4s1_010_source.zip (388KB, 2018-02-28)
[MD5:70223acec47c44b6046961af96665499]
ハードウェア (基板設計データ)
バージョン 0.1.1
- usbkeyboard4s1_011_board.zip (6.7MB, 2023-10-22)
[MD5:778346522b7ba140bb044595c5d64971]
バージョン 0.1
- usbkeyboard4s1_010_board.zip (7.9MB, 2023-10-22)
[MD5:92163b0eeeab8a184513035243b71f5c]
これらのデータはGitHub(https://github.com/bml3mk5/USBKeyboard4S1)にもあります。
※試される方は自己責任でお願いします。
◆関連ページ◆