ワンダースワン用
PS/2キーボードプロトコル変換
アダプタ
 
 
 
コンセプト
 
 一般のパソコン用として使用されているPS/2キーボードの信号(同期シリアル)を、ワンダースワンの通信ポート仕様(非同期38400bps)に変換し、容易に接続できるようにするために作製したものです。

 通信ポート及びメモリーを内蔵したワンチップマイコン(ATMEL社AVR)を使用することで、必要最低限の簡単な回路で変換が行えます。
 信号の変換だけではなく、キーボードのスキャンコードから通常のASCIIコードに変換するモードも備えているため、ワンダースワン側でキーコードを変換する必要が無く、簡単にキーボード対応のアプリケーションを作製することが可能となります。

 また、PS/2キーボードからの受信だけではなく、キーボードに対してコマンドを送信する事も可能になっています。これによって細かいキーボードの制御(LEDの点灯、キーリピート速度)を行うことが出来ます。

 
使用法
 
 アダプタはワンダースワン側から見ると、シリアル接続された普通の外部機器と同等です。
 従って普通に通信ポートを開けば、キー入力されたコードがそのまま受信できます。接続はワンダーウィッチ付属のPC接続ケーブルを使用し、PCの代わりにアダプタを接続、アダプタにPS/2キーボードを接続します。
  
ハードウェア
 
 アダプタの回路は非常に単純で、PS/2のCLOCK信号をAVRの外部割り込み端子に、DATA信号を入力端子に接続し、AVRのUART入出力端子をMAX232経由でRS232Cコネクタへ接続しているだけです。
 AVRの入力ポートにはプルアップが内蔵されているので、CLOCKとDATAのプルアップ抵抗は不要なようにも思えますが、内蔵プルアップではキーボードに対するコマンド送信がうまくいかなかった為、付けてあります。
 
回路図

 
ファームウェア
 
ソースファイル(ppca_src.zip)
バイナリファイル(ppca_bin.zip)
  
キーコード表
 
 アダプタスキャンコードモード、トランスレートモード、拡張トランスレートモードの三つの出力モードを持ちます。
 スキャンコードモード時はPS/2キーボードの生データをそのまま出力し、トランスレートモードと拡張トランスレートモード時はスキャンコードを内部で変換してから出力します。

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

 
■ トランスレートモード時のキーコード表 ■
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の範囲のコードが出力されます。
 基本的に全てのキーコードはキーを押したときに出力されますが、左右のCtrl、Shift、Altキーだけはキーを押したときと離したときにコードが出力されます。
 後ろに(M)と書かれているのがキーを押したときに出力されるコード、(B)と書かれているのが離した時に出力されるコードです。
 
コマンド
 
 ワンダースワンからアダプタに対してコマンドを送信することで、動作モードを切り替えたり、状態を取得したりすることができます。
 コマンドは全て1バイトの半角英大文字または数値です。
 
コマンド表
S スキャンコードモードに切替
トランスレートモードに切替(デフォルト)
X 拡張トランスレートモードに切替
V ファームウェアバージョンを返す
R キーボードリセット
L LEDの状態を取得
 bit0 - Scroll Lock
 bit1 - Num Lock
 bit2 - Caps lock
 以上のビット状態に0x30を加えた値が返ってきます。
 従ってアダプタからの戻り値は'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を加えた値が返ってきます。
 従ってアダプタからの戻り値は'0'〜'7'までの文字となります。
1 1バイトコマンド送信
 キーボードに1バイトコマンドを送信します。
 このコマンドに続けて送信した1バイトのデータをそのままキーボードに送信します。
 デバッグ用に付けたもので、特殊なことをやろうとしない限りは使う必要は無いでしょう。
2 2バイトコマンド送信
 キーボードに2バイトコマンドを送信します。
このコマンドに続けて送信した2バイトのデータをそのままキーボードに送信します。
 これもデバッグ用に付けたものです。
 
作者情報
 
tokoya
メールアドレス:tokoya@mars.dti.ne.jp 
ホームページ:www.mars.dti.ne.jp/~tokoya