MB-S1

◆プリント基板の情報はこのページの下部にあります。

S1でUSBキーボードを使う

 以前の記事でPS/2キーボードを使えるようにしましたが今はUSBが主流。そこで今回はS1にUSBキーボードを接続して使えるようにしたいと思います。

まずはマイコン選び

 毎度のことながら横着できるところはするということで、USBまわりはハードウェアで行ってくれるもの、またUSBホスト機能がついているものをネットで探してみます。

 その結果、USB機能を持つマイコンはいくつか見つかり、その中でお値段と入手しやすさからマイクロチップ社のPICシリーズであるPIC32MXにしました。これは32ビットCPUでインストラクションコードにMIPSを採用しているPICの中では最上位モデルになるそうです。 秋月で購入したのはDIPタイプでプログラムメモリが64KBあるPIC32MX230F064B。


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言語で実装します。とはいえ以前のコードを見ても今一つ理解できない(^^;;;;ので、ここでおさらいをします。

 周辺の回路も変更します。PIC32MXには一部5Vトレラントなピンがあるのですが足らない、のでS1へ送る信号だけ使用し、S1からの信号は10KΩでプルダウンして電圧を下げ普通のピンに接続することにしました。これらのピンはオープンドレインに設定しておきます。

 水晶発振子は12MHzですが、内部クロックはPLLで逓倍して48MHzで動かします。また、デバッグ用にサンプルプログラムで使ったUARTも残しておきます。


回路図(クリックで拡大)

ブレッドボード上に構成

 上記機能を実装してビルドするとプログラムサイズは約36KB。なんだ変換処理は1KB使っているかいないかぐらいじゃないか。そんな心配することでもなかったんだなぁ…。では、これをマイコンに書き込んで実機でテストと行きましょう。

実機でテスト

 S1に接続して電源ON。キーボードとしては認識していますが押したキーと違う文字が表示されます。これは変換テーブルのバグなのでこれを直すと問題なく入力できるようになりました。キーボード側のLEDも問題なく点灯しました。


S1に接続してテスト

 特に問題なさそうなので、この回路をユニバーサル基板で作ります。作る工程は写真を撮るのを忘れたのでバッサリ省略。いや、はんだ付けが下手なので見せたくないだけでしょ(^^;;

 USBキーボード接続時、認識していることをデバッグ用のUARTで確認していましたが、完成版では、ひらがなLED点滅で認識したことを確認できるように変更しました。


ユニバーサル基板をS1に接続

PS/2版より部品が多い

 問題なく動いているようなので、あとはタカチのプラスチックケースに入れて完成。


プラスチックケースに入れて完成

まとめ

 これで、USBキーボードが使えるようになりました。そういえば、ここまでシンプルな日本語キーボードだけで他は試していませんでした。試しにUSBポートのついたMacのキーボードを接続してみると…認識しませんでした。プログラムにUSBハブは除外するような処理があったのでこれが原因かもしれません。USBの仕様をまだあまり理解していないのでこの辺りの対応は今後の課題とします。(おわり)


プリント基板にしました

通常タイプ


通常タイプ

ケースに入れたところ

こちらは表面実装タイプ


表面実装タイプ

ケースに入れたところ

ダウンロード

ソフトウェア (PICマイコン用)

バージョン 0.2

バージョン 0.1

ハードウェア (基板設計データ)

バージョン 0.1.1

バージョン 0.1

これらのデータはGitHub(https://github.com/bml3mk5/USBKeyboard4S1)にもあります。

※試される方は自己責任でお願いします。

◆関連ページ◆

S1でPS/2キーボードを使う

S1のキーボード回路を自作

 

レベル3&S1実機を拡張する

 

TOP PAGE