Manufactura industrial
Internet industrial de las cosas | Materiales industriales | Mantenimiento y reparación de equipos | Programación industrial |
home  MfgRobots >> Manufactura industrial >  >> Manufacturing Technology >> Proceso de manufactura

Kit Adaptador USB MIDI para Arduino Micro / Leonardo: Lista Completa de Componentes

Componentes y suministros

Arduino Micro (o Arduino Leonardo) × 1
Optoacoplador 6n137 × 1
1N4148 - Diodo conmutación rápida propósito general × 1
Condensador 100 nF × 1
Resistencia 220 ohm × 3
Resistencia 10k ohm × 1
Resistencia pasante 470 ohm × 1
LED (genérico) × 1
Soporte LED (para montar LED en caja plástica) × 1
Conector DIN Audio/Video 5 contactos (con tornillos y tuercas para montaje) × 2
Caja (caja plástica para todos los componentes) × 1
PCB (trozo PCB genérico) × 1
Soportes PCB (para montar PCB en caja, ej. separadores nylon) × 1

Aplicaciones y servicios online

Sobre este proyecto

Busqué en la red cómo construir un adaptador USB a MIDI usando Arduino, pero solo encontré soluciones no muy buenas (implementaciones software o hardware MIDI pobres). Decidí construir el mío y poner el resultado aquí en hackster.io.

Usé un Arduino Leonardo con protoboard para el primer prototipo. Una vez funcionando, construí versión soldada con Arduino Micro. Ambos usan ATmega32u4, que tiene USB nativo permitiendo presentarse como interfaz USB MIDI al PC al que se conecta.

MIDI usa optoacoplador y resistencias para crear un bucle de corriente totalmente aislado. El circuito es bastante estándar, usé 6n137 por ser rápido y ampliamente disponible. Como indica el diagrama, solo el conector MIDI OUT tiene pin 2 conectado a tierra, esto es estándar MIDI.

Fotos del resultado final:

Kit Adaptador USB MIDI para Arduino Micro / Leonardo: Lista Completa de Componentes
Kit Adaptador USB MIDI para Arduino Micro / Leonardo: Lista Completa de Componentes
Kit Adaptador USB MIDI para Arduino Micro / Leonardo: Lista Completa de Componentes
Kit Adaptador USB MIDI para Arduino Micro / Leonardo: Lista Completa de Componentes

En software usé la excelente librería Control Surface. A diferencia de otras librerías o implementaciones manuales, Control Surface maneja correctamente todos los aspectos del protocolo MIDI, algo complejo.

Control Surface también permite añadir extras: potenciómetros, pedales o botones en entradas analógicas/digitales para controles MIDI extra. ¡Mira web Control Surface, es muy fácil!

También puedes registrar callbacks para procesar datos antes de pasar de MIDI a USB o viceversa. En mi caso usé esto para arreglar la implementación MIDI rota de mi sintetizador Roland D50. El D50 envía comando "all notes off" cada vez que se suelta la última tecla. Implementaciones modernas (como la mayoría de VST que uso) interpretan esto como corte inmediato de todos los sustains. Filtrando "all notes off", el D50 vuelve a ser útil como teclado maestro.

Un problema con Control Surface: no maneja bien paquetes SysEx grandes. Esto causaba errores al usar editor/bibliotecario D50, que envía paquetes SysEx grandes. Incluí instrucciones en comentarios del código para arreglar esto. El autor indicó que se arreglará en versión 2.x.

Incluyo tanto código básico interfaz USB-MIDI como versión con filtro "all notes off".

También puedes usar otras librerías o escribir tu propia implementación MIDI, el hardware funcionará con cualquier librería MIDI con soporte USB MIDI y Serial MIDI.

Consejo solución problemas: si no logras que la interfaz hable con dispositivos MIDI externos, quizás intercambiaste pines 4 y 5. Los diagramas pinout conectores pueden ser confusos a veces ya que no siempre indican claramente qué lado del conector ves.

Espero que esquemáticos y código sean útiles. Dale like si te gusta y deja comentario si tienes dudas.

Código

Código fuente para interfaz básica MIDI a USB

/* 
 * Adaptador USB MIDI.
 * 
 * ---
 * 
 * Para permitir paquetes sysex mayores, modifica librería Control Surface así:
 * 
 * En: src\MIDI_Parsers\MIDI_MessageTypes.hpp
 * cambia: uint8_t length;
 * a:      size_t length;
 * 
 * En: src/Settings/Settings.hpp
 * cambia: constexpr size_t SYSEX_BUFFER_SIZE = 128;
 * a:      constexpr size_t SYSEX_BUFFER_SIZE = 320;
 * 
 * Esto se arreglará cuando salga Control Surface 2.x.
 * 
 * ---
 * 
 * Para usar otro nombre dispositivo USB, edita hardware/arduino/avr/boards.txt en instalación Arduino IDE con privilegios admin.
 * Cambia: leonardo.build.usb_product="Arduino Leonardo"
 * a:      leonardo.build.usb_product="..."
 * vuélvelo a cambiar tras subir proyecto a tu Arduino.
 */
#include <Control_Surface.h>
USBMIDI_Interface midiusb;
// USBDebugMIDI_Interface midiusb; // para volcar todos datos MIDI a monitor serie
HardwareSerialMIDI_Interface midiser = {Serial1, MIDI_BAUD};

MIDI_PipeFactory<5> pipes;

// Ejemplo añadir controladores extra:
// CCPotentiometer pot = { A0, MIDI_CC::Expression_Controller };

const int ledPin = 10; // pin LED encendido

void setup() {
  Serial.begin(115200);
  pinMode(ledPin, OUTPUT);
  digitalWrite(ledPin, HIGH);
  
  // MIDI USB -> MIDI serie
  midiusb >> pipes >> midiser;
  // MIDI serie -> MIDI USB
  midiser >> pipes >> midiusb;
  // mensajes Control Surface solo a MIDI USB
  Control_Surface >> pipes >> midiusb;
  // conectar ambos MIDI USB y serie a Control Surface
  midiser >> pipes >> Control_Surface;
  midiusb >> pipes >> Control_Surface;
  
  // inicializar Control Surface DESPUÉS de conectar interfaces
  Control_Surface.begin();
}

void loop() {
  Control_Surface.loop();
}

Código fuente para adaptador MIDI a USB con filtro "all notes off"

/* 
 * Adaptador USB MIDI con filtro "all notes off".
 * 
 * ---
 * 
 * Para permitir paquetes sysex mayores, modifica librería Control Surface así:
 * 
 * En: src\MIDI_Parsers\MIDI_MessageTypes.hpp
 * cambia: uint8_t length;
 * a:      size_t length;
 * 
 * En: src/Settings/Settings.hpp
 * cambia: constexpr size_t SYSEX_BUFFER_SIZE = 128;
 * a:      constexpr size_t SYSEX_BUFFER_SIZE = 320;
 * 
 * Se arreglará en Control Surface 2.x.
 * 
 * ---
 * 
 * Para otro nombre dispositivo USB, edita hardware/arduino/avr/boards.txt con admin.
 * Cambia: leonardo.build.usb_product="Arduino Leonardo"
 * a:      leonardo.build.usb_product="..."
 * vuélvelo a cambiar tras subir.
 */
#include <Control_Surface.h>
USBMIDI_Interface midiusb;
// USBDebugMIDI_Interface midiusb;
HardwareSerialMIDI_Interface midiser = {Serial1, MIDI_BAUD};

MIDI_PipeFactory<4> pipes;

// Ejemplo controladores extra:
// CCPotentiometer pot = { A0, MIDI_CC::Expression_Controller };

const int ledPin = 10;

// Callback MIDI personalizado que imprime mensajes entrantes
struct MyMIDI_Callbacks : MIDI_Callbacks {
  // Callback para mensajes de canal (notas, control change, pitch bend, etc.)
  void onChannelMessage(Parsing_MIDI_Interface &midi) override {
    ChannelMessage cm = midi.getChannelMessage();
    if (cm.header == 0xb0 && cm.data1 == 0x7b) {
      // ignorar mensajes "all notes off"
      return;
    } else if (cm.header == 0x90 && cm.data2 == 0x00) {
      // convertir "note on" con velocity 0 a "note off"
      cm.header = 0x80;
    }
    midiusb.send(cm);
  }
  
  // Callback para mensajes system exclusive
  void onSysExMessage(Parsing_MIDI_Interface &midi) override {
    SysExMessage se = midi.getSysExMessage();
    // reenviar sysEx sin cambios
    midiusb.send(se);
  }
  
  // Callback para mensajes real-time
  void onRealTimeMessage(Parsing_MIDI_Interface &midi) override {
    RealTimeMessage rt = midi.getRealTimeMessage();
    // reenviar real-time sin cambios
    midiusb.send(rt);
  }
} callbacks;

void setup() {
  Serial.begin(115200);
  pinMode(ledPin, OUTPUT);
  digitalWrite(ledPin, HIGH);
  
  // MIDI USB -> MIDI serie
  midiusb >> pipes >> midiser;
  // mensajes Control Surface solo a MIDI USB
  Control_Surface >> pipes >> midiusb;
  // conectar ambos MIDI USB y serie a Control Surface
  midiser >> pipes >> Control_Surface;
  midiusb >> pipes >> Control_Surface;
  
  // inicializar Control Surface DESPUÉS de conectar interfaces
  Control_Surface.begin();
  
  // establecer métodos callback
  midiser.setCallbacks(callbacks);
}

void loop() {
  Control_Surface.loop();
}

Esquemáticos

Kit Adaptador USB MIDI para Arduino Micro / Leonardo: Lista Completa de Componentes

Solo la pestaña esquemático está rellena

usb_midi_interface_twiE32gvR3.fzz

Proceso de manufactura

  1. Alerta de Sed Inteligente para Plantas: Sensor DIY para Riego Óptimo
  2. Reloj de Palabras en Italiano con Arduino Nano, NeoPixel, LCD y RTC
  3. Ahorra Pines en Arduino: Conecta Teclado 4x3 con Solo 3 Conexiones Analógicas
  4. Kit de Batería MIDI Compacto con Impresión 3D y Arduino
  5. Medidor kWh Sigfox Fiable con Arduino MKR Fox 1200
  6. Monitor de temperatura con Bluetooth usando Arduino Nano
  7. Medidor de Capacitancia Autoranging DIY (10 pF–10 µF) – Fácil Construcción con Arduino
  8. Cerradura por Gestos Sin Contacto: Acceso Seguro con APDS-9960 y Arduino
  9. Kit Compañero Arduino Nano: Componentes y Herramientas Esenciales para Electrónica DIY
  10. Circuito de entrada analógica aislada para Arduino
  11. Test de Precisión de Tiempo de Reacción con Arduino UNO