Industriële fabricage
Industrieel internet der dingen | Industriële materialen | Onderhoud en reparatie van apparatuur | Industriële programmering |
home  MfgRobots >> Industriële fabricage >  >> Manufacturing Technology >> Productieproces

USB MIDI Adapter Kit voor Arduino Micro / Leonardo – Complete Onderdelenlijst

Onderdelen en benodigdheden

Arduino Micro (of Arduino Leonardo) × 1
6N137 Optokoppler × 1
1N4148 – Snelle schakeldiode × 1
Condensator 100 nF × 1
Weerstand 220 Ω × 3
Weerstand 10 kΩ × 1
Weerstand 470 Ω (doorverbind) × 1
LED (standaard) × 1
LED-beugel (voor montage in behuizing) × 1
DIN 5-pins connector (audio/video) + bouten/moeren × 2
Kunststof behuizing (passend voor alle componenten) × 1
Universele printplaat × 1
PCB-montagemiddelen (bijv. nylon afstandshouders) × 1

Apps en online diensten

  • Arduino IDE

Over dit project

Ik zocht hoe je een USB-naar-MIDI-adapter bouwt met Arduino, maar vond alleen oplossingen met slechte MIDI-implementaties (software of hardware). Dus bouw ik mijn eigen en deel het hier.

Eerst een prototype op breadboard met Arduino Leonardo. Toen alles werkte, een gesoldeerde versie met Arduino Micro (beide ATmega32u4 – native USB, verschijnt als USB-MIDI-interface aan de PC).

MIDI gebruikt een optokoppler en weerstanden voor een volledig geïsoleerde stroomlus. Standaardschakeling: ik gebruikte de 6N137 (snel, breed beschikbaar). Alleen de MIDI OUT-connector heeft pin 2 op massa – dit is standaard voor MIDI.

Eindresultaat

USB MIDI Adapter Kit voor Arduino Micro / Leonardo – Complete Onderdelenlijst

USB MIDI Adapter Kit voor Arduino Micro / Leonardo – Complete Onderdelenlijst

USB MIDI Adapter Kit voor Arduino Micro / Leonardo – Complete Onderdelenlijst

USB MIDI Adapter Kit voor Arduino Micro / Leonardo – Complete Onderdelenlijst

Software: Control Surface Library

Ik koos de uitstekende Control Surface library. In tegenstelling tot andere libraries of handmatige implementaties, hanteert deze het complexe MIDI-protocol correct.

Extra's zijn eenvoudig toe te voegen: potentiometers, pedalen, knoppen op analoge/digitale ingangen voor extra MIDI-controles. Zie Control Surface website.

Callbacks mogelijk voor dataverwerking tussen MIDI ↔ USB. Ik gebruik dit om de gebroken MIDI-implementatie van mijn Roland D-50 synthesizer te repareren: de D-50 stuurt bij loslaten van de laatste toets een "All Notes Off"-commando. Moderne VST-instrumenten interpreteren dit als harde afsnijding van alle sustains. Door "All Notes Off" te filteren, wordt de D-50 weer bruikbaar als masterkeyboard.

Let op: Control Surface (v1.x) hanteert grote SysEx-pakketten slecht – fouten bij D-50 editor/librarian. In de codecommentaar staat hoe je dit fixt (buffer vergroten). De auteur zegt dat v2.x dit oplost.

Inbegrepen: basis USB-MIDI interface code + versie met "All Notes Off"-filter. Je kunt ook andere libraries of eigen implementatie gebruiken – de hardware werkt met elke MIDI-library met USB-MIDI en Serial-MIDI ondersteuning.

Probleemoplossing: als communicatie met externe MIDI-apparaten faalt, check of pin 4 en 5 niet omgewisseld zijn. Connector-pinout-diagrammen zijn soms verwarrend over welke kant je bekijkt.

Ik hoop dat schema's en code nuttig zijn. Duim omhoog als je het leuk vindt, vragen in de reacties!

Code

Broncode: Basis MIDI-naar-USB Interface

/*
 * USB MIDI adapter.
 * ---
 * Voor grotere SysEx-pakketten: wijzig Control Surface library:
 * In src\MIDI_Parsers\MIDI_MessageTypes.hpp:
 *   uint8_t length;  →  size_t length;
 * In src/Settings/Settings.hpp:
 *   constexpr size_t SYSEX_BUFFER_SIZE = 128;  →  320;
 * (Opgelost in Control Surface 2.x)
 * ---
 * Voor andere USB-apparaatnaam: bewerk hardware/arduino/avr/boards.txt (admin-rechten):
 *   leonardo.build.usb_product="Arduino Leonardo"  →  "Jouw Naam"
 *   Zet terug na uploaden.
 */
#include <Control_Surface.h>

USBMIDI_Interface midiusb;
// USBDebugMIDI_Interface midiusb; // voor debug naar Serial
HardwareSerialMIDI_Interface midiser = {Serial1, MIDI_BAUD};

MIDI_PipeFactory<5> pipes;

// Voorbeeld extra controllers:
// CCPotentiometer pot = { A0, MIDI_CC::Expression_Controller };

const int ledPin = 10; // power LED

void setup() {
  Serial.begin(115200);
  pinMode(ledPin, OUTPUT); digitalWrite(ledPin, HIGH);

  // MIDI USB → Serial
  midiusb >> pipes >> midiser;
  // MIDI Serial → USB
  midiser >> pipes >> midiusb;
  // Control Surface → MIDI USB
  Control_Surface >> pipes >> midiusb;
  // Beide MIDI-interfaces → Control Surface
  midiser >> pipes >> Control_Surface;
  midiusb >> pipes >> Control_Surface;

  Control_Surface.begin(); // na verbinden initialiseren
}

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

Broncode: MIDI-naar-USB Adapter Met "All Notes Off" Filter


/* Zie bovenstaande commentaar voor SysEx-fix en USB-naam wijzigen */
#include <Control_Surface.h>

USBMIDI_Interface midiusb;
HardwareSerialMIDI_Interface midiser = {Serial1, MIDI_BAUD};
MIDI_PipeFactory<4> pipes;

const int ledPin = 10;

// Custom callback voor "All Notes Off" filteren
struct MyMIDI_Callbacks : MIDI_Callbacks {
  void onChannelMessage(Parsing_MIDI_Interface &midi) override {
    ChannelMessage cm = midi.getChannelMessage();
    if (cm.header == 0xB0 && cm.data1 == 0x7B) {
      // Ignoreer "All Notes Off" (Control Change 123)
      return;
    } else if (cm.header == 0x90 && cm.data2 == 0x00) {
      // Converteer "Note On" met velocity 0 naar "Note Off"
      cm.header = 0x80;
    }
    midiusb.send(cm);
  }
  void onSysExMessage(Parsing_MIDI_Interface &midi) override {
    SysExMessage se = midi.getSysExMessage();
    midiusb.send(se); // SysEx ongewijzigd doorsturen
  }
  void onRealTimeMessage(Parsing_MIDI_Interface &midi) override {
    RealTimeMessage rt = midi.getRealTimeMessage();
    midiusb.send(rt); // Real-time ongewijzigd doorsturen
  }
} callbacks;

void setup() {
  Serial.begin(115200);
  pinMode(ledPin, OUTPUT); digitalWrite(ledPin, HIGH);

  midiusb >> pipes >> midiser;
  Control_Surface >> pipes >> midiusb;
  midiser >> pipes >> Control_Surface;
  midiusb >> pipes >> Control_Surface;

  Control_Surface.begin();
  midiser.setCallbacks(callbacks); // callback activeren
}

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

Schema's

USB MIDI Adapter Kit voor Arduino Micro / Leonardo – Complete Onderdelenlijst

usb_midi_interface_twiE32gvR3.fzz (Fritzing-bestand, alleen schema-tab ingevuld)

Productieproces

  1. Slimme Plantenalarmer – DIY Sensor voor Optimale Hydratatie
  2. Bouw een Italiaanse Woordklok met Arduino Nano, NeoPixel, LCD en RTC
  3. Bespaar Arduino-pins: Sluit een 4x3-toetsenblok aan met slechts 3 verbindingen
  4. Bouw een Compacte MIDI Drumkit met 3D-printen
  5. Bouw een Betrouwbare Sigfox kWh Meter met Arduino MKR Fox 1200
  6. Bluetooth Temperatuurmeter met Arduino Nano
  7. DIY Autoranging Condensatiemeter (10 pF–10 µF) – Simpele Arduino Bouw
  8. Contactloos Gebaarslot: Veilige toegang met APDS-9960 en Arduino
  9. Arduino Nano Companion Kit – Essentiële Componenten & Hulpmiddelen voor DIY Electronica
  10. Geïsoleerde analoge ingangsschakeling voor Arduino bouwen
  11. Precisie Reactietijd Test met Arduino UNO