scan-hote-usb.ino

Arduino Mega ADK (Rev3) · Fichier : scan-hote-usb.ino · Langage : Arduino · Usage : Détecter et identifier l'appareil branché sur le port USB-A

Grâce au MAX3421E, la Mega ADK parle en maître USB vers un périphérique — l'inverse de son rôle habituel de cible. Ce scan affiche VID/PID de ce qu'on branche sur le port USB-A : la première étape avant tout pilote.

Matériel requis

Une Arduino Mega ADK Rev3 (ATmega2560 + puce hôte USB MAX3421E avec port USB-A, broche D7 réservée au reset du MAX3421E). 1 périphérique USB 5 V faible consommation (clé USB, souris, second Arduino en bootloader…).

Branchement

Rien : le périphérique se branche directement sur le port USB-A ; ne pas utiliser la broche D7 (reset du MAX3421E).

Fonctionnement

Usb.Init démarre le contrôleur hôte ; la machine d'états USB monte l'appareil et getDevDescr expose son identifiant fabricant/produit. Carte « Arduino Mega ADK » dans l'IDE. Pour l'hôte USB/ADK, installez la bibliothèque USB Host Shield 2.0 ; ne pas utiliser D7. Le port USB-A alimente l'accessoire en 5 V.

Pour aller plus loin

Une fois le VID/PID connu, cherchez la classe de l'appareil (HID, stockage…) dans la doc USB Host Shield 2.0 pour le pilote adapté.

scan-hote-usb.ino

// Inversion de role : la Mega ADK devient maitre USB (MAX3421E).
// Bibliotheque : USB Host Shield 2.0 (Arduino IDE > Gestionnaire).
#include <Max3421e.h>
#include <Usb.h>

USB Usb;

void setup() {
  Serial.begin(115200);
  while (!Serial);
  if (Usb.Init() == -1) { Serial.println(F("MAX3421E introuvable")); while (1); }
  Serial.println(F("Hote USB pret (D7 reserve au reset MAX3421E)"));
}

void loop() {
  uint8_t etat = Usb.getUsbTaskState();
  if (etat == USB_STATE_RUNNING) {
    USB_DEVICE_DESCRIPTOR dev;
    Usb.getDevDescr(); // remplit devDesc
    Serial.print(F("Appareil actif VID=0x"));
    Serial.print(devDesc.idVendor, HEX);
    Serial.print(F(" PID=0x"));
    Serial.println(devDesc.idProduct, HEX);
  } else {
    Serial.print(F("Etat USB: 0x"));
    Serial.println(etat, HEX);
  }
  delay(2000);
}

← Retour à la fiche