まごころせいじつ堂

浜町庄金 研究開発  マイコンで遊んでばっかりで

キーボード

PS/2キーボード変換器の製作(9)

これまでの実験から方針確認。

・キーボード入力について
(1)PS/2キーボード入力はArduinoのPS2Keyboardライブラリからスキャンコードを取得できるよう作りなおす
(2)USBキーボード入力はUSBホストシールドまたはAndroid ADKが使用できそうだが未確認
(3)キーボードへの出力(LED制御、キーリピート等)が必要

・キーボード出力について 
(1)Davinci(Arduino Leonardo)のKeyboard.write()で確認したが単発のキーしか認識しない。
(2)DavinciはUSB複合デバイスとして認識されるのでWindowsで毎回デバイスを問い合わされる。Disableにする方法はないか?
(3)Arduino Leonardoは正式サポートではないので今後変わる可能性がある。
(4)代替手段としてV-USBがある。未確認。部品は揃えてある。
(5)PS/2出力を実現するPS2devというのがあるらしい。

プランB
78K0の作例を元に作る。

PS2KeyboardExt2の確認

以前PS2Keyboardライブラリを試したが、PS2KeyboardExt2というのもあったので試した。

http://arduino.cc/playground/Main/PS2KeyboardExt2 目的としてはPS2Keyboardの代替としてCTRLやALTなどの修飾キーの取得とコードサイズの縮小を目的としたものらしい。ソースはそのまま貼り付けてあるだけなので以下の様にライブラリに置いた。
(1)librariesディレクトリ以下にPS2KeyboardExt2というディレクトリを作る。 
(2)PS2KeyboardExt2ディレクトリ以下にPS2Keyboard.cppとPS2Keyboard.hをコピペして置く。
(3)PS2Keboard.cppのソース中"Wprogram.h"を"Arduino.h"に修正。(Arduino IDE1.0用)

もしPS2Keyboardライブラリをインストール済みだったら競合するのでディレクトリごとどこかに退避しておく。

 配線はPS2CLK(pin5)がArduino UNOのpin3、PS2DATA(pin1)がArduino UNOのpin4に接続。
サンプルスケッチをコピペして開き、動作を確認。
サイズは以下のとおり。
 Binary sketch size: 5170 bytes (of a 32256 byte maximum)
 修飾キー(CTRL,ALT)が取得できなかったのは?だが、これを元に動作を追いかけてみる。

ArduinoにPS/2日本語キーボードをつなぐ

ArduinoにはPS/2キーボードを接続するライブラリがオプションであるので実験してみた。

 まずPS/2キーボードを接続するための治具。以前PS/2信号の観測用に作ったものを手直し。

PS2jig2

Pin1(DATA)とPin5(CLK)について、10KΩでPin4(+5V)にプルアップ。ジャンパで設定可能。

PS2jig0

ピンの番号は写真の通り。

PIN1→Arduino Pin2、PIN3→GND、PIN4→5V、PIN5→Arduino Pin3 に接続。

なお、キーボードのCLKを割り込みとして受け付けて処理するので、Arduino UNOの場合はPin3にしか接続できない。

 ではPS/2キーボードのライブラリを設定してみる。Arduino IDEには標準では入っていないので自分で入れる必要がある。
 ARDUINO PLAYGROUND - PS2Keyboard
ここを辿っていくと
PJRC Teensy PS2Keyboard Library
があるので、ここのPS2Keyboard.zip (ver2.3)をダウンロード。

展開すると以下のような構成になっている。
PS2Keyboard¥
keywords.txt
PS2Keyboard.cpp
PS2Keyboard.h
  examples¥
  international¥international.pde
  Simple_test¥Simple_test.pde

このPS2KeyboardフォルダをそのままArduino IDEのlibrariesフォルダの下にコピーする。
Arduino IDEを立ち上げ、Simple_test.pdeを読み込む。

以下、スケッチを修正。
const int DataPin = 2;
const int IRQpin =3; 

