Эмулирую клавиатуру с Arduino.

igi
Offline
Зарегистрирован: 29.08.2014

Здравствуйте.

Пытаюсь с помощью 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);

}

 

 

art100
Offline
Зарегистрирован: 09.03.2014

для того чтобы не страдать такой фигней

сначало 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$.

Овчинка выделки не стоит.

Короче во все игры поиграл лень даже код смотреть зеленый какойто

igi
Offline
Зарегистрирован: 29.08.2014

Спасибо. Но лучше бы больше конструктива.

Возможность такой реализации встречал, поэтому знаю, что возможно. Из-за малого опыта работы, пока не получается реализовать самому. Для этого и существуют подобные форумы.

Puhlyaviy
Puhlyaviy аватар
Offline
Зарегистрирован: 22.05.2013

igi пишет:

Спасибо. Но лучше бы больше конструктива.

Возможность такой реализации встречал, поэтому знаю, что возможно. Из-за малого опыта работы, пока не получается реализовать самому. Для этого и существуют подобные форумы.


На подобных форумах есть правила оформления постов. Ни у кого нет желания изучать ваш зеленый код. Тошнить начинает от одного вида.

igi
Offline
Зарегистрирован: 29.08.2014

Да, моя вина. Про оформление прочитал после. Изменить нет возможности. Если кто-то из модераторов может это сделать, пожалуйста.

art100
Offline
Зарегистрирован: 09.03.2014

да пожалуйсто

тоько мне над моим лень думать

а уж другой сегодня не осилю

//-некая хрень--------------------
#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);
}
//=================================

ошибка аднака



sketch_aug29a.ino:2:20: ошибка: ps2dev.h: нет такого файла или каталога
sketch_aug29a:8: ошибка: 'PS2dev' does not name a type
sketch_aug29a.ino: в функции " void ack()':
sketch_aug29a:15: ошибка: 'клавиатура' не был объявлен в этой области
sketch_aug29a.ino: в функции 'int kbdCmd(int)':
sketch_aug29a:24: ошибка: 'клавиатура' не был объявлен в этой области
sketch_aug29a:45: ошибка: 'клавиатура' не был объявлен в этой области
sketch_aug29a.ino: в функции " void setup()':
sketch_aug29a:82: ошибка: 'клавиатура' не был объявлен в этой области
sketch_aug29a.ino: в функции " void loop()':
sketch_aug29a:122: ошибка: " keyboard " не был объявлен в этой области
sketch_aug29a:139: ошибка: 'клавиатура' не был объявлен в этой области