🛠 HID host : clavier, souris et scanner sur le port USB-A
Objectifs
Utiliser la Mega ADK comme un vrai hôte USB autonome, sans Android : la page officielle de la carte vante l'interfaçage « with keyboard, mouse and games controllers as Wiimote and PS3 », et des utilisateurs 2024 lisent des lecteurs de code-barres USB par le port intégré. Un clavier HID se branche directement sur le port USB-A ; la bibliothèque maintenue USB Host Shield 2.0 fournit les classes HID. C'est la seconde vie de la carte : un contrôleur AVR avec port USB host intégré, la seule de sa génération.
Matériel
- 1 × Arduino Mega ADK + alimentation externe 7–12 V 1,5 A conseillée (un clavier avec rétroéclairage peut tirer plus de 100 mA ; le polyfuse du port limite à 500 mA)
- 1 × clavier USB filaire simple (les claviers sans fil avec dongle propriétaire 2,4 GHz ne sont pas des HID standards ; les appareils de classe Bluetooth sur le port host étaient déjà expérimentaux en 2012)
- 1 × lecteur de code-barres USB HID en émulation clavier (alternative au clavier)
- Bibliothèque : USB Host Shield 2.0 (menus Gestionnaire de bibliothèque > USB Host Shield 2.0 > HID > HIDKeyboard)
Code complet
// mega-adk-hid-clavier.ino — Board: "Arduino Mega ADK"
// D'après l'exemple HIDKeyboard de USB Host Shield 2.0 (API à confirmer
// avec la version installée).
#include <Usb.h>
#include <hid.h>
#include <hidkeyboard.h>
USB Usb;
USBHID HID;
HIDKeyboard Keyboard(&HID);
void setup {
Serial.begin(115200);
if (Usb.Init == -1) { Serial.println(F("OSCOKIRQ failed to assert")); while (1); }
if (HID.Init != 0) { Serial.println(F("Init HID impossible")); while (1); }
if (Keyboard.Init(&HID) != 0) { Serial.println(F("Clavier non reconnu")); }
Serial.println(F("Branchez/frappez sur le clavier USB-A..."));
}
void loop {
Usb.Task;
if (!Keyboard.isOK) return;
uint8_t touche[6];
// lit le rapport de touche HID (6 touches simultanées max)
if (Keyboard.getReport == 0 && Keyboard.NakPoll) {
Keyboard.getKeyReport(touche);
for (int i = 0; i < 6; i++) {
if (touche[i]) {
Serial.print(F("code HID 0x"));
Serial.println(touche[i], HEX);
}
}
}
}
Vérification attendue
Après branchement du clavier sur le port USB-A, la bibliothèque énumère le périphérique (led NumLock du clavier souvent allumée par la réinitialisation HID) ; chaque frappe imprime les codes de touche sur la console série. Avec un lecteur de code-barres en émulation clavier, chaque scan produit la séquence de touches correspondant au code-barres suivi d'Entrée. Aucun téléphone n'est impliqué : la carte se suffit à elle-même.
Erreurs fréquentes
- Clavier sans fil à dongle propriétaire ou appareil « Bluetooth class » : non reconnu comme HID standard — le port host attend un HID filaire (ou un dongle se déclarant HID).
- Oublier Usb.Task dans loop : sans lui, aucun rapport HID n'est jamais reçu.
- Négliger le courant du périphérique : clavier rétroéclairé + téléphone sur la même carte en alimentation USB = plafond 500 mA dépassé, polyfuse qui saute.
- Compiler avec la mauvaise variante de carte : les broches MAX3421E de l'ADK diffèrent du shield standard (SS PB4 sur shield, autre chose sur ADK) — sélectionner BOARD_MEGA_ADK ou le menu adéquat.
- Attendre du texte ASCII : le rapport HID fournit des codes touche (usage table HID), pas des caractères — la traduction AZERTY/QWERTY est à votre charge.
- Mélanger avec d'autres périphériques SPI sur le bus : le MAX3421E y siège en permanence ; tout autre maître SPI doit le désélectionner proprement pendant ses transferts.
Autres tutoriels pour cette carte
Exemples de code pour cette carte
clignotante.inoArduinobouton-led.inoArduinoscan-hote-usb.inoArduinoadk-chat-android.inoArduinoadk-telemetrie.inoArduinohote-clavier-usb.inoArduino