🛠 Télécommande HID avancée : clavier + souris + série simultanés

Arduino Esplora — Ficha de placa · avance · Schéma : IMG-esplora-avance-2-esplora-hid-avance-telecommande.svg — Esplora au centre émettant trois flux USB vers l'ordinateur : clavier HID, souris HID et port série CDC, avec joystick pilotant le curseur et boutons les touches.

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

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

  1. 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).
  2. Olvidar Mouse.begin/Keyboard.begin: uno de los dos dispositivos permanece mudo.
  3. Demasiado rápido: sin delay(20), el host se inunda de informes del ratón; el cursor salta y el PC se ralentiza.
  4. 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.
  5. Descuidar las teclas multimedia/especiales: KEY_LEFT_ARROW no 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

← Volver a la ficha 🛠 Todos los tutoriales