カテゴリー「パソコン」の1件の記事

2015年6月25日 (木)

小型USBキーボードは自作できるのか下調べをしてみる

HP200LXのキーボードの打ち心地がいまだに忘れられなくて、

HP200LXのキーボード部分の構造を用いた(模倣した、継承した)USBの小型キーボードが欲しい!、と前に書きましたが(過去のblog記事:こんな小型キーボードが欲しい!)、自分好みの物が市販されていない以上、無いものは自分で作る、欲しいものは自分で作る、の精神で行くと、まずは自作してみるしかない、という方向に向かうことになります。

そこで、もし、自分が欲しいと思っているキーボードを自作するとしたら、何が必要なのか、を、ちょっくら調べてみました。

基本的には関連するキーワードでググりまくって、情報を集めて行きます。
はっきりいって、私、素人です。
かなーりてきとーですがご容赦ください。

まず、USBキーボードは自作できるのかという問題。
USB キーボード 自作」で検索するだけで、かなりの数が出てきます。
ちゃんと完成させている人が多いことから、どうやら自作は可能なようです。

次は部品、特にキーボードの中枢になるワンチップマイコン。
(マイコンと言えばむかしのPC-8001やFM-7やMZシリーズを思い出すおっさんです。自分はPC-6001を所有していてベーマガのBASICのリストを手打ちしてゲームを遊んでたりしてました)

市販のキーボードをバラして、中の基板を流用することも考えましたが、私が今欲している小型キーボードの場合、流用しようにも「自分が必要とするキーが付いていない」「自分があまり必要としないキーをFnキーとの同時押しに逃がしたい」等々の制約があり、それらキー配置などが完全に合致する市販キーボードが皆無なことから、既成のキーボードの基板の流用は見送ることにしました。
(標準的な配列で標準的な大きさのキーボードを自作するのなら、市販のキーボードの中身を流用したり、キットを購入するのが一番手っ取り早いです)

ワンチップマイコンは昔と比べてとても便利で扱いやすくなってたんですね。
汎用I/O内蔵でピンの入出力を自由に設定可能とかA/Dコンバータ内蔵とかPWM出力可能とか、良い時代になりました。

今の電子工作で使うマイコンチップは、どうやら「PIC」と「AVR」あたりが基本のようですね。

今回、USBキーボードやUSBマウスの機能を実現させるために、チップ内にUSB機能が内蔵されているほうがよろしい。
そうなると、PICだと「PIC18F2550」「PIC18F4550」や、AVRだと「ATmega32U4」 あたり?
USBキーボードやマウスなどのUSBの入力機器では「USB HID」という規格がありまして、
USB付きのPICもAVRも、どちらもUSB HIDのライブラリがあるっぽいので、ソフトを組む労力が軽減されそうです。

そんでもって、今、考えているのは、AVRを用いたオープンソースハードウェアのマイコンボード「Arduino」シリーズで、USB搭載の「ATmega32U4」を積んだタイプを使おうかと。
PICはプログラムの書き込みに専用のライターが必要になりますが、「Arduino」ならPCとUSBケーブルで直繋ぎでプログラムの書き込みが行えること(これ、けっこう重要というか手探りで作るのにとても便利)と、今現在は「Arduino」のほうが流行ってるっぽいので、新しい情報が手に入りやすそうなこと、「Arduino」の統合開発環境「Arduino IDE」に「USB HID」の関数群が既に有り、「Arduino」の本家 http://www.arduino.cc/解説したページまであるため、ほぼ初心者の私でもハードルが低そう、などを決め手にしました。

Arduino ATmega32U4」で検索すると「Arduino Micro」や「ダ・ヴィンチ32U」が出てきました、キーボードくらいの大きさの物を作るにはちょうど良さそうです。
USBまわりのソフトウェアに関しては、さらに情報を集めるために、同じくATmega32U4を使用している「Arduino Leonardo」も参考になるので、「Arduino Leonardo USB HID」あたりの文字列でも検索をかけるとよろしいかと。
スイッチサイエンスさんの「Arduino Leonardoへのガイド」にUSB内蔵のArduinoの注意が書かれています。

続いて、これに繋ぐ物理的なキースイッチとマウスポインタですが、「Arduino」の本家のページ http://www.arduino.cc/ の 「Mouse and Keyboard libraries」に関数の詳細、Examplesに簡単な接続方法とサンプルプログラム(スケッチって言うんでしたっけ?)が掲載されています。至れり尽くせり。

