Эмулирую клавиатуру с Arduino.
- Войдите на сайт для отправки комментариев
Здравствуйте.
Пытаюсь с помощью UNO эмулировать PS2 клавиатуру. Чтобы при загрузке компьютера она инициализировалась, как стандартная клавиатура ps2.
За основу взял этот скетч. у меня он не работает. МОжет кто-то глянуть его?
#include "ps2dev.h"
// 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;
int tempint=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();
}
int SerialreadHEX(){
byte c = Serial.read();
if(c>-'0' && c<='9'){
return c - '0';
}
else if (c>='a' && c<='f'){
return c - 'a'+10;
}
else if (c>='a' && c<='f'){
return c - 'a'+10;
}
else if (c>='A' && c<='F'){
return c - 'A'+10;
}
else {
return -1;
}
}
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();
incomingByte=SerialreadHEX();
delay(5);
if(incomingByte>-1 && Serial.available() > 0) {
tempint=SerialreadHEX();
if (tempint>-1){
incomingByte=(incomingByte*16)+tempint;
}
}
keyboard.write(incomingByte);
Serial.print("ost: 0x");
Serial.print(incomingByte, HEX);
Serial.print(" ");
Serial.print(incomingByte);
Serial.print(" ");
Serial.println(incomingByte, BIN);
}
}
delay(10);
}
для того чтобы не страдать такой фигней
сначало Atmel заказал и ему зделали спец прошивку и вуаля KeyboardArduinoUnoR3->usb->computer->windows
потом Atmel вместе с Arduino Microsoft доделали одночиповую плату Arduino Leonardo которая по определению эмулирует 3 варианта устрйств Keyboard-usb-windows/linux mouse-usb-windows/linux joystick-usb-windows/linux
потом еще спец маленькте платку что грамотно не мешать в кучу а три отдельных устройства втыкать не помню имя
Вы то что пытаетесь старую прочну банковскую игрально автоматную за 200$ DIN клавиатуру в PS/2 или usb воткнуть с помошью 25$.
Или 6$ массовое не ремонтируемое одноразовое ширпотребище воткнуть с помошью 25$.
Овчинка выделки не стоит.
Короче во все игры поиграл лень даже код смотреть зеленый какойто
Спасибо. Но лучше бы больше конструктива.
Возможность такой реализации встречал, поэтому знаю, что возможно. Из-за малого опыта работы, пока не получается реализовать самому. Для этого и существуют подобные форумы.
Спасибо. Но лучше бы больше конструктива.
Возможность такой реализации встречал, поэтому знаю, что возможно. Из-за малого опыта работы, пока не получается реализовать самому. Для этого и существуют подобные форумы.
На подобных форумах есть правила оформления постов. Ни у кого нет желания изучать ваш зеленый код. Тошнить начинает от одного вида.
Да, моя вина. Про оформление прочитал после. Изменить нет возможности. Если кто-то из модераторов может это сделать, пожалуйста.
да пожалуйсто
тоько мне над моим лень думать
а уж другой сегодня не осилю
//-некая хрень-------------------- #include "ps2dev.h" // Оранжевый = 2 // Синий = 3 // Красный = 5В (3 в) // Черный = GND (4 в) // EXT Power, USB для COM только PS2dev клавиатуры(3,2); // PS2dev объекта (2:данные, 3:clock) int enabled = 0; // псевдо-переменную состояния “клавиатура” boolean serialConnected = false; int incomingByte = 0; int tempint=0; //--------------------------- void ack() { //признаете команды while(keyboard.write(0xFA)); } //------------------------------ int kbdCmd(int command) { unsigned char val; switch (command) { case 0xFF: //reset ack(); //цикл while позволяет нам ждать хозяина, чтобы быть готовым while(keyboard.write(0xAA)!=0); break; случае 0xFE: //повторно ack(); break; случае 0xF6: //set defaults //ввести режим stream ack(); break; случае 0xF5: //отключение передачи данных в отчетности //FM enabled = 0; ack(); break; случае 0xF4: //включения данных отчетности //FM enabled = 1; ack(); break; случае 0xF3: //set typematic rate ack(); keyboard.read(&val); //ничего не делать со ставкой ack(); break; случае 0xF2: //get device id ack(); keyboard.write(0xAB); keyboard.write(0x83); break; дело 0xF0: //set scan code set ack(); keyboard.read(&val); //ничего не делать со ставкой ack(); break; случае 0xEE: //echo //ack(); keyboard.write(0xEE); break; случае 0xED: //набора/сброса светодиодов ack(); keyboard.read(&val); //ничего не делать со ставкой ack(); break; } } //---------------------------- void connectHost() { while (Serial.available() <= 0) { Serial.print (""); / / отправить в столице delay(300); } } //---------------------------- void setup() { pinMode(13, OUTPUT); //установить последовательное соединение с хостом Serial.begin(9600); // установить ps/2 соединение с целевой 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(); } //-------------------------------- int SerialreadHEX(){ byte c = Serial.read(); if(c>-'0' && c<='9'){ return c - '0'; } else if (c>='a' && c<='f'){ return c - 'a'+10; } else if (c>='a' && c<='f'){ return c - 'a'+10; } else if (c>='A' && c<='F'){ return c - 'A'+10; } else { return -1; } } //=========================== void loop() { unsigned char c; if( (digitalRead(3)==LOW) || (digitalRead(2) == LOW)) { if(digitalRead(3)==LOW){ Serial.println("pin 3 LOW"); } else { Serial.println("pin-2 - низкий"); } while(keyboard.read(&c)); kbdCmd(c); Serial.print("цель: 0x"); Serial.println ("c", HEX); } else {//если хост-устройства хочет отправить команду: //echo ASCII код из терминала и запись ps/2 if(Serial.available() > 0) { //incomingByte = Serial.read(); incomingByte=SerialreadHEX(); delay(5); если(incomingByte>-1 && Serial.available() > 0) { tempint=SerialreadHEX(); если (tempint>-1){ incomingByte=(incomingByte*16)+tempint; } } keyboard.write(incomingByte); Serial.print("ost: 0x"); Serial.print(incomingByte, HEX); Serial.print(" "); Serial.print(incomingByte); Serial.print(" "); Serial.println(incomingByte, BIN); } } delay(10); } //=================================ошибка аднака