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.
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 Mouse
y Keyboard
tambié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.
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))
Pedro Mortensen
Pedro Mortensen
Pedro Mortensen
Pedro Mortensen