🛠 Contrôleur MIDI complet : encodeurs, multiplexage 74HC4051 et MIDIx16

Teensy 3.2 · avance · Schéma : IMG-teensy-32-avance-8-teensy32-controleur-midi-diy.svg — boîtier DIY ouvert : Teensy 3.2 au centre, 8 encodeurs rotatifs et 16 potentiomètres multiplexés via deux puces 74HC4051 (broches A/B/S annotées), nappe USB partant vers un ordinateur affichant une DAW avec 16 câbles MIDI ; en médaillon, le délai de stabilisation ≥ 50 µs après changement de canal du multiplexeur.

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

Arquitectura

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)

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

Otros tutoriales para esta placa

Ejemplos de código para esta placa

← Volver a la ficha 🛠 Todos los tutoriales