ビルドして転送が完了すると、キーボードの入力をターミナルに表示する。Arduino IDEのターミナルはウィンドウ右上の虫眼鏡みたいなアイコンをクリックすると出てくる。
シリアル通信を使っていると、USBケーブルを外したりするとArduino IDEからCOMポートが見えなくなってしまうらしい。この様な場合はWindowsを再起動して対処した。 

 さて、これで確認できるのはUSキーボード配列だが、ライブラリを見てみたら日本語キーボードにも簡単に対応させることができそうだ。すでにドイツ語キーボードの対応が入っているので、ここを参考にすればいけそうな感じ。

 で、作ってみた。PS2Keyboard.cppとPS2Keyboard.hを以下と差し替える。
https://gist.github.com/2334909

使い方はスケッチ内で以下のようにする。
keyboard.begin(DataPin, IRQpin, PS2Keymap_Japanese);

 これでPS/2キーボードが使えるようになった。ただしPS/2テンキーのみの製品は正しいコードが反映されなかったり、応答しなかったりしたので後で調査する。
 ドイツ語配列を元に修正しているので、Altキー修飾はそのままでサボっている。気が向いたらカナにも対応したい。

チェックに使用したキーボード:
USキーボード Microsoft Natural Keyboard Elite
日本語キーボード SANWA SKB-108L 日本語108キーボード
PS/2テンキー IBM KeyPadIII P/N 79F6401 ×応答せず 、FUJITSU FMV-NTKB1 テンキーボード ×コード化け
 

PS/2キーボード変換器の製作(8)

Arduino Unoで試作し、Davinciに実装する方針にした。
(1) PS2Keyboardライブラリでキーボードが扱えることを確認
(2)USB HID Keyboardデバイスにできることを確認
(3)US→JPのマッピングを行う(PS2Keyboard.cppの修正)
でやってみる。

資料メモ:
PIC AVR 工作室 ブログ
ARDUINO PLAYGROUND PS2Keyboard
Interfacing the PS/2 Keyboard
PS/2 Keyboard Library
Virtual USB Keyboard

(1)の注意点:プルアップ抵抗が必要
(2)の注意点:DavinciのUSBインターフェースがよくわからないのでソフトウェアによるV-USBを使う
(3)の注意点:US配列とGerman配列があるので、ここを修正

PS/2キーボード変換器の製作(7)

前回の続き。

ホスト側からの送出は以下のようになる。

 ・DEVICE(キーボード、マウス)はCLKを発生させる。
・バスの制御権はHOSTにある。CLK="L"にすることにより初期化される。
・CLK、DATA線はDEVICE-HOST間でオープンコレクタで結ばれている。
 どちらかが"L"にすればすべて"L"になる。通常は"H(OPEN)"。

(1) HOST CLK="L"
(2) HOST DATA="L"
(3) HOST CLK="H(OPEN)"
(4) HOST はDEVICEがCLK="L”にするまで待つ
(5) HOST 1bit目DATA設定 CLK="H(OPEN)"にするまで保持
(6) HOST はDEVICEがCLK="L”にするまで待つ
(7) HOST 2bit目DATA設定 CLK="H(OPEN)"にするまで保持
(8) HOST はDEVICEがCLK="L”にするまで待つ
(9) HOST 3bit目DATA設定 CLK="H(OPEN)"にするまで保持
(10) HOST はDEVICEがCLK="L”にするまで待つ
(11) HOST 4bit目DATA設定 CLK="H(OPEN)"にするまで保持
(12) HOST はDEVICEがCLK="L”にするまで待つ
(13) HOST 5bit目DATA設定 CLK="H(OPEN)"にするまで保持
(14) HOST はDEVICEがCLK="L”にするまで待つ
(15) HOST 6bit目DATA設定 CLK="H(OPEN)"にするまで保持
(16) HOST はDEVICEがCLK="L”にするまで待つ
(17) HOST 7bit目DATA設定 CLK="H(OPEN)"にするまで保持
(18) HOST はDEVICEがCLK="L”にするまで待つ
(19) HOST 8bit目DATA設定 CLK="H(OPEN)"にするまで保持
(20) HOST はDEVICEがCLK="L”にするまで待つ
(21) HOST 9bit目(parity)DATA設定 CLK="H(OPEN)"にするまで保持
(22) HOST はDEVICEがCLK="L”にするまで待つ
(23) HOST DATA="H(OPEN)" ※これでHOSTからのデータ送出終わり
(24) DEVICE DATA="L",CLK "H"→"L"→"H"
(25) DEVICE CLK="H(OPEN)" 終了

