はい、Arduino.ccフォーラムとここを検索しました。はい、ps2devライブラリに関する記事を見つけました。はい、私はこのWebサイトで決定的なPS / 2インターフェイスの記事を読みました(大丈夫、一部は私が読み飛ばしました)。はい、私はこれがちょっと働いています。完全に機能するように飛躍させるためのアイデアが必要です。:)
いいえ、USB HIDキーボードをエミュレートしてそのままにすることはできません。PS/ 2キーボードエミュレーションである必要があります。はい、適切なmake信号とbreak信号を送信しています。これは、非常に複雑なキーストロークの組み合わせも処理します。現在のところ、Arduino用に記述されたコード(技術的にはFreeduino 1.22)があり、シリアルモニターまたはPuTTYターミナルを介して、および実際に送信する便利なPythonラッパー/ドライバーを使用してキーストロークを送信しましたPS / 2のスキャンコード情報-そして一般的に私の人生をずっと簡単にします-Arduinoからの負荷の一部も取り除きます。
現在、PS / 2キーボードをエミュレートするスケッチをArduinoで実行しています。当然、「ターゲット」マシン(PS / 2プラグインが入るマシン)を起動する必要があり、「ハンドシェイク」が行われているのがわかります。WinDozeを起動し、メモ帳を開き、Pythonドライバーを使用して(正常に)画面にキーストロークを入力します。(ドライバーは単にシリアルモニター/ PuTTYターミナルの代わりになり、PySerialと呼ばれるモジュールを使用してシリアルポートに読み取り/書き込みを行います。)これはすべてASUSマザーボードの「ターゲット」のAMDで行われます。
現在の目標は、Intelマザーボードベースの「ターゲット」でIntelで動作させることです。プラグインして起動し、ダイスはありません。そこで、スケッチを少し変更して、Ardyの小さな友達で実際に起こっていることを頭に上げてみます。改造後のバージョンを以下に表示します。私が理解しているように(コードは別のArduino.ccフォーラムの投稿からここに借用されました)、PS / 2を介して最初に「ターゲット」との接続を確立し、オンボードLEDを0.5秒間隔で点滅させます。接続が確立されました。Intelターゲットが.5秒の点滅を超えず、シリアル接続が「ホスト」で確立されることはありません。
私の質問はこれです:ps / 2キーボードがターゲットマシンとの通信を確立する方法に大きな違いはありますか?それは本当にデザインの違いですか、それともここで問題となっているより基本的なものを探しているのですか?データ/クロック入力にプルアップ抵抗が必要になることについて何か聞いたことがありますが、コードで処理する必要があります。特に、必要なものではなく、別のターゲットで機能しているためです。
何か案は?私はこれをできるだけ早く動作させたいと思っています。デバッグを続けます。ポインタや提案があれば、大歓迎です。私はこの問題に新鮮な目を向ける必要があるので、彼らはすべて十分に検討されます。おそらく、ps2devライブラリのより良い実装が必要ですか?
#include "ps2dev.h" // to emulate a PS/2 device
// Orange = 2
// Blue = 3
// Red = 5V (3 in)
// Black = GND (4 in)
// EXT Power, USB for COM only
PS2dev keyboard(3,2); // PS2dev object (2:data, 3:clock)
int enabled = 0; // pseudo variable for state of "keyboard"
boolean serialConnected = false;
int incomingByte = 0;
void ack() {
//acknowledge commands
while(keyboard.write(0xFA));
}
int kbdCmd(int command) {
unsigned char val;
switch (command) {
case 0xFF: //reset
ack();
//the while loop lets us wait for the host to be ready
while(keyboard.write(0xAA)!=0);
break;
case 0xFE: //resend
ack();
break;
case 0xF6: //set defaults
//enter stream mode
ack();
break;
case 0xF5: //disable data reporting
//FM
enabled = 0;
ack();
break;
case 0xF4: //enable data reporting
//FM
enabled = 1;
ack();
break;
case 0xF3: //set typematic rate
ack();
keyboard.read(&val); //do nothing with the rate
ack();
break;
case 0xF2: //get device id
ack();
keyboard.write(0xAB);
keyboard.write(0x83);
break;
case 0xF0: //set scan code set
ack();
keyboard.read(&val); //do nothing with the rate
ack();
break;
case 0xEE: //echo
//ack();
keyboard.write(0xEE);
break;
case 0xED: //set/reset LEDs
ack();
keyboard.read(&val); //do nothing with the rate
ack();
break;
}
}
void connectHost() {
while (Serial.available() <= 0) {
Serial.print('A'); // send a capital A
delay(300);
}
}
void setup() {
pinMode(13, OUTPUT);
//establish serial connection with host
Serial.begin(9600);
// establish ps/2 connection with target
while(keyboard.write(0xAA)!=0){
digitalWrite(13, HIGH);
delay(500);
digitalWrite(13, LOW);
delay(500);
}
delay(100);
connectHost();
Serial.println("\nSerial Host Connected");
Serial.flush();
}
void loop() {
unsigned char c;
if( (digitalRead(3)==LOW) || (digitalRead(2) == LOW)) {
if(digitalRead(3)==LOW){
Serial.println("pin 3 is LOW");
} else {
Serial.println("pin 2 is LOW");
}
while(keyboard.read(&c));
kbdCmd(c);
Serial.print("Target: 0x");
Serial.println(c, HEX);
}
else {//if host device wants to send a command:
//echo ASCII code from terminal and write to ps/2
if(Serial.available() > 0) {
incomingByte = Serial.read();
keyboard.write(incomingByte);
Serial.print("Host: 0x");
Serial.print(incomingByte, HEX);
Serial.print(" ");
Serial.print(incomingByte);
Serial.print(" ");
Serial.println(incomingByte, BIN);
}
}
}