「PIC AVR 工作室」サイトの日記的なブログです。
サイトに挙げなかった他愛ないことを日記的に書き残してます。
PIC AVR 工作室 ブログ



arduinoにPS2キーボードを繋いでみました。

http://www.arduino.cc/playground/Main/PS2Keyboard
↑Contributed Librariesにライブラリと接続図が
公開されています。が、一点注意が必要です。

PS2キーボードやマウスは、電源2本とデータ+
クロックの4本の線が必要なのですが、データ線と
クロック線にはプルアップ抵抗が必要です。
このページの接続図にはこのプルアップ抵抗が
抜けています。

プルアップ抵抗が抜けていると、大抵は動かなかったり、
仮に動いても不安定な動作になったりするかと思います。

PS2コネクタの信号線は双方向i/fのため、
基本的にはオープンドレインで接続し、信号の衝突時
にショートしないためです。詳しくは、PS2、
キーボード、プルアップ、などと検索してみてください。

さて、先日シリアル版arduinoを自作した際に、
PS2コネクタのアクセサリも作っていました。

暗くてちょっとわかりにくい写真ですが、ミニdin6ピン
の端子をブレッドボード用に一列の配列に変換します。

ここにPS2キーボードを差し込んで配線し、先ほどの
プルアップ抵抗(今回は1kΩを使用)を差して、
以下のスケッチを実行。(サンプルスケッチを元にして
ちょっとだけ手を加えたものです)
例によって、半角不等号と&マークは全角に置き換えて
あるので、適宜半角に戻して使ってください。

#include <PS2Keyboard.h>

#define DATA_PIN 4
PS2Keyboard keyboard;

void setup() {
keyboard.begin(DATA_PIN);

Serial.begin(9600);
Serial.println("hi");
delay(1000);
}

void loop() {
if(keyboard.available()) {
byte dat = keyboard.read();
byte val = dat - '0';

if(val >= 0 && val <= 9) {
Serial.print(val, DEC);
} else if(dat == PS2_KC_ENTER) {
Serial.println();
} else if(dat == PS2_KC_ESC) {
Serial.println("[ESC]");
}
Serial.print(" ");
Serial.println(dat,HEX);
}
}

テンキーの数字かエスケープキーを押したときは
その内容とコード値を、その他のキーの場合は
コード値だけを表示するようになっています。

スクリーンショットはこんな感じ。


エスケープと数字の1~3を押してみた所です。

簡単なスケッチですし、ライブラリ自体にもそれほど
の機能はないみたいなので、capsロックLEDや
numロックLEDなどはキーを押しても光りません。
(機能は有効になるようです)

帰ってくるコードは、各キーのスキャンコードではなくて、
asciiコードっぽいです。
ライブラリの中身を読んだわけではないので詳しくは
判りませんが、日本語106キーボードの場合ちゃんと
コード変換が行われるのかは疑問です。

まあ、込み入った用途ではなく、少ない接続線で繋がる
簡単な入力デバイスとして使うには簡単で便利。

ちなみに、データ線は好きなところに割り当てられますが、
クロック線はハードウェアピン立下り割り込みを利用
しており、デジタル3番が固定的に割り当てられています。

この3番ピン以外で使いたい場合、ライブラリソースに
修正を加える必要があります。
その際、信号の立下りで割り込みがかかるピンを
選ばないとなりません。

ちなみに、キーボードはUSB/PS2兼用のもの
(変換コネクタ付属)を使ったのですが、普通に
つながりました。

playgroundにマウス用のライブラリもあるみたいなので、
そのうち試してみたいと思います。
http://www.arduino.cc/playground/ComponentLib/Ps2mouse




コメント ( 0 )