🛠 USB HID + CDC et BLE simultanés
Objectifs
Exploiter la double interface du nRF52840 : le contrôleur USB natif (TinyUSB : CDC, HID, MIDI, mass storage) EN MÊME TEMPS que la radio BLE (SoftDevice). Vous construirez un mini-clavier d'urgence : frappe sur le bouton USER → frappe clavier USB (HID), télémétrie sur le port série CDC, et alerte BLE vers le téléphone. C'est l'apanage de ce SoC : seul BLE grand public avec USB natif assez fourni en RAM (256 KB).
Matériel
- 1× Adafruit Feather nRF52840 Express + câble micro-USB à données
- Bibliothèques : Adafruit TinyUSB Arduino, Adafruit Bluefruit nRF52 Libraries
- Smartphone avec Bluefruit LE Connect
Code complet
// nrf52840-usb-hid-cdc-ble.ino
#include <bluefruit.h>
#include "Adafruit_TinyUSB.h"
BLEUart bleuart;
const uint8_t BTN = 9; // >
// Descripteur HID clavier de démarrage standard
static const uint8_t hid_kbd_desc[] = {
0x05,0x01,0x09,0x06,0xA1,0x01,0x05,0x07,0x19,0xE0,0x29,0xE7,
0x15,0x00,0x25,0x01,0x75,0x01,0x95,0x08,0x81,0x02,0x95,0x01,
0x75,0x08,0x81,0x03,0x95,0x06,0x75,0x08,0x15,0x00,0x25,0xFF,
0x05,0x07,0x19,0x00,0x29,0xFF,0x81,0x00,0xC0 };
Adafruit_USBD_HID usb_kbd;
uint8_t kbd_report[8] = {0};
void setup {
Serial.begin(115200); // CDC USB (telemetrie)
pinMode(BTN, INPUT_PULLUP);
usb_kbd.setPollingInterval(10);
usb_kbd.begin(hid_kbd_desc, sizeof(hid_kbd_desc), 1, 1, 0); // HID clavier
Bluefruit.begin; // BLE en parallele de l'USB
Bluefruit.setName("52840-Alerte");
bleuart.begin;
Bluefruit.Advertising.addService(bleuart);
Bluefruit.Advertising.start(0);
}
void loop {
if (!digitalRead(BTN)) { // appui : frappe 'A' en HID
kbd_report[2] = 0x04; // usage HID 'A'
usb_kbd.sendReport(0, kbd_report, sizeof(kbd_report));
bleuart.printf("ALERTE bouton a %lu ms\n", millis);
Serial.println("HID: A envoye, alerte BLE transmise");
delay(300);
kbd_report[2] = 0;
usb_kbd.sendReport(0, kbd_report, sizeof(kbd_report));
}
}
Vérification attendue
Dans un traitement de texte, chaque appui sur USER saisit « A » (prouve le HID) ; le moniteur série affiche la télémétrie CDC (les deux coexistent car ce sont des interfaces USB différentes) ; l'app Bluefruit reçoit « ALERTE bouton… ». Les trois canaux fonctionnent concurremment.
Erreurs fréquentes
- Oublier d'attendre
usb_kbd.readyavant les premiers rapports : sous Windows, le HID peut mettre ~1 s à s'énumérer. - Confondre
Serial(CDC) et HID : l'un va au moniteur série, l'autre au système comme clavier — deux interfaces sur le même câble. - Timing dur avec BLE actif : la SoftDevice prime sur votre code ; évitez les délais critiques dans les callbacks.
- Descripteur HID erroné : un rapport mal dimensionné fait échouer l'énumération USB (périphérique inconnu).
Autres tutoriels pour cette carte
Exemples de code pour cette carte
neopixel_pulsation.pyPythonled_bouton.pyPythonentrees_num.pyPythonanalogique_lumiere.pyPythonservo_pwm.pyPythonscanner_i2c.pyPython