ポインティングデバイスですが、アナログ値をA/Dで読みとるのであればX-Yの座標を抵抗値の変化で示す部品「アナログジョイスティック 部品」で出てくるパーツが直付けできそうですね。
トラックボールはパルス出力でしょうから、その信号形式などを読み取って数値に変換してやるプログラムを追加してやれば良さそうです。
超小型トラックボールモジュール」で検索すると出てくる、小型基板にひっついたトラックボールは、ブラックベリーで使われていたトラックボールと同じ仕組みのホール素子(磁気センサ)を使った物です。この超小型トラックボールのパーツはどうやら販売終了っぽいのですが後続品があります。
実は調べていたら、Macintoshの「マイティマウス」のスクロールボールが、どうやら同じ仕組みっぽいので、中古を購入してバラして流用してみるのも手かもしれません。

肝心のキーボード部分ですが、今回の私が欲しいと思っているキーボードでは80keyもありまして、I/Oポートが足りません。Arduino はI/Oが20pin。

キーボードのスイッチ入力には古くから「キーマトリクス」という手法があって、これを使用します。
キースキャンの出力側に汎用ロジックICのデコーダ 3 to 8 line decoder74HC138を使えば使用するピン数を減らせそうです(出来る?) HCはCMOS、74HC138」は出力が負論理(ローアクティブ Active Low)74HC238なら出力が正論理(ハイアクティブ)
負論理の74HC138は使えないっぽい?!試しに74HC138で回路を組んでみたら、同じライン上のキー同時押しが読めかった!(多分、電流逆流防止(電流の引き込み抑制)用のダイオードを入れれば正常に動く、かも?)
正論理の74HC238に交換したら、正常に動きました。ほっとひといき。
DIP(ゲジゲジ)もSOP(ひらべったい)もあるのでよさげです。
これでも足りなければ、4-16 デコーダの、74HC154で。
74HC154は入手困難っぽいです。
74HC138を複数使えばピン数を増やせるけれど、チップが増えちゃうのは困りもの、でも無い袖は振れない。
他の人はシフトレジスタを使ってるので74HC16474HC595を連結するのがいいのかも。データ線とクロックだけで済むし。使用例も多いし。オススメかも。

問題なのは誤入力防止のダイオードとキーマトリクスの配置。マトリクスの配置には何か法則性があるのだろうかと調べてみたけれど分かりませんでした。

なぜダイオードが必要なのかは「キーマトリクス ダイオード」で検索すると出てきます。
押されていないキーが押されていると認識されてしまうゴーストキーの対策。

なんか、ダイオードを入れずにマトリクス上のキーの配置と読み込みルーチンを工夫して対処しているような雰囲気も・・・
このへんの配線は要検討というかもっと調べるか作りながら決めていくかしかなさそうです。

あと、キーボードに「Num Lock」「Caps Lock」「Scroll Lock」のLEDを付けたいのですが、これらのLEDは実はPC本体からの信号で点灯してたりします。
この機能をArduinoに行わせる方法ですが「Arduino HID KEYBOARD LED」で検索して出てくる
Topic: Leonardo keyboard leds emulation? - Arduino Forum」でパッチを当てた人が居るので参考に。

あとは、Arduinoに実装される USB HID は、ちょっと特殊というお話を ksmakotoさんが「Arduino leonardoはUSB機器としてちょっと特殊だ、という話」で書いていらっしゃるので、一度読んでおくとよろしいかと。
USB HID 複合デバイス arduino」も検索して、現在色々と勉強中です。

※素の状態だと「Boot Interface」として使用できない(システムが起動するまで使えない?)ような感じ?もしBIOS等でも使えるような素直なキーボード&マウスにするためには書き換え必須な雰囲気?それともなんか大丈夫っぽい?USBの仕様書をもっと読まないと。えいごめんどくさい

USBキーボードが送信するキーコードは「Universal Serial Bus HID Usage Tables」のp53からと、「USBキーボードのキーコード」に記載があります。

Universal Serial Bus HID Usage Tables」で日本語キーボードに特有のキーを表している p60 の Footnotes 15-20 の表が、最初は?だったのですが、Usage Name の右肩の数字と対応してるとやっと気がつきました(以下の追加の脚注を見ろや!って書いてあるよ・・・ちゃんと読まにゃ)。DOS/V-109 の「¥」のキーのNote17は、Keyboard International 3(17) の「17」、つまりキーコードは89。
確かに「USBキーボードのキーコード」で「¥」は Keyboard International 3 でキーコードは 07 / 89 (07はキーボード)になってます。
日本語キーボードを作る方は参考にしてください。
ちなみにArduinoの素のUSB HID ライブラリではキーコードが101までしか送信できないそうで。101より先のキーコードに割り当てられている「¥」などを送信するには、HID.cpp の HID report descriptor を書き換える必要があります。

Arduino IDE」をインストールした場所の Arduino\hardware\arduino\avr\cores\arduino の中にある「HID.cpp」と「USBAPI.h」を書き換えると、USB関係の機能追加や変更が出来るっぽいです。「HID.cpp」と「USBAPI.h」の素のソースと、機能の追加で変更後のソースを読むと、何やってるのか分かります

例えばですが、「HID.cpp」の素のソースを覗くと、「Keyboard.press()」関数の、Shiftキーが押された状態で入力されるであろう文字の処理や、USB HIDキーボードのReportで特別扱いになっている修飾キー(modifier Key :左右のCTRL,SHIFT,ALT,GUIキー)の処理とかが書いてあります。

Arduino IDE の 1.6.x の後半と、1.8.x では、Arduino\liblaries\ の Keyboard と Mouse に、ライブラリの形で分離されています。src の中の、*.h と *.cpp を読んでみてください。

USBのHIDデバイスの解説は「USB.org」の「HID Information」にあります。
Device Class Definition for HID 1.11
HID Usage Tables 1.12

 

なんとなく、回路構成は、こんな感じになりそうな予感。
まだ全くの仮です。組んでみないと動くかわかんないし。
(クリックで拡大します)

Photo

追記:2015/10/29
ネットを検索して見て回っていたところ、次のファイルを見つけました。

USB and PS/2 Multimedia Keyboard Interface Designer - Reference Manual
http://cache.freescale.com/files/microcontrollers/doc/ref_manual/DRM014.pdf

これは、 Freescale社の 68HC08 というマイコンチップを使用してPS/2 & USBキーボードを構成するための、リファレンスボードのマニュアルです。
これには、USBキーボードとして動作させるための回路構成、具体的なキーマトリクス、フローチャート、マルチメディアキーのUSBでの扱い、等が書かれています。

※これに記載されているキーボードマトリクスなのですが、私の手元にあって分解した無名メーカー製のUSBキーボードのキーマトリクスとかなり似通っていました。全く異なる2個をバラしたのですがその2個が全く同一のマトリクスで驚きました(但しメンブレンシートの配線のパターン図は異なってました)
もしかしたらですが、今出回っているUSBキーボードに使われているいくつかのマイコンチップとそれのファームウェアは、このリファレンスの68HC08とソースを使っているか、またはセカンドソースか、互換品か、または他のチップに置き換えたコピーだったりするのかもしれませんね。あくまで想像ですけれど。
今のほとんどのUSBキーボードの中の制御チップは、チップ表面の刻印が無くて不明だったり、COB実装(Chip on board、半導体チップをそのまま基板に載せて配線して上から黒い樹脂をかぶせちゃう)なので、中身までは分からないのですよね。

このリファレンスボードの、ファイルの参照元になるページはどうやら無くなっているようなのですが、

HC08K: 8-bit USB K MCUs
http://www.freescale.com/products/more-processors/8-bit-mcus/hc08/8-bit-usb-k-mcus:HC08K

の、Software & Tools に、

USB Hub Keyboard Reference Design
http://www.freescale.com/products/more-processors/8-bit-mcus/hc08/usb-hub-keyboard-reference-design:RD68HC08USBHKEYBD

を見つけました。どうやらこちらが現行のページっぽいです。
これは、USBのHUB及びUSBキーボードのリファレンスと開発ボードで、USBキーボードの部分は上記 DRM014.pdf の内容が含まれています。

Documentation に、リファレンスマニュアルのPDFがあります。
USB Hub Keyboard for the MC68HC08KH12 Designer - Reference Manual
http://cache.freescale.com/files/microcontrollers/doc/ref_manual/DRM015.pdf

そして、Software & Tools からは、回路図とソースファイル一式がダウンロード可能になっています。

やった!ソースファイルが手に入った!、これで具体的な処理内容が分かる、特に不明だったゴーストキーの対処法が分かるぞ!、と思ったのですが、

プログラムはアセンブリ言語で書かれていました。当然ですが。

68HC08 のアセンブリ言語なんて読んだことないし(Z80なら学生の頃にかじったのですが)ニーモニックやらレジスタやらアドレスやら定義されているラベルやら訳分からん状態です。

解読するしか無いかなぁ、、、68HC08って、どうやらMC6800 の系統らしいのですが、、、

追々、調べますか。

以上、追記終わり。

 

さて、今後、色々そろって、いざハードの実験や試作をするとなると、キースイッチを用意しないといけないのですよね。
私が目指しているキーボードは小型の物なので、とりあえずの試作は市販のタクトスイッチでも使いますか。
問題は大きさ、想定しているキーピッチが1cm X 1cm なので2.54ピッチのユニバーサル基板だとズレちゃうんですよ。
なので2mmピッチのユニバーサル基板を買わないと。
ガラスエポキシの基板って堅くって、切るのしんどいんですよね・・・

最終的にはバラの部品を乗っけられる専用の基板を作り起こすことになりそうです。
基板 試作」で検索すると企業向けだけでなく個人向けにも小ロットで作ってくれる会社があるみたいです。

これで回路周りは作れそうなのですが、一番の問題はキートップ!!!
キートップとその構造は、HP200LXのキーボードの要とも言えます。
ここを再現してみないことにはどうにもなりませんし始まりません。
3DCADでデータを起こして、3Dプリンタで試作品を出力するのが順当でしょうが、
私、2次元の機械図面しか引いたことがないのです、私が学校に通ってた頃は、まだCADは普及していませんでした。
なので紙の上にえんぴつで機械図面を引くのは出来るのですが(成績そこそこ良かったんよ)CADは全く触っていないのです。
フリーソフトの3DCADを入手はしてあるので、早く使えるようにならないと。
数ヶ月前に10年使ったマザーボードとCPUを買い換えたので、やっと普通の速度でソフトが動くようになったはずなので。

あぁ、はよやらにゃ。

追記:とりあえず作り初めてみました。
Arduino Micro を使って、試しにUSB スライドパッド マウスを作ってみた(小型USBキーボード自作のための準備色々)
ネットの情報をかき集めるだけで、かなーり簡単にポインティングデバイスが自作出来ます(出来ました)。一応普通に動作してます使えます。
皆さんの参考になれば。
Pict0007

 
追記:2016/02/01
今、出来てる、キーボード部分の回路とソフトをテストするための機材一式。
キーマトリクス配線をしたタクトスイッチ基板。
 
20160122pict0003
 
74HC138x2を使ったのですが、動かすソフトのお試し版を作って、そのバグ取りが終わって動かしたら、電気的に一部が動いてないことが判明。(具体的には同一ライン上のキーの複数押しを認識しない、けれどそこ以外はちゃんと動いていて、一応キー入力出来てます
「あーそうか、そーゆーことなのか?」という思い当たる部分があるので、今、別の汎用ロジックICをネット通販で注文中。
届いたら交換して再検証します。

追記:2016/02/10
部品交換で一応正常に動いたので、暫定ですが現状をブログに書きました。
Arduino Micro を使って、USB 小型キーボードを自作(製作途中、暫定公開)
今のところ普通に動いてるっぽいです。
是非、上記キーボードのページを覗いていってくださいませ。

追記:2017/06/09 の時点での動画がこちら。

ネットの情報を集めるだけで、かなーり簡単に、普通に動くUSBキーボードが自作出来ます(出来ました)。
Arduino様々です。電子機器DIYにとって良い時代になりました。
皆さんの参考になれば。
 

2016/06/18 現在、停滞している作業
・検証用プラ製キートップの手作り
・キーボード、マウスとして、実際に動作している様子を動画で撮影

今後予定される、予定している、行いたい、出来ればいいな、作業
・ゴーストキー対策の実装
・NumLockの実装
・Arduinoの標準ライブラリの改変
 ・日本語キーボード特有のキーの有効化
 ・キーボードLEDの機能追加
 ・マルチメディアキーの実装
・キーバックライト用のLED点灯まわりの電子回路の検討、実験
・ATmega32U4(TQFP)と74HC164(SOP)などを用いて、キーボード自作専用のArduino下位互換基板の製作
 ・回路図CADの操作習得と、回路図の描画
  ・動作試作回路の製作(手半田で)
 ・回路基板CADの操作習得と、基板のデザイン製作
 ・※実際に試作基板を発注するところまで行けるかは不透明
・Arduinoの標準ライブラリの、さらなる改変
(Arduinoはかなりの電気食い。USBのConfigurationDescriptorでMaxPowerが500mAと定義されていて、なおかつ実際に消費電力が多いためにモバイルに不向き)
(Arduinoには省電力のためのライブラリ等もあるらしいので、ソフト的にもハード的にも電力を出来るだけ抑えたい)
・3Dモデリングソフトの操作習得と、樹脂製キートップのモデリングおよび試作の3Dプリント

とりあえず思いついているのはこのくらい。
以下、完全に未定

 

| | コメント (0) | トラックバック (0)