🛠 Contrôleur MIDI complet : encodeurs, multiplexage 74HC4051 et MIDIx16
Objetivos
Pasar de los 3 botones del tutorial para principiantes a un verdadero controlador MIDI DIY — la especialidad histórica de la Teensy 3.2: botones, codificadores rotativos y filas de potenciómetros, multiplexados para ahorrar pines, publicados en los 16 cables MIDI virtuales (MIDIx16). Utilizarás la biblioteca MIDIcontroller (Josh Nishikawa), publicada para este caso de uso, y tratarás los dos problemas documentados: la diafonía (crosstalk) de los potenciómetros multiplexados y la saturación de los buffers USB.
Material
- 1 Teensy 3.2
- 8 codificadores rotativos con botón pulsador (cuadratura + switch)
- 16 potenciómetros de 10 kΩ multiplexados por 2 chips 74HC4051 (8 entradas analógicas cada uno → 3 pines de dirección por chip)
- 16 botones pulsadores (matriz o directos según los pines restantes)
- Cable USB; DAW o monitor MIDI para validar
Arquitectura
- Tipo USB: MIDIx16 (Herramientas > Tipo USB): 16 cables MIDI virtuales, hasta 16 mensajes por paquete USB — cada sección del controlador puede vivir en su propio cable.
- Biblioteca MIDIcontroller (<https://github.com/joshnishikawa/MIDIcontroller>): gestiona botones, codificadores, aftertouch y el enrutamiento de canal/cable; Yann Seznec publicó su código de controlador MIDI de código abierto en el foro PJRC — una referencia de estructura (escaneo de botones, lectura de codificadores, envíos CC).
- Regla del drenaje: incluso en emisión pura, llama a
while (usbMIDI.read) { }en cada vuelta del loop — de lo contrario, los buffers USB se llenan y el controlador se congela (Problema n.º 10 de la página USB MIDI).
La trampa del 74HC4051: dejar que la señal se estabilice
Cuando se cambia el canal seleccionado de un multiplexor 74HC4051, la entrada analógica necesita un tiempo de establecimiento (settling) de al menos 50 µs — más si hay condensadores presentes — de lo contrario, el canal anterior sigue influyendo en la lectura: los potenciómetros «se leen entre sí» (hilo del foro PJRC «Potentiometers affecting each others when connected to 74HC4051»).
// Squelette de lecture multiplexee avec settling time.
const int ADDR[] = {A0, A1, A2}; // adresses du 4051
void selectCanal(uint8_t n) {
for (int i = 0; i < 3; i++) digitalWrite(ADDR[i], (n >> i) & 1);
delayMicroseconds(60); // >= 50 us de stabilisation (forum PJRC)
}
uint16_t lirePot(uint8_t canal) {
selectCanal(canal);
return analogRead(A3); // sortie commune du 4051 -> A3
}
Envío de mensajes
#include <MIDIcontroller.h>
// Exemple de declaration (voir README de la biblio pour la signature exacte) :
// MIDIcontroller ctl = MIDIcontroller(NUM_BUTTONS, NUM_SLIDERS, ...);
// A chaque tour de loop :
// ctl.encode(encodeurPin, canal, numeroCC);
// ctl.button(boutonPin, canal, numeroNote);
// ctl.slider(canalMux, canal, numeroCC);
// puis TOUJOURS :
void loop {
// ... scan des entrees, envois CC/Note ...
while (usbMIDI.read) { } // draine les messages entrants
}
Rupturas de compatibilidad a conocer (Teensyduino ≥ 1.41)
- El rango del pitch bend pasó de 0…16383 a +8191…−8192; los valores de
getTypehan cambiado — los viejos sketches de controladores deben adaptarse. - MIDI-OX bajo Windows: se necesita una configuración específica de «solo entrada» (sección «Teensyduino 1.40 & Earlier» de la página PJRC).
Verificación esperada
En la DAW: la Teensy aparece con 16 cables MIDI; gira el codificador 1 → el CC correspondiente se mueve en el cable elegido; mueve un potenciómetro multiplexado → su valor sigue correctamente, sin que los vecinos salten (prueba de que el tiempo de establecimiento de 60 µs hace su trabajo). Deja que la DAW envíe reloj MIDI durante 10 minutos: sin el drenaje usbMIDI.read, el controlador se congela — con él, aguanta.
Errores frecuentes
- Omitir el
delayMicrosecondsdespués de cambiar el canal del 4051: los canales se leen mutuamente — el síntoma es exactamente «mis potenciómetros se influyen entre sí». - Poner condensadores antiparasitarios en cada potenciómetro sin aumentar el tiempo de establecimiento: más capacidad = más retardo necesario.
- Olvidar el drenaje
usbMIDI.read: bloqueo tras unos minutos, a menudo atribuido erróneamente a la alimentación USB. - Seleccionar MIDI simple en lugar de MIDIx16: la DAW solo ve un cable y las secciones se pisan entre sí.
- Copiar un viejo tutorial anterior a la 1.41: el pitch bend y
getTypeinvertidos dan controladores «locos» en las versiones modernas. - Exceder el número de pines: los 34 E/S de la 3.2 se agotan rápidamente con 8 codificadores en cuadratura — de ahí la multiplexación (o un registro de desplazamiento tipo 74HC165 para los botones).
Otros tutoriales para esta placa
- Premiers pas sur la Teensy 3.2 : Teensyduino, HalfKay et premier Blink
- Broches, ADC 13 bits, DAC 12 bits et PWM : dompter les E/S de la Teensy 3.2
- Un instrument MIDI USB en 10 minutes : Bounce, boutons et règle d'or du drain
- Audio Shield SGTL5000 : boucle stéréo 44,1 kHz et outil de conception graphique
- OctoWS2811 : piloter 8 rubans WS2812 en parallèle par DMA (presque zéro CPU)
- Timers matériels, interruptions imbriquées et FASTRUN : la vitesse Cortex-M4
Ejemplos de código para esta placa
clignotante.inoArduinotouche-capacitive.inoArduinoanalogique-12-bits.inoArduinomidi-piano.inoArduinopwm-respiration.inoArduinoservo-angle.inoArduino