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

Arduino Esplora — Fiche de carte · 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.

Objectifs

Pousser l'USB natif de l'ATmega32u4 dans ses retranchements : énumérer simultanément un clavier HID, une souris HID et un port série CDC, exactement le schéma des projets officiels EsploraRemote et EsploraTable. Le joystick déplace le curseur, les boutons cliquent et tapent, le slider règle le défilement, et le CDC reste disponible pour le débogage — la combinaison n'est possible que parce que le 32U4 gère l'USB dans le silicium.

Matériel

Code complet

/* Telecommande complete : souris + clavier + debug série en même temps.
   Pattern inspire des exemples officiels EsploraJoystickMouse/EsploraRemote.
   SECURITE : la condition d'arrêt (joystick en bas à 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 à 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);
}

Vérification attendue

Le curseur suit le joystick, le bouton bas clique, le slider fait défiler la page, les autres boutons envoient des flèches. Le moniteur série (CDC) reste vivant en parallèle : le message de démarrage s'affiche, prouvant la triple énumération HID+CDC. Le garde-fou (stick en bas 2 s) coupe toute émission avant de devenir génant.

Erreurs fréquentes

  1. Pas de garde-fou : avertissement officiel pour la classe Leonardo/Esplora — un croquis HID déréglé peut rendre le PC inutilisable ; prévoyez toujours une condition d'arrêt physique, et gardez le bouton Reset accessible (fenêtre bootloader ~8 s).
  2. Oublier Mouse.begin/Keyboard.begin : l'un des deux périphériques reste muet.
  3. Trop rapide : sans delay(20), l'hôte est inondé de rapports de souris ; le curseur saute et le PC rame.
  4. Croire perdre la série en ajoutant le HID : les bibliothèques Arduino combinent les descripteurs ; ce n'est qu'en écrivant un descripteur HID maison (lumino/usbdcore) qu'on contrôle la composition — et qu'on peut casser le CDC.
  5. Négliger les touches multimédia/spéciales : KEY_LEFT_ARROW n'existe pas en minuscule ; les constantes sont celles de Keyboard.h — une faute de frappe devient un caractère ASCII inattendu sur le poste.

Autres tutoriels pour cette carte

Exemples de code pour cette carte

← Retour à la fiche 🛠 Tous les tutoriels