随分前のことですが、Pro Microを使ってハッピーハッキングキーボード(英語 PS/2インターフェイス)を日本語キーボードとして使えるようにしました。その後、何度かスケッチを改良しながらずっとこのキーボードを使用していたのですが、最近キーの取りこぼしやフリーズすることが多くなってきました。Pro Microが壊れかけているのか、配線のどこか接触が悪くなってしまったのか理由はよく分かりません。
スケッチでは外部割り込みでキーコードを取得していて、処理速度ギリギリのきわどいタイミングでのデータの送受信だったので取りこぼしなどはたまに発生していたのですが、ここのところ取りこぼし頻度が高くなりボード上のリセットスイッチを押す状況が増えてきたのです。
そこで思い切ってキーコードを変換するデバイスを作り直してみることにしました。今回はPro MicroのようなArduinoではなく生AVRのATmega328Pでチャレンジしてみます。
まずはブレッドボードで回路を組んで、現状使用しているスケッチをそのまま利用してテストしてみました。しかし、ATmega328Pの2、3番ピンの割り込みだとPro Microで使用しているATmega32U4の7番ピンの割り込みよりレスポンスが悪いのか、頻繁にキーの取りこぼしが発生してしまいます。確かに以前もATmega328Pを使用しているPro Miniで試してみたのですが、割り込みのレスポンスが良くなく実用的ではありませんでした。
そこでスケッチを見直して割り込み以外のところを改善してみた結果、パフォーマンスが良くなったようだったのでATmega328Pで作成可能と考え、キー変換デバイスの回路を基板に構築してみました。
Pro Microのときと比べてコンパクトに納めることが出来ました。配線は次のようになります。
ATmega328P → PS/2(HHKB)
ピン2 → 1DATA
GND → 3GND
VCC → 4VCC
ピン3 → 5CLK
ATmega328P → PS/2(PC)
ピン7 → 1DATA
GND → 3GND
VCC → 4VCC
ピン8 → 5CLK
インジケーター用LED
ピン5
ピン6
(抵抗は1KΩ)
あとは外部に16MHzのクリスタルを付け、いつものように電源ラインには0.1μFのパスコンを入れてあります。リセットスイッチも付けました。スイッチは10KΩでプルアップしてあります。
基板に付けたピンソケットは6個の方はスケッチ書き換えのICSP接続用で、4個の方はデバッグモニター用にTXD、RXDと電源を出力しています。
早速この基板にスケッチを書き込んで動作確認してみたところ、かなり頻繁にキーを取りこぼします。ブレッドボードでテストしていたときより不安定な感じです。なんらかのノイズの影響でもあるのでしょうか?多少配線を変えたりしてみましたが何も変わりませんでした。
仕方がないのでスケッチを一から作り直すことにしました。割り込み処理は行わず、loop()内でPS/2のシリアル通信をポーリングで監視し、通信処理部分は速度重視のために似たような処理でもサブルーチン化せずにひたすら記述するようにしました。
さらにキー変換のために大量に記述してあったswitch文もやめて、全てのキーの変換処理ルーチンのポインタをキーコードの数だけ用意した配列に入れ、入手したキーコードからそのキーの変換処理ルーチンを実行させるまでを条件式なしで行えるようにしました。
これらの方法で作成したスケッチは、以前のものに比べてパフォーマンスが劇的に改善されました。実際にテストしてみると、キーの取りこぼしも発生すること無く快適に動作しています。念の為、複数のキーを高速で連打してみましたがキーの取りこぼしは発生しませんでした。これならば十分実用に耐えられるでしょう。
作成したスケッチはこちらです。
HHKBLitePS2Ver2.ino
Arduino IDEのボード指定ではPro Mini 5V 16MHzを選択しました。
一時は作成したデバイスが使い物にならないと思いあせりましたが、なんとが実用的なものが出来てホッとしました。カスタマイズのせいで変則的なキー配置になったキーボードに慣れてしまったので、もう普通のキーボードには戻れません。まだ当分このキーボードを使い続けられそうでよかったです。
今回作成したデバイスはキーコード変換処理の部分を書き換えれば、どんなキーボードでも自由にキー割り当てを変更出来ます。たとえば昔ハードオフで購入したPS/2のテンキーも色々カスタマイズしたら便利に使えそうです。気が向いたらもう一つキーコード変換デバイスを作るかも。
※コメント投稿者のブログIDはブログ作成者のみに通知されます