1. Què és TinyUSB?
TinyUSB és una llibreria open‑source escrita en C que implementa el protocol USB per a microcontroladors. Permet que un microcontrolador actuï com a:
- Dispositiu USB (teclat, ratolí, port sèrie, MIDI, etc.)
- Host USB (en alguns casos avançats)
En termes simples:
TinyUSB permet que un microcontrolador es comporti com un dispositiu USB real, reconegut pel sistema operatiu sense drivers especials.
2. TinyUSB i ESP32: què has de saber
⚠️ No tots els ESP32 tenen USB natiu.
✅ ESP32 compatibles amb TinyUSB
Només els models amb USB integrat:
- ESP32‑S2
- ESP32‑S3
- (ESP32‑P4 en versions recents)
❌ ESP32 NO compatibles
- ESP32 clàssic (WROOM, WROVER, etc.)
En aquests casos, el connector USB només és un convertidor USB‑sèrie (CP2102, CH340…). TinyUSB no hi funciona.
3. Què pots fer amb TinyUSB + ESP32?
Amb un ESP32‑S2 o S3, pots crear dispositius USB reals:
🔹 Teclat USB (HID)
- Teclats personalitzats
- Macro‑keypads
- Automatització de PCs
- Stream Deck DIY
🔹 Ratolí o joystick
- Controls personalitzats
- Projectes de joc
🔹 Port sèrie USB (CDC)
- Comunicació PC ↔ ESP32 sense UART
- Debug i configuració avançada
🔹 MIDI USB
- Controladors MIDI
- Sintetitzadors DIY
- Plugins reconeguts com a dispositius professionals
🔹 Dispositius compostos
- Teclat + port sèrie
- MIDI + botons
- Tot amb un sol cable USB
Tot això funciona sense drivers a: ✅ Windows
✅ Linux
✅ macOS
4. Entorn recomanat (el més fàcil)
✅ Arduino IDE + core ESP32
És la forma més ràpida de començar.
Requisits:
- Arduino IDE
- Core ESP32 actualitzat (≥ 2.x)
- Placa ESP32‑S2 o ESP32‑S3
Selecció de placa:
Eines → Placa → ESP32 Arduino → ESP32S2 / ESP32S3 Dev Module
5. Exemple mínim: teclat USB amb TinyUSB
Aquest exemple fa que l’ESP32 escrigui text automàticament quan el connectes al PC.
#include "USB.h"
#include "USBHIDKeyboard.h"
USBHIDKeyboard Keyboard;
void setup() {
USB.begin(); // Inicialitza TinyUSB
Keyboard.begin(); // Inicialitza el teclat HID
delay(2000); // Temps perquè el PC reconegui el dispositiu
Keyboard.print("Hola des de l'ESP32 amb TinyUSB!");
Keyboard.press(KEY_ENTER);
Keyboard.releaseAll();
}
void loop() {
// Res
}
👉 El sistema operatiu creu que és un teclat real.
6. Enviar tecles i combinacions
Tecla simple
Keyboard.press('a');
Keyboard.releaseAll();
Combinació (exemple: Ctrl + C)
Keyboard.press(KEY_LEFT_CTRL);
Algunes tecles útils
KEY_ENTERKEY_ESCKEY_LEFT_CTRLKEY_LEFT_SHIFTKEY_LEFT_ALTKEY_F1…KEY_F12
7. Usar botons físics (teclat real)
Un botó connectat al GPIO 0:
#define BUTTON_PIN 0
void setup() {
pinMode(BUTTON_PIN, INPUT_PULLUP);
USB.begin();
Keyboard.begin();
}
void loop() {
if (digitalRead(BUTTON_PIN) == LOW) {
Keyboard.press('a');
delay(100);
Keyboard.releaseAll();
delay(300);
}
}
Cada cop que premis el botó → s’escriu una A.
8. Exemple de macro (ús real)
Obrir el terminal a Windows (Win + R → cmd):
Keyboard.press(KEY_LEFT_GUI);
Keyboard.press('r');
Keyboard.releaseAll();
delay(300);
Keyboard.print("cmd");
Keyboard.press(KEY_ENTER);
Keyboard.releaseAll();
9. Teclat USB + port sèrie USB
Molt útil per debug o control remot:
#include "USB.h"
#include "USBHIDKeyboard.h"
USBHIDKeyboard Keyboard;
void setup() {
USB.begin();
Serial.begin(115200);
Keyboard.begin();
}
void loop() {
if (Serial.available()) {
char c = Serial.read();
Keyboard.print(c);
}
}
10. Errors habituals
❌ No apareix com a teclat
- Placa incorrecta
- Cable USB només de càrrega
- USB‑OTG no activat
❌ Es reinicia en connectar
- Falta
delay()inicial - Alimentació insuficient
❌ Tecles incorrectes
- El layout depèn del sistema operatiu (ES / EN), no de l’ESP32
11. Quan Arduino no és suficient
Per projectes avançats:
- ESP‑IDF + TinyUSB directe
- Descriptors USB manuals
- N‑Key rollover
- Teclats complexos o professionals
A nivell baix es treballa amb:
tud_hid_report()- callbacks HID
- definició manual d’interfícies USB