DEVICE側はCLKの立ち上がりでデータを受け取ることになる。
 
 
波形を見ると4つのかたまりで観測できている。

10110111 1 0
0xED キーボードLED制御コマンド

01011111 1 0
ACK

00100000 0 1
0x04 Caps Lock ON

01011111 1 0
ACK

CAPSON_100KHz


PS/2キーボード変換器の製作(6)

ロジアナをつないでPS/2の信号を観測してみた。

詳しい仕様はPS/2 マウス/キーボード プロトコルとインターフェース で解説されている。

CLKとDATAを観測すればよい。CLKが’L'のときのDATAを読む。

SPC_100KHz

ロジアナのサンプリング周期は100KHz( 10μs)。CLKが10回変化する間に800μsかかっているので、1CLKあたり80μs。仕様によるとCLKのHまたはLの期間は30μs~50μsなので妥当。
DATAを読むと 0_10010100_0_1 となっている。最初の0はスタートビット。LSB側から8bitのデータが送出され、10bit目は奇パリティ(データとパリティビットを含む1が奇数個)。最後の11bit目はストップビットで1。
よって0x29 でこれはスペースキーのスキャンコード。

PS/2キーボード変換器の製作(5)

キーボード⇔変換器⇔PC本体とのやり取りについて検討する。

 キーボードとPC本体、それぞれはPS/2インターフェースでシリアル通信を行う。このデータを加工するためには送受信するデータをいったんマイコン内部に蓄積しなければならない。2つのポートに関してポーリングを行うことになるので、以下の様な手順を考えた。

(1)キーボード⇔変換器について
 キーボードからの送信か、キーボードへの送信かを判定
 (1-a)キーボード→変換器
 0bit目を受信
 1bit目を受信
 2bit目を受信
 3bit目を受信
 4bit目を受信
 5bit目を受信
 6bit目を受信
 7bit目を受信
 8bit目(ODDパリティ)を受信
 キーボードからの受信バッファに蓄積
 キーボードからの受信モード解除
 (1-b)キーボード←変換器
 0bit目を送信
 1bit目を送信
 2bit目を送信
 3bit目を送信
 4bit目を送信
 5bit目を送信
 6bit目を送信
 7bit目を送信
 8bit目(ODDパリティ)を送信
 キーボードへの送信バッファから削除
 キーボードへの送信モード解除
(2)PC本体⇔変換器について
 本体からの送信か、本体への送信かを判定
 (2-a)PC本体→変換器
 0bit目を受信
 1bit目を受信
 2bit目を受信
 3bit目を受信
 4bit目を受信
 5bit目を受信
 6bit目を受信
 7bit目を受信
 8bit目(ODDパリティ)を受信
 PC本体からの受信バッファに蓄積
 PC本体からの受信モード解除
 (2-b)PC本体←変換器
 0bit目を送信
 1bit目を送信
 2bit目を送信
 3bit目を送信
 4bit目を送信
 5bit目を送信
 6bit目を送信
 7bit目を送信
 8bit目(ODDパリティ)を送信
 PC本体への送信バッファから削除
 PC本体への送信モード解除
 (3)キーボードからの受信バッファに蓄積がある場合
 データ変換
 PC本体への送信バッファに転送
 キーボードからの受信バッファから削除
 PC本体への送信モード設定
(4)PC本体からの受信バッファに蓄積がある場合
 キーボードへの送信モード設定
※(1)〜(4)繰り返し、これらのループを数十μS以内で回す(PS/2インターフェース観測後決定)

 ODDパリティのエラーがあった場合は?変換器で加工せずそのまま渡すことにより、PC本体とキーボード間で訂正してくれるので問題ない。

 各バッファの容量とマイコンの処理速度がどれくらいあれば収まるか?

PS/2キーボード変換器の製作(3)

使用するマイコンだが開発キットを持っててひと通り使ったことのあるR8Cで検討。

サンハヤト SR8C15CP 
R8C/TinyマイコンSR8C15CP用書込み・I/Oボード MB-RS8 

SR8C15CPはDIP20ピンに封止したR8C/15マイコン。生産完了品だが手持ちがあるので使ってみる。
開発キットは9V300mAのアダプタが必要。液晶は持っている。

ルネサス開発環境 

PS/2キーボード変換器の製作(2)

 US配列と日本語配列の対応について作ってみた。今回はそのままタイプした場合とシフトキーを押した場合で対応づけている。
SHIFTキーを押している状態をマイコン側で保持して、ダマすことになる。ALTキーやCNTLキーを併用した場合も考慮する必要があるかも。

キートップとスキャンコード

和 英 code 英→和 変換後
漢 ~` 0x0E SHIFT+0x55/SHIFT+0x54
1! 1! 0x16 -
2" 2@ 0x1E 0x1E/0x54
3# 3# 0x26 -
4$ 4$ 0x25 -
5% 5% 0x2E -
6& 6^ 0x36 0x36/0x55
7' 7& 0x3D 0x3D/SHIFT+0x36
8( 8* 0x3E 0x3E/SHIFT+0x52
9) 9( 0x46 0x46/SHIFT+0x3E
00 0) 0x45 0x45/SHIFT+0x46
-= -_ 0x4E 0x4E/0x51
^~ =+ 0x55 SHIFT+0x4E/SHIFT+0x4C
\| 無 0x6A -
@` [{ 0x54 0x5B/SHIFT+0x5B
[{ ]} 0x5B 0x5D/SHIFT+0x5D
;+ ;: 0x4C 0x4C/0x52
:* '" 0x52 SHIFT+0x3D/SHIFT+0x1E
]} |\ 0x5D SHIFT+0x6A/0x6A
__ 無 0x51 -

以下は対応なし
無変換 - 0x67
前候補 - 0x64
カタカナ - 0x13

参考文献:PC周辺機器オリジナル設計ガイド2 Interface2005年12月号別冊付録

PS/2キーボード変換器の製作(1)

IBM-PC互換機のキーボードはUS配列と日本語配列の切り替えがOSを再起動しないとできない。(Macintoshは混在していてもそれぞれ認識して使うことができた) 
US配列を好む人は多いが、日本語配列の方が変換キーなどの機能が多いこと、一般的なご家庭用パソコンでは日本語配列しかないこと、WindowsをUS配列に設定するには若干の手間がかかることが問題となる。
 で、US配列のキーコードを日本語配列に見せかけるインターフェースを検討する。もし挫折しても資料は残るのでなんなりと役に立つでしょう。

PS/2 connector Wikipedia

 これによると5Vで275mAが取れる。信号線はDataとCLKで入出力を考えると4ポートあれば充分。  最近のマイコンで作るとしたら8PのAVRでもできそうだが、手持ちで以下のマイコンを検討する。

AVRマイコン ATTINY2313 

R8C/M12Aマイコン 

※いづれも秋月電子

 キーボードと本体は双方向の通信なので、コードを書き換える部分以外はスルーパスする方針。ハンドシェイクはこのアダプタ側では行わないことにする。
  SHIFTキーを押した状態での記号、例えば数字の2についてはUS配列で@、日本語配列で”となるが、これを差し替えるには現在SHIFTキーを押している状態かどうかを保持しないといけない。US配列での日本語入力切り替えで使うALT+`も同様で、ALTの状態を保持しないといけない。使わないかも知れないがCTRLもあるし、それぞれ左右に存在する。

 PS/2キーボードの資料については以下が見つかったが、詳細なタイミングなどは本+実機確認。

Sazanami Online:PS/2 インターフェイスの研究 
KeyCordLsit.pdf
記事検索
プロフィール

hardyboy

カテゴリ別アーカイブ
月別アーカイブ
QRコード
QRコード
  • ライブドアブログ