cheezecake @Wiki

HIDKeys

最終更新:

匿名ユーザー

- view
だれでも歓迎! 編集

HIDKeys

HIDKeys
AVRと12MHzの水晶発振子のみでインタラプト転送を実現する企画。USB機能をもったICを利用しない。FlashROMの容量が低く、2KBほどで足りる。残ったFlashROMに、プログラムを入れられる。

1.5Mbps = 1.5MHzであるので、理論上はUSBデータ1ビットの送信を8クロックに1回行なえばよい。実際は、AVRの機能のシリアル通信ポートを利用しているので、CPUへの負担はもっと軽減されている。おそらく、8ビットを一度にセットしたら自動でシリアル送信されるから、64クロックに1回の操作なのだろう。だから、USB機能を付けて、さらにキーボードのチェックや、液晶画面の操作など、他の仕事ができる。

ATMEGA168で実験(失敗)

対応しているAVRは、FlashROMが4KB以上、RAMが1KB以上となっている。ためしに、手持ちにあった、ATMEGA168で実験してみた(しかし失敗に終わった)。

ソースの修正

ソースでは、以下の部分の書き換えが必要である。

main.c内
  • TCCR0をTCCR0Bに
  • TIFRをTIFR0に

コンパイル

修正をしたら、コンパイルする。Makefileが用意されているので、mcu名を書き換えて、$ makeすればよい。

転送

転送は、Makefileで書き込みコマンドが記述されているので、それを利用すればよい。$ make flashで利用できる。ただし、avrdudeなど他の転送ソフトウェアを使用したい場合は、コマンドが異なるため、そのままでは使用できない。コマンドラインでその都度実行してもいいのだが、Makefileで定義してしまえば毎回$ make flashだけで使えるので、ここは適宜Makefileを書き換えたほうがいい。

ヒューズ・ビット

Makefileに定義されているヒューズ・ビットはATMEGA8用なので、ATMEGA168と互換性がない。データシートと、使用している発振子によって変更する。変更を忘れて、リセット・ピンを無効にしたりすると、ISP通信による転送を行なえなくなる。

テスト

成功すれば、OSに認識され、普通のUSBキーボードとして認識される。しかし、なぜか一向に通信が行なわれない。オシロスコープを持っていないので、信号は解析できなかったが、LEDを光らせる程度のデバッグを行なった。一応は親機との通信関数を呼び、キーコード送信のループまで到達しているようだったが、それ以上詳しいことは分からなかった。

ソースの他の部分もよく見てみたが、原因となりそうな設定箇所が見当たらなかったため、ATMEGA168でのテストは諦めることにした。

ATMEGA8(成功)

回路図通り、ATMEGA8で実験してみる。当然、ソースコードの改造は必要ない。Makefileの変更箇所も、使用する発振子の定義のみ。今回は、12MHzの水晶発振子の代わりに、12MHzのセラミック発振子を利用した。セラミック発振子では精度が得られないという指摘があったが、結果は良好。しかし、最初のキーがどうしても認識されないという欠陥がある。

キーについて考察

16キー

キーに使えるピン数は、16個。回路図では、試験的に、1つのピンに1つのスイッチを介してGNDに落としているため、AからPまでの都合16キーを実装しているのみである。ソース内では、当然、必要なキーのみを指定できるため、このままのキー数でも使えることは使える。テンキーにしたり、矢印キーといくつかのキーだけにしてゲームパッドにしたり。ソース内では、コンパイル時にキーコードの変更が簡単にできるため、こうした応用はとても簡単。

64キー

マトリクス方式を採用すれば、最大で8 x 8 = 64キーを実装することができる。英数字と記号、リターンやカーソルなど最低限の制御キー、シフトやコントロールなどのモディファイアキーだけで62キーほどであるから、ちょうどコンパクトなキーのセットを実現することができそう。パソコン用のキーとして、これ以上は削れないだろうから、あと2キーを何にするか悩みどころ。

Fnキーを定義し、それと同時にどこかのキーが押されていると、通常とは異なるキーコードを発行するような工夫をすれば、PageDownやF1〜F12キーなど、多くのキーを備えることができる。ただし、これは同時に押したキーを認識するような工夫が必要である。同時押しを考慮しないマトリクスでは、同時に押したときの動作が未定義であるため、誤動作のもととなる。

112キー

シフトレジスタやセレクタなど、少ないピンで多くの接点を制御できる部品を使えば、スイッチ数の上限は特にない。パソコンのフルキーボードのように、108キーでも112キーでも製作できる。とは言え、スイッチへの配線が長いと、ノイズを拾ってしまい、誤動作が多くなるかもしれない。

キーコードのみを処理する

HIDKeysを実装したAVRを、USB子機専用の素子と割り切ってしまう手もある。そうすると、空いているピンでシリアルなりパラレルなりで好みのキーコードを受け取り、USB親機に向けて送信する機能だけが備わっていればよい。スイッチのスキャンは、別のAVRなりその他のマイコンで行なう。

十分なピン数がないマイコンからの信号受信を考慮するなら、シリアル通信を考えるとよい。USARTは、USB制御で占有されているため、ATMEGAで利用できるSPIやTWIを利用すればいいだろうと思う。しかし、TinyではUSIしかない。ATMEGA以外のマイコンへの対応するなら、独自の方式による実装も考える必要がある。

タグ:

+ タグ編集
  • タグ:

このサイトはreCAPTCHAによって保護されており、Googleの プライバシーポリシー利用規約 が適用されます。

目安箱バナー