AVRワンチップマイコンを使った
PS/2キーボード→RS232Cプロトコル
コンバージョンアダプタ
 

アダプタを使用してワンダースワンにPS/2キーボードを接続


はじめに
 ンダースワンの開発環境であるワンダーウィッチが発売されて、携帯用ゲーム機のプログラムが個人でも手軽に作製できるようになりました。

 ゲーム機としてだけ使うのならば、ワンダースワン単体で過不足は無いのですが、自由にプログラムが組めるとなると、ゲーム機以外の使い方をしたくなります。誰でも考えつくのがVisorやザウルスといったPDA的な使い方なのですが、そういった方面で使おうと思うとワンダースワンの入力デバイスは貧弱です。

 タッチパネル等の入力デバイスをワンダースワンに装着するのは難しそうなので、さしあたっての解決策としてPS/2キーボードの接続を考えました。ちょうどいいタイミングで超小型のPS/2キーボードが入手できたという事もあり、とりあえずやってみようということで作製したのがPPCA(PS/2 keybord Protocol Conversion Adapter)です。

 ファームウェア部分はまだ完全ではなく、現在も色々と手直ししたり新しい機能を組み込んだりしている途中なのですが、とりあえず一通り動くようにはなったので、資料として以下にまとめておくことにします。何かの参考になれば幸いです。

 尚、これらの内容についてはその一切を保証しません。全ての作業は自己責任において行うようにしてください。

 
ハードウェア
 PPCAの回路は非常に単純で、PS/2のCLOCK信号をAVRの外部割り込み端子に、DATA信号を入力端子に接続し、AVRのUART入出力端子をMAX232経由でRS232Cコネクタへ接続しているだけです。
 AVRの入力ポートにはプルアップが内蔵されているので、CLOCKとDATAのプルアップ抵抗は不要なようにも思えますが、内蔵プルアップではキーボードに対するコマンド送信がうまくいかなかった為、付けてあります。

 特に難しい部分は無いと思いますが、RS232CコネクタとPS/2用のDINコネクタは基板に乗らないので、ケースに入れない場合は取り付けに工夫が必要かもしれません。
 私はRS232Cコネクタはサンハヤトの変換基板を使い、DINコネクタは基板を直接挟むという方法で取り付けました。RS232Cコネクタも基板を直接挟む方法で取り付け可能だと思います。

回路図

 
パーツ表
種類 記号 品名 数量 内容
半導体 U1 AT90S2313 1 AVRワンチップマイコン
  U2 MAX232 1 RS232Cレベルコンバータ
  U3 7805 1 +5V 3端子レギュレータ
抵抗 R1、R2 4.7KΩ 2  
コンデンサ C1、C2、C3、C4、C5 0.1μF 5 積層セラミックコンデンサ
  C6 10μF 1 電解コンデンサ(16V)
セラロック X1 8MHz 1 セラミック発振子
コネクタ J1 D-SUB9Pメス 1 RS232C用
  J2 DIN6Pメス 1 PS/2用
ICソケット   16P 1  
    20P 1  
基板   ユニバーサル基板 1 秋月Cタイプ基板
 記パーツの他に、ACアダプタで動作させる場合にはACジャック、乾電池で動作させる場合にはスナップコネクタや電池ホルダ等が必要となります。

 MAX232と7805は同等品でもかまいません。最近はコンデンサ内蔵のMAX233互換チップというのも出ているので、そちらを使うと更にパーツ数を減らすことができます(ちょっと高いようですが)。

 
ファームウェア
 PPCAを動作させるためには、AVRワンチップマイコンの内蔵フラッシュメモリへファームウェアを書き込む必要があります。
 フラッシュライタは自作することも可能ですが、秋月電子AVRマイコンプログラマキットを使用するのが簡単でしょう。AVRマイコンプログラマキットに付属する書き込みソフトはAT90S2313未対応なので、アップデータをダウンロードする必要があります。ここからダウンロードしてください。
ソースファイル
バイナリファイル
 ンダースワンとの接続を想定しているため、ボーレートは38400bpsに固定です。他のボーレートに変更したい場合は、ソースファイルを変更してください。
 AVRのPortBが丸ごと空いているので、DIP-SWを付けてボーレートを変更できるようにするというのも考えたのですが、今回は見送りました。
 
キーコード表
 PPCAはスキャンコードモードトランスレートモード拡張トランスレートモードの三つの出力モードを持ちます。
 スキャンコードモード時はPS/2キーボードの生データをそのまま出力し、トランスレートモードと拡張トランスレートモード時はスキャンコードを内部で変換してから出力します。

 スキャンコードについては、CQ出版社から出ている「トランジスタ技術SPECIAL No.72 パソコン周辺インターフェースのすべてIII」を参照してください。今回PPCAを作製するときに参考にした本です。

 ScrollLockNumLockCapsLockの各LEDのON/OFFや、Shiftキーを押した時の英小文字/英大文字の切替動作は、スキャンコードモード時には一切行われないので注意が必要です。
 スキャンコードモード時にLEDを点灯させたい場合は、PPCAに対してコマンドを送信する必要があります。

■ トランスレートモード時のキーコード表 ■
0 1 2 3 4 5 6 7
0 SPACE 0 @ P ` p
1 ! 1 A Q a q
2 " 2 B R b r
3 # 3 C S c s
4 $ 4 D T d t
5 % 5 E U e u
6 & 6 F V f v
7 ' 7 G W g w
8 BS ( 8 H X h x
9 TAB ) 9 I Y i y
A * : J Z j z
B ESC + ; K [ k {
C , < L \ l |
D ENTER - = M ] m }
E . > N ^ n ~
F / ? O _ o DEL
 
■ 拡張トランスレートモード時のキーコード表 ■
8 9 A B C D E F
0 LCTRL(M) INSERT F1 NUM 半角/全角 LWIN
1 LSHIFT(M) END F2 CAPS 英数 RWIN
2 LALT(M) F3 SCROLL 無変換 WINAPP
3 RCTRL(M) PDOWN F4 変換
4 RSHIFT(M) F5 ひらがな
5 RALT(M) F6
6 LCTRL(B) F7
7 LSHIFT(B) HOME F8
8 LALT(B) F9
9 RCTRL(B) PUP F10
A RSHIFT(B) PAUSE F11
B RALT(B) PSCREEN F12
C
D
E
F
 張トランスレートモード時は、トランスレートモード時のコードに加えて0x80〜0xFFの範囲のコードが出力されます。
 基本的に全てのキーコードはキーを押したときに出力されますが、左右のCtrlShiftAltキーだけはキーを押したときと離したときにコードが出力されます。
 後ろに(M)と書かれているのがキーを押したときに出力されるコード、(B)と書かれているのが離した時に出力されるコードです。
 
コマンド
 ストコンピュータ側からPPCAに対してコマンドを送信することで、動作モードを切り替えたり、状態を取得したりすることができます。
 コマンドは全て1バイトの半角英大文字または数値です。
コマンド表
S スキャンコードモードに切替
トランスレートモードに切替(デフォルト)
X 拡張トランスレートモードに切替
V ファームウェアバージョンを返す
R キーボードリセット
L LEDの状態を取得
 bit0 - Scroll Lock
 bit1 - Num Lock
 bit2 - Caps lock
 以上のビット状態に0x30を加えた値が返ってきます。
 従ってPPCAからの戻り値は'0'〜'7'までの文字となります。
E LED状態設定
 このコマンドに続けて送信した1バイトの、下位3ビットをLEDの状態として設定します。
 bit0 - Scroll Lock
 bit1 - Num Lock
 bit2 - Caps lock
 スキャンコードモードで動作している時は、このコマンドでLED状態を設定しても、キーコードは変わりません。
 トランスレート、拡張トランスレートモードの場合は、LED状態の設定によってキーコードが変化します。
K キー状態取得
 Ctrl、Shift、Altの状態が、2バイトのコードとして返ってきます。
最初のバイト
 bit0 - 左Ctrl
 bit1 - 左Shift
 bit2 - 左Alt
次のバイト
 bit0 - 右Ctrl
 bit1 - 右Shift
 bit2 - 右Alt
 以上のビット状態に0x30を加えた値が返ってきます。
 従ってPPCAからの戻り値は'0'〜'7'までの文字となります。
1 1バイトコマンド送信
 キーボードに1バイトコマンドを送信します。
 このコマンドに続けて送信した1バイトのデータをそのままキーボードに送信します。
 デバッグ用に付けたもので、特殊なことをやろうとしない限りは使う必要は無いでしょう。
2 2バイトコマンド送信
 キーボードに2バイトコマンドを送信します。
このコマンドに続けて送信した2バイトのデータをそのままキーボードに送信します。
 これもデバッグ用に付けたものです。
 
おわりに
 

アダプタを使用してワンダースワンに文字入力
(見えにくくて申し訳ない)
 AVRワンチップマイコンのアプリケーションノートにPS/2キーボードとの接続例が既にあったので、簡単に実現できるだろうと思って着手したのですが、実際にはかなり苦労しました。

 PS/2キーボード自体がもっとインテリジェントなもので、たとえばCapsLockキーを押したときにLEDが点灯し、自動的に小文字から大文字に変換したコードを出してくれるのだろうと思っていたのですが、実際にはそうではありませんでした。
 そういった機能は全てホスト側がまかなっていて、CapsLockキーを押したというスキャンコードが来たらLED点灯のコマンドをキーボードに送信し、以降のスキャンコードを変換するという処理をBIOSやOSが行っていたわけです。

 PPCAはASCIIコードをシリアルで出力する機能を持たせるつもりでしたから、ホストが行っていた処理をすべてAVRワンチップマイコンで行う必要があり、この部分がやたらと面倒で七転八倒してしまいました。
 特にキーボードへコマンド送信する部分が難しく、実際キーボードからコードを受信する部分の10倍以上の手間がかかっています。AVRのアプリケーションノートでその部分については全く触れられていなかったのですが、やってみてその理由が身に染みて分かりました。

 苦労したおかげでAVRワンチップマイコンのプログラミング、及びPS/2キーボードの構造に関する知識はだいぶ増えたような気がします。増えた知識が今後なにかの役に立つかどうかは分かりませんが、技術屋としては知らないより知っていた方が良いことは間違いないと思います。
 まあ作っている最中はそんな事は考えて無くて、面白そうだからやってみただけなんですけどね。苦労もまた楽し。

 プログラムの不具合や、改善点の要望などありましたら↓の掲示板の方へ書き込んでください。確約はできませんが、できるかぎりは対応したいと思います。

ワンダーウィッチ専用掲示板
WorldWideWonderWitchWorkbench


mailto:tokoya@mars.dti.ne.jp