예, Arduino.cc 포럼과 여기를 검색했습니다. 예, ps2dev 라이브러리에 관한 기사를 찾았습니다. 예, 이 웹 사이트 에서 결정적인 PS / 2 인터페이스 기사를 읽었습니다 . 예,이 작업이 약간 있습니다. 완전히 일할 수 있도록 몇 가지 아이디어가 필요합니다. :)
아니요, USB HID 키보드를 에뮬레이트하고 그대로 둘 수는 없습니다. PS / 2 키보드 에뮬레이션이어야합니다. 예, 적절한 make and break 신호를 보내고 있습니다. 심지어 매우 복잡한 키 스트로크 조합도 처리합니다. 현재로서는 Arduino 용으로 작성된 코드가 아래에 게시되어 있으며 (기술적으로 Freeduino 1.22) 직렬 모니터 또는 PuTTY 터미널과 실제 Python 전송기 / 드라이버를 통해 키 입력을 보냈습니다. PS / 2 스캔 코드 정보 (일반적으로 생활이 훨씬 쉬워 짐)는 물론 Arduino의 부담을 덜어줍니다.
지금은 Arduino에서 PS / 2 키보드를 에뮬레이트하는 스케치가 있습니다. 당연히, "대상"머신 (PS / 2 플러그가 들어가는 머신)을 부팅해야하며 "핸드 셰이크"가 발생하는 것을 볼 수 있습니다. WinDoze로 부팅하고 메모장을 연 다음 Python "드라이버"를 사용하여 화면에 키 입력을 성공적으로 수행하십시오. (드라이버는 단순히 Serial Monitor / PuTTY 터미널을 대신하여 PySerial이라는 모듈을 사용하여 직렬 포트를 읽거나 씁니다.) 이것은 모두 ASUS 마더 보드 "대상"의 AMD에서 수행됩니다.
이제 목표는 인텔 마더 보드 기반 "대상"으로 인텔에서 작동하도록하는 것입니다. 플러그를 꽂고 부팅하고 주사위를 사용하지 않습니다. 그래서 저는 스케치를 약간 수정하여 제 작은 Ardy 친구에게 실제로 무슨 일이 일어나고 있는지를 직접 보여주었습니다. 개조 후의 버전이 아래에 표시됩니다. 내가 (코드는 다른 Arduino.cc 포럼의 게시물에서 "빌려"한 그것을 이해 여기에 ) 그것은 때까지 0.5 초 기간에 온보드 LED를 점멸, 시도하고 첫 PS / 2를 통해 "대상"과의 연결을 설정합니다 연결이 설정되었습니다. 인텔 대상이 0.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);
}
}
}