🛠 Télécommande HID avancée : clavier + souris + série simultanés
Objetivos
Llevar el USB nativo del ATmega32u4 al límite: enumerar simultáneamente un teclado HID, un ratón HID y un puerto serie CDC, exactamente el esquema de los proyectos oficiales EsploraRemote y EsploraTable. El joystick mueve el cursor, los botones hacen clic y escriben, el deslizador ajusta el desplazamiento, y el CDC permanece disponible para depuración — esta combinación solo es posible porque el 32U4 gestiona el USB en el silicio.
Material
- Arduino Esplora + cable micro-USB.
- Bibliotecas Esplora, Keyboard, Mouse (core
arduino:avr). - Un PC de prueba (¡desconecte el teclado/ratón principales si teme quedarse fuera!).
Código completo
/* Telecommande complete : souris + clavier + debug serie en meme temps.
Pattern inspire des exemples officiels EsploraJoystickMouse/EsploraRemote.
SECURITE : la condition d'arret (joystick en bas a fond pendant 2 s)
laisse toujours une porte de sortie avant de lacher du HID sur le poste. */
#include <Esplora.h>
#include <Mouse.h>
#include <Keyboard.h>
uint32_t appuiJoystick = 0;
void setup {
Serial.begin(9600);
Mouse.begin;
Keyboard.begin;
delay(2000); // laisse le temps de lire ce message
Serial.println("Pret. Joystick en bas a fond 2 s = mode sans HID.");
}
void loop {
int x = Esplora.readJoystickX;
int y = Esplora.readJoystickY;
// Garde-fou : maintenir le stick en bas arrete toute emission HID
if (y < -480) {
if (appuiJoystick == 0) appuiJoystick = millis;
if (millis - appuiJoystick > 2000) {
Serial.println("HID desactive, je dors.");
while (true) delay(1000); // plus aucun mouvement souris/clavier
}
} else {
appuiJoystick = 0;
}
// Souris : deplacement proportionnel avec zone morte
if (abs(x) > 15 || abs(y) > 15) Mouse.move(x / 32, y / 32);
// Clic gauche = bouton bas ; molette = slider
if (Esplora.readButton(SWITCH_DOWN) == PRESSED && !Mouse.isPressed(MOUSE_LEFT))
Mouse.press(MOUSE_LEFT);
if (Esplora.readButton(SWITCH_DOWN) == RELEASED && Mouse.isPressed(MOUSE_LEFT))
Mouse.release(MOUSE_LEFT);
int s = Esplora.readSlider;
if (s > 900) Mouse.move(0, 0, 1);
if (s < 100) Mouse.move(0, 0, -1);
// Clavier : fleches avec les autres boutons
if (Esplora.readButton(SWITCH_LEFT) == PRESSED) Keyboard.write(KEY_LEFT_ARROW);
if (Esplora.readButton(SWITCH_RIGHT) == PRESSED) Keyboard.write(KEY_RIGHT_ARROW);
if (Esplora.readButton(SWITCH_UP) == PRESSED) Keyboard.write(KEY_UP_ARROW);
delay(20);
}
Verificación esperada
El cursor sigue al joystick, el botón inferior hace clic, el deslizador desplaza la página, los demás botones envían flechas. El monitor serie (CDC) permanece activo en paralelo: se muestra el mensaje de inicio, lo que demuestra la triple enumeración HID+CDC. La salvaguarda (palanca hacia abajo durante 2 s) corta toda emisión antes de resultar molesta.
Errores frecuentes
- Sin salvaguarda: advertencia oficial para la clase Leonardo/Esplora — un boceto HID mal ajustado puede hacer inutilizable el PC; prevea siempre una condición de parada física, y mantenga el botón Reset accesible (ventana del bootloader ~8 s).
- Olvidar
Mouse.begin/Keyboard.begin: uno de los dos dispositivos permanece mudo. - Demasiado rápido: sin
delay(20), el host se inunda de informes del ratón; el cursor salta y el PC se ralentiza. - Creer que se pierde el serie al añadir el HID: las bibliotecas de Arduino combinan los descriptores; solo al escribir un descriptor HID propio (lumino/usbdcore) se controla la composición — y se puede romper el CDC.
- Descuidar las teclas multimedia/especiales:
KEY_LEFT_ARROWno existe en minúsculas; las constantes son las de Keyboard.h — una errata se convierte en un carácter ASCII inesperado en el puesto.
Otros tutoriales para esta placa
Ejemplos de código para esta placa
joystick-couleur.inoArduinojeu-boutons.inoArduinoslider-luminosite.inoArduinothermometre-couleur.inoArduinosonometre.inoArduinoaccelerometre-tilt.inoArduino