¿El Arduino Leonardo puede actuar como teclado, mouse y puerto serie al mismo tiempo?

Estoy haciendo un proyecto que requiere que controle una combinación de mouse/teclado y un puerto serie para activarlo. (Lo sé, puede evitar que use mi computadora, etc., pero ya tengo precauciones). Sin embargo, ¿el Arduino Leonardo puede 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, por lo que técnicamente podría comprar un convertidor de serie a USB y conectarlo al lado de la serie, pero eso puede ser costoso y acaparar dos USB . puertos en lugar de uno (muy valioso en una computadora portátil y un concentrador no es económico cuando agrega el envío y el precio del módulo UART, y es más divertido resolver esto.

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 puede leer el puerto serie, parece que también puede escribir en él. No tengo un tablero de leonardo para probar esto yo mismo, pero dentro de la loop()función deberías poder agregar algo como


Serial.print("hello world");

y verifique esto mientras los Mousey Keyboardtambién se están ejecutando.

Usando un Arduino Leonardo y un boceto modificado basado en el código del ejemplo de referencia KeyboardSerial , pude verificar que es posible usar la conexión serial sobre el mismo cable USB que la simulación del teclado HID.

Use 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 (por ejemplo, usando 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.

Pero puede que no sea fiable . Puede bloquearse por completo, pero solo si un programa está conectado a la serie (como PuTTY) aquí (o con una probabilidad mucho mayor). Obtuve bloqueos de la aplicación Arduino en sí misma para generar aproximadamente 35 caracteres de información (de depuración) por pulsación de tecla (o liberación de tecla) al puerto serie. Esto también fue en un Arduino Leonardo.
continuación: la aplicación Arduino se bloqueó (dejó de responder por completo o mostró un comportamiento errático), la conexión del puerto serie falló (se cerró a la fuerza y ​​los programas de terminal que usé dejaron de ejecutarse) y fue necesario apagar y encender para recuperar la aplicación Arduino. En su mayoría fue intermitente, pero encontré un escenario en el que podía reproducir el problema de manera confiable. Se bloqueó tanto para el "Monitor en serie" incorporado como para usar " Pantalla " como un programa de terminal en serie.
Mucho puede depender de los detalles exactos: tasa de pulsaciones de teclas, cómo se intercala con la salida en serie, el contenido exacto de la salida en serie y el momento de la misma, la versión del cargador de arranque (por ejemplo, errores en él) , etc. Por ejemplo, solo noté este problema al comenzar a usar el segundo puerto serie ('Serial1') para otro propósito (recibir datos de un puerto PS/2). Los dos puertos deben ser completamente independientes entre sí. También podría deberse a que se usa más la salida de depuración, no relacionada con el segundo puerto serie.
Para mayor confiabilidad en el extremo del host , la tasa de escritura de teclas se limitó a aproximadamente 50 por segundo (20 ms): 10 ms de retraso para presionar la tecla y 10 ms para soltar la tecla.

No puede funcionar 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))

Me pregunto por qué el código de ejemplo de Arduino tiene eso...
Puede. Al ser un dispositivo usb compuesto con múltiples perfiles.