Arduino: No consigo emular los botones de un ratón

Scooter

Cascarrabias crónico
He hecho un programa para emular un ratón USB con un joystick y va bien pero no consigo emular la tecla derecha ni la central del ratón; haga lo que haga se "pulsa" el botón izquierdo.

He probado con Mouse.press (MOUSE_RIGHT) y después Mouse.release y con Mouse.click directamente.

En todos los casos obtengo el resultado de (MOUSE_LEFT) o de ()

El código va bien porque he probado a imprimir mensajes para saber si pasa por ahí o no y si que pasa cuando debe.

También he probado a dar valores para no usar las constantes y pasa lo mismo; todos son el botón izquierdo
 
creo que deberías publicar código y que Arduino estás usando en lugar de solo decir que no funciona.
 
Si, es cierto.
Este tipo de acción solo se puede hacer con los que tienen usb nativo, en mi caso el leonardo.
El código es algo extenso y va perfectamente, entra donde tiene que entrar pero hace la función normal y no la que yo le digo que haga.
De este proyecto ya hablé aquí, y están los esquemas y el código, ahora lo estoy completando un poco porque tengo dos layouts de teclado seleccionables con un pulsador y he añadido el botón derecho del ratón que es lo que no funciona. El botón derecho del ratón se activa con un pulsador que da 0V en el pin 11, funciona pero hace como si pulsase el botón izquierdo independientemente del parámetro que le ponga a la función.
Aquí el código completo, en rojo está la linea que no funciona como debiera:
Código:
/*
Lectura de teclado de ORIC atmos y jostick analógico para hacer de ratón y teclado usb
 */
int indice = 0; 
int MisPines[] = {3,4,5,6,7,8,9,10};  //Orden de los pines de columnas.
char Tabla[] ={0,'1','x','7','v','3','n','5',
               0,177,'q','j','f','d','t','r',
               128,'z','2','m','4','c','6','b',
               0,0,'º','k','-',39,'9',';',
               133,216,217,' ',218,215,',','.',
               130,178,']','u','p','[','i','o',
               0,'a','s','y','e','w','h','g',
               129,176,0,'8','/','=','l','0',
               
               0,194,'x',200,'v',196,'n',198,
               0,179,'q','j','f','d','t','r',
               128,'z',195,'m',197,'c',199,'b',
               0,0,'º','k',204,39,202,';',
               133,216,217,' ',218,215,',','.',
               130,212,']','u','p','[','i','o',
               0,'a','s','y','e','w','h','g',
               129,176,0,201,'/',205,'l',203
             };
             
char teclado;
char pulsadas[] = {0,0,0,0,0,0,0,0}; // Flags para saber si la tecla estaba pulsada o no 
char tecla = 0; //valor por defecto de la tecla
char oldtec = 0; //valor de la tecla antigua
char tecrat=0; //La tecla del ratón no está pulsada


void setup() { // initialize the buttons' inputs:
  
  // Inicializar hid usb
  Mouse.begin();
  Keyboard.begin();
  
  digitalWrite(12,HIGH);    //Activa la resistencia interna de pullup
  digitalWrite(11,HIGH);    //Activa la resistencia interna de pullup este pin se usa para parar el teclado
  digitalWrite(13,HIGH);    //Activa la resistencia interna de pullup del pulsador de segundo teclado
  
  pinMode(0, OUTPUT);     
  pinMode(1, OUTPUT);
  pinMode(2, OUTPUT);

  //Activar resistencias pullup
  for (int cont = 0; cont < 8 ; cont++){
    digitalWrite(MisPines[cont],HIGH);
  }
}

void loop() {
  // use serial input to control the mouse:
if (digitalRead(13)==HIGH || digitalRead(11)==HIGH){
rata();

if (digitalRead(12)==LOW){
  if (tecrat == 0){
    Mouse.press();
    tecrat=1;
}
}
else{
   if (tecrat == 1){
    Mouse.release();
    tecrat=0;
} 
}
if (digitalRead(11)==LOW){  
  if (tecrat == 0){
   [COLOR="Red"] Mouse.press(MOUSE_RIGHT);  // Esto es lo que no funciona, hace como si fuese Mouse.press();[/COLOR]
    tecrat=1;
}
}
else{
   if (tecrat == 1){
    Mouse.release(MOUSE_RIGHT);
    tecrat=0;
} 
}
 for (int col = 0; col<8 ; col++){
      //Selección de columna
      digitalWrite(0, (col & 4)/4);
      digitalWrite(1, (col & 2)/2);
      digitalWrite(2, (col & 1));
   for(int row = 0; row<8 ; row++){
      //Selección de Fila
teclado=digitalRead(13);
      if (teclado == HIGH){
        indice = (col*8+row);
      }
      else{
        indice = 64+(col*8+row);
      }
      tecla = Tabla[indice];
      if(digitalRead(MisPines[row])==0){ //Tecla pulsada
        if (pulsadas[col] | 1<<row ==0){ //Anteriormente no pulsada
          Keyboard.press(tecla);    //Se manda la pulsación
          pulsadas[col] = pulsadas[col] ^ 1<<row; //se indica que está pulsada  (se le da la vuelta al bit)
        }
      }
      else{    //Tecla sin pulsar
       if (pulsadas[col] | 1<<row !=0){ //Anteriormente pulsada
          Keyboard.release(tecla);    //Se manda la despulsación
          pulsadas[col] = pulsadas[col] ^ 1<<row; //se indica que está pulsada (se le da la vuelta al bit)
        }
      }
   }
 } 
for (int equis=0; equis<7;equis++){
  rata();
 delay(2);  //Pequeño retardo para quitar rebotes
}


}
else{

}
}
void rata(){    //Rutina para mover el ratón
int X=(512-analogRead(0))/80;
int Y=(analogRead(1)-512)/80;
      Mouse.move(X,Y);
}
 
Última edición:
Es raro, solo se me ocurre que intentes modificar la cabecera USBAPI.h y cambies las entradas
Código:
class Mouse_
{
private:
	uint8_t _buttons;
	void buttons(uint8_t b);
public:
	Mouse_(void);
	void begin(void);
	void end(void);
	void click(uint8_t b = MOUSE_LEFT);
	void move(signed char x, signed char y, signed char wheel = 0);	
	void press(uint8_t b = MOUSE_LEFT);		// press LEFT by default
	void release(uint8_t b = MOUSE_LEFT);	// release LEFT by default
	bool isPressed(uint8_t b = MOUSE_LEFT);	// check LEFT by default
};
extern Mouse_ Mouse;
dejando solo
Código:
class Mouse_
{
private:
	uint8_t _buttons;
	void buttons(uint8_t b);
public:
	Mouse_(void);
	void begin(void);
	void end(void);
	void click(uint8_t b);
	void move(signed char x, signed char y, signed char wheel = 0);	
	void press(uint8_t b);
	void release(uint8_t b);
	bool isPressed(uint8_t b);
};
extern Mouse_ Mouse;
Luego tendrás que declarar explícitamente MOUSE_LEFT cuando uses las funciones, no se si por eso el compilador lo sobre escriba asignando el MOUSE_LEFT.
 
Pues podría ser, lo probaré cuando tenga un rato.

Otra cosa que se me ocurre es que haya un bug y las tres constantes estén definidas igual. Hbría que ver donde están definidas. Edito, eso no es, ya que están definidas como 1, 2 y 4 y no es ese problema porque pasé esos parámetros como Mouse.click(2) y lo que hace siempre es 1, osea MOUSE_LEFT
 
Última edición:
Atrás
Arriba