¿Puede el Arduino Leonardo actuar como teclado, mouse y puerto serie al mismo tiempo?

1

Estoy haciendo un proyecto que requiere que controle una combinación de teclado / mouse y un puerto serie para activarlo. (Lo sé, puede evitar que use mi computadora, etc. pero tengo precauciones ya establecidas). Sin embargo, ¿puede el Arduino Leonardo ser dos dispositivos (o técnicamente tres) a la vez sin ningún hardware adicional? Sé que Arduino tiene un ejemplo sobre cómo usar el teclado y el mouse a la vez, pero ¿es posible que Leonardo calcule el "triatlón de las comunicaciones en serie?"

Sé que hay una salida que va al USB y otra que puede ir al TX / RX, así que técnicamente podría comprar un convertidor de serie a USB y conectarlo para el lado de la serie, pero eso puede ser caro y Pobre dos puertos USB en lugar de uno (muy valioso en una computadora portátil y un concentrador no es económico cuando agregas el envío y el precio para el módulo UART, y es más divertido resolver esto.

    

3 respuestas

3

Parece que el ejemplo de teclado y mouse en el sitio de arduino ya tiene un método para leer el puerto serie.



/*
  KeyboardAndMouseControl

 Controls the mouse from five pushbuttons on an Arduino Leonardo or Micro.

 Hardware:
 * 5 pushbuttons attached to D2, D3, D4, D5, D6


 The mouse movement is always relative. This sketch reads 
 four pushbuttons, and uses them to set the movement of the mouse.

 WARNING:  When you use the Mouse.move() command, the Arduino takes
 over your mouse!  Make sure you have control before you use the mouse commands.

 created 15 Mar 2012
 modified 27 Mar 2012
 by Tom Igoe

 this code is in the public domain

 */

// set pin numbers for the five buttons:
const int upButton = 2;     
const int downButton = 3;        
const int leftButton = 4;
const int rightButton = 5;
const int mouseButton = 6;

void setup() { // initialize the buttons' inputs:
  pinMode(upButton, INPUT);       
  pinMode(downButton, INPUT);       
  pinMode(leftButton, INPUT);       
  pinMode(rightButton, INPUT);       
  pinMode(mouseButton, INPUT);

  Serial.begin(9600);
  // initialize mouse control:
  Mouse.begin();
  Keyboard.begin();
}

void loop() {

aquí mismo:


  // use serial input to control the mouse:
  if (Serial.available() > 0) {
    char inChar = Serial.read();

    switch (inChar) {   
    case 'u':
      // move mouse up
      Mouse.move(0, -40);
      break; 
    case 'd':
      // move mouse down
      Mouse.move(0, 40);
      break;
    case 'l':
      // move mouse left
      Mouse.move(-40, 0);
      break;
    case 'r':
      // move mouse right
      Mouse.move(40, 0);
      break;
    case 'm':
      // perform mouse left click
      Mouse.click(MOUSE_LEFT);
      break;
    }
  }

  // use the pushbuttons to control the keyboard:
  if (digitalRead(upButton) == HIGH) {
    Keyboard.write('u'); 
  }
  if (digitalRead(downButton) == HIGH) {
    Keyboard.write('d'); 
  }
  if (digitalRead(leftButton) == HIGH) {
    Keyboard.write('l'); 
  }
  if (digitalRead(rightButton) == HIGH) {
    Keyboard.write('r'); 
  }
  if (digitalRead(mouseButton) == HIGH) {
    Keyboard.write('m'); 
  }

}


Si puedes leer el puerto serie, parece que también puedes escribir en él. No tengo un tablero leonardo para probar esto, pero dentro de la función loop() debería poder agregar algo como


Serial.print("hello world");

y verifica esto mientras se ejecutan Mouse y Keyboard también.

    
respondido por el Steve Cooley
2

Usando un Arduino Leonardo y un boceto modificado basado en el código del ejemplo de referencia KeyboardSerial pude verifique que sea posible utilizar la conexión en serie a través del mismo cable USB que la simulación del teclado HID.

Utilicé el siguiente código:

#include "Keyboard.h"

void setup() {
  // open the serial port:
  Serial.begin(9600);
  // initialize control over the keyboard:
  Keyboard.begin();
}

void loop() {
  // check for incoming serial data:
  if (Serial.available() > 0) {
    // read incoming serial data:
    char inChar = Serial.read();
    Serial.write(inChar);
    // Type the next ASCII value from what you received:
    // Keyboard.write(inChar + 1);
    Keyboard.press(KEY_CAPS_LOCK);
    delay(100);
    Keyboard.releaseAll();
  }
}

Al conectarme al puerto COM de Leonardo (p. ej., utilizando PuTTY) obtuve:

THe cApSlOcK lEd Is tOgGlInG WiTh eVeRy kEy sTrOkE.

Nota: la salida del terminal es un eco de la entrada enviada por el Arduino

Serial.write(inChar);

declaración.

    
1

No se puede hacer en serie al mismo tiempo que actúa como un dispositivo HID. Resolví esto usando un cable serial usb-5v y usando el segundo puerto serial en el Leonardo (es decir, Serial1.begin (9600))

    
respondido por el Jeff Berezin

Lea otras preguntas en las etiquetas