Evet, Arduino.cc forumlarını aradım ve burada. Evet, ps2dev kütüphanesi ile ilgili makaleleri buldum. Evet, bu web sitesindeki kesin PS / 2 arayüz makalesini okudum (tamam, bazıları yağsız) . Evet, böyle çalışıyorum, biraz. Tam olarak çalışabilmek için bazı fikirlere ihtiyacım var. :)
Hayır, sadece bir USB HID Klavyeyi taklit edemem ve bırakamam - PS / 2 Klavye emülasyonu olması gerekiyor. Evet, doğru marka yapma ve kesme sinyalleri gönderiyorum - hatta çok karmaşık tuş vuruşu kombinasyonlarını bile ele alıyor. Şu anda olduğu gibi, Arduino'm için aşağıda belirtildiği gibi kod yazdım (teknik olarak bir Freeduino 1.22) ve Seri Monitör veya PuTTY terminali ile tuş vuruşlarını ve gerçek gönderen kullanışlı bir Python sarıcı / sürücü ile gönderdim PS / 2 tarama kodu bilgileri - ve genellikle hayatımı daha kolay hale getirir - ayrıca yükün bir kısmını Arduino'dan çıkarır.
Şu anda, Arduino'da çalışan bir PS / 2 Klavye taklit eden bir kroki var. Doğal olarak, "hedef" makinemi (PS / 2 Fişin girdiği makine) açmam gerekiyor ve "el sıkışmasının" gerçekleştiğini görüyorum. WinDoze'e önyükleme yapın, not defterini açın ve Python "sürücümü" kullanarak tuş vuruşlarını ekrana (başarılı bir şekilde) sürün. (Sürücü, Seri Monitör / PuTTY terminalinin yerini alır ve PySerial adlı bir modül kullanarak seri bağlantı noktasını okur / yazar.) Bunların hepsi ASUS anakart "target" içindeki bir AMD üzerinde yapılır.
Şimdi amaç, Intel anakart tabanlı "hedef" içinde Intel'im üzerinde çalışmasını sağlamak, takıyorum, önyükleme yapıyorum ve zar yok. Böylece, küçük Ardy arkadaşımda gerçekte olup bitenler hakkında bir fikir vermek için taslağı biraz değiştirdim. Modlardan sonraki sürüm aşağıda görüntülenir. Anladığım kadarıyla (kod burada başka bir Arduino.cc forum mesajından "ödünç alındı" ) İlk önce PS / 2 üzerinden "hedef" ile bir bağlantı kurmaya çalışacak. bağlantı kuruldu. Intel hedefi .5 saniyelik periyodu geçemez ve "host" ile Seri Bağlantı kurulmaz.
Sorum şu: ps / 2 klavyelerin hedef makineleriyle iletişim kurma biçiminde büyük bir fark var mı? Gerçekten bir tasarım farkı mı yoksa burada daha temel bir şey mi aramalıyım? Veri / saat girişlerinde pull-up dirençlere ihtiyaç duyma hakkında bir şey duydum, ancak kodda ele alınmalı, özellikle de başka bir hedef üzerinde çalışıyor, çünkü üzerinde çalışmam gereken bir şey değil.
Herhangi bir fikir? Bu ASAP çalışmak istiyorum - hata ayıklama yapmaya devam edeceğim, herhangi bir işaretçi veya öneri büyük takdir edilecektir. Hepsine tam olarak bakılacak çünkü bu konuda bazı taze gözlere ihtiyacım var. Belki de ps2dev kütüphanesinde daha iyi uygulama gereklidir?
#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);
}
}
}