Fabrication industrielle
Internet des objets industriel | Matériaux industriels | Entretien et réparation d'équipement | Programmation industrielle |
home  MfgRobots >> Fabrication industrielle >  >> Manufacturing Technology >> Processus de fabrication

Kit Adaptateur USB MIDI pour Arduino Micro / Leonardo – Liste Complète des Composants

Composants et fournitures

Arduino Micro (ou Arduino Leonardo)×1
Optocoupleur 6n137×1
Diode 1N4148 – Commutation rapide usage général×1
Condensateur 100 nF×1
Résistance 220 Ω×3
Résistance 10k Ω×1
Résistance traversante 470 Ω×1
LED (standard)×1
Support de LED×1
Connecteur DIN Audio/Vidéo 5 contacts (+ boulons/écrous fixation)×2
Boîtier plastique×1
PCB (universel)×1
Supports PCB (ex: entretoises nylon)×1

Applications et services en ligne

Arduino IDE

À propos de ce projet

J'ai cherché sur le net comment construire un adaptateur USB vers MIDI avec un Arduino, mais je n'ai trouvé que des solutions insatisfaisantes (implémentations logicielles ou matérielles MIDI médiocres). J'ai donc décidé de construire le mien et de le partager ici sur hackster.io.

J'ai d'abord utilisé un Arduino Leonardo sur breadboard pour le prototype. Une fois tout fonctionnel, j'ai réalisé une version soudée avec un Arduino Micro. Les deux sont basés sur l'ATmega32u4, qui possède l'USB natif permettant de se présenter comme interface MIDI USB au PC connecté.

Le MIDI utilise un optocoupleur et des résistances pour créer une boucle de courant totalement isolée. Le circuit est standard, j'ai utilisé un 6n137 car il est rapide et largement disponible. Comme indiqué sur le schéma, seule la prise MIDI OUT a sa broche 2 connectée à la masse, c'est la norme MIDI.

Quelques photos du résultat final :

Kit Adaptateur USB MIDI pour Arduino Micro / Leonardo – Liste Complète des Composants
Kit Adaptateur USB MIDI pour Arduino Micro / Leonardo – Liste Complète des Composants
Kit Adaptateur USB MIDI pour Arduino Micro / Leonardo – Liste Complète des Composants
Kit Adaptateur USB MIDI pour Arduino Micro / Leonardo – Liste Complète des Composants

Côté logiciel, j'ai choisi l'excellente bibliothèque Control Surface. Contrairement à d'autres bibliothèques ou implémentations manuelles, Control Surface gère correctement tous les aspects du protocole MIDI, assez complexe.

Control Surface permet aussi d'ajouter toutes sortes d'extras : potentiomètres, pédales, boutons sur entrées analogiques/numériques pour ajouter des contrôles MIDI supplémentaires. Consultez le site Control Surface pour plus d'infos, c'est très simple !

On peut aussi enregistrer des callbacks pour traiter les données avant passage MIDI→USB ou USB→MIDI. Dans mon cas, j'ai utilisé cela pour corriger l'implémentation MIDI défectueuse de mon synthétiseur Roland D50. Le D50 envoie une commande « all notes off » à chaque relâchement de la dernière touche. Les implémentations modernes (la plupart des instruments VST que j'utilise) l'interprètent comme une coupure immédiate et dure de tous les sustains actifs. En filtrant le « all notes off », le D50 redevient utilisable comme clavier maître.

Un problème avec Control Surface : il ne gère pas bien les gros paquets SysEx. Cela causait des erreurs avec un éditeur/bibliothécaire D50 envoyant de gros paquets SysEx. J'ai mis les instructions dans l'en-tête du code source pour corriger ce problème. L'auteur de la bibliothèque a indiqué que ce serait corrigé dans la version 2.x.

J'inclus le code source de base pour l'interface USB-MIDI et une version avec filtre « all notes off ».

Vous pouvez bien sûr utiliser d'autres bibliothèques ou écrire votre propre implémentation MIDI, le matériel fonctionnera avec toute bibliothèque MIDI supportant USB MIDI et MIDI Série.

Astuce dépannage : si l'interface ne communique pas avec des appareils MIDI externes, vous avez peut-être inversé broches 4 et 5. Les schémas de brochage des connecteurs peuvent être confus car ils n'indiquent pas toujours clairement quel côté du connecteur est montré.

J'espère que les schémas et le code source seront utiles. Merci de mettre un pouce vers le haut si vous aimez ce projet et n'hésitez pas à commenter si vous avez des questions.

Code

Code source – Interface MIDI vers USB basique

/* 
 * Adaptateur USB MIDI.
 * 
 * ---
 * 
 * Pour permettre gros paquets SysEx, modifiez la bibliothèque Control Surface ainsi :
 * 
 * Dans : src\MIDI_Parsers\MIDI_MessageTypes.hpp
 * Changez : uint8_t length;
 * En :      size_t length;
 * 
 * Dans : src/Settings/Settings.hpp
 * Changez : constexpr size_t SYSEX_BUFFER_SIZE = 128;
 * En :      constexpr size_t SYSEX_BUFFER_SIZE = 320;
 * 
 * Cela sera corrigé avec Control Surface 2.x.
 * 
 * ---
 * 
 * Pour un nom d'appareil USB différent, éditez hardware/arduino/avr/boards.txt dans l'installation Arduino IDE avec droits admin.
 * Changez : leonardo.build.usb_product="Arduino Leonardo"
 * En :      leonardo.build.usb_product="..."
 * Remettez l'original après téléversement sur votre Arduino.
 */
#include <Control_Surface.h>
USBMIDI_Interface midiusb;
// USBDebugMIDI_Interface midiusb; // Pour dumper toutes données MIDI sur moniteur série
HardwareSerialMIDI_Interface midiser = {Serial1, MIDI_BAUD};
MIDI_PipeFactory<5> pipes;

// Exemple ajout contrôleurs supplémentaires :
// CCPotentiometer pot = { A0, MIDI_CC::Expression_Controller };

const int ledPin = 10; // Broche LED alimentation

void setup() {
  Serial.begin(115200);
  pinMode(ledPin, OUTPUT);
  digitalWrite(ledPin, HIGH);
  // MIDI USB vers MIDI Série
  midiusb >> pipes >> midiser;
  // MIDI Série vers MIDI USB
  midiser >> pipes >> midiusb;
  // Messages Control Surface seulement vers MIDI USB
  Control_Surface >> pipes >> midiusb;
  // Connecter MIDI USB et Série à Control Surface
  midiser >> pipes >> Control_Surface;
  midiusb >> pipes >> Control_Surface;
  // Initialiser Control Surface APRÈS connexion interfaces
  Control_Surface.begin();
}

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

Code source – Adaptateur MIDI vers USB avec filtre « all notes off »

/* 
 * Adaptateur USB MIDI avec filtre "all notes off".
 * 
 * ---
 * 
 * Pour permettre gros paquets SysEx, modifiez Control Surface ainsi :
 * 
 * Dans : src\MIDI_Parsers\MIDI_MessageTypes.hpp
 * Changez : uint8_t length;
 * En :      size_t length;
 * 
 * Dans : src/Settings/Settings.hpp
 * Changez : constexpr size_t SYSEX_BUFFER_SIZE = 128;
 * En :      constexpr size_t SYSEX_BUFFER_SIZE = 320;
 * 
 * Corrigé dans Control Surface 2.x.
 * 
 * ---
 * 
 * Pour nom USB différent, éditez hardware/arduino/avr/boards.txt avec droits admin.
 * Changez : leonardo.build.usb_product="Arduino Leonardo"
 * En :      leonardo.build.usb_product="..."
 * Remettez l'original après téléversement.
 */
#include <Control_Surface.h>
USBMIDI_Interface midiusb;
// USBDebugMIDI_Interface midiusb;
HardwareSerialMIDI_Interface midiser = {Serial1, MIDI_BAUD};
MIDI_PipeFactory<4> pipes;

// Exemple contrôleurs supplémentaires :
// CCPotentiometer pot = { A0, MIDI_CC::Expression_Controller };

const int ledPin = 10;

// Callback MIDI personnalisé
struct MyMIDI_Callbacks : MIDI_Callbacks {
  // Callback messages de canal (notes, control change, pitch bend, etc.)
  void onChannelMessage(Parsing_MIDI_Interface &midi) override {
    ChannelMessage cm = midi.getChannelMessage();
    if (cm.header == 0xb0 && cm.data1 == 0x7b) {
      // Ignore messages "all notes off"
      return;
    } else if (cm.header == 0x90 && cm.data2 == 0x00) {
      // Convertit "note on" vélocité 0 en "note off"
      cm.header = 0x80;
    }
    midiusb.send(cm);
  }
  // Callback messages SysEx
  void onSysExMessage(Parsing_MIDI_Interface &midi) override {
    SysExMessage se = midi.getSysExMessage();
    midiusb.send(se); // Transmet SysEx sans modification
  }
  // Callback messages temps réel
  void onRealTimeMessage(Parsing_MIDI_Interface &midi) override {
    RealTimeMessage rt = midi.getRealTimeMessage();
    midiusb.send(rt); // Transmet temps réel sans modification
  }
} 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);
}

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

Schémas

Kit Adaptateur USB MIDI pour Arduino Micro / Leonardo – Liste Complète des Composants

Seul l'onglet schéma est rempli

usb_midi_interface_twiE32gvR3.fzz

Processus de fabrication

  1. Alerte Soif Plante Intelligente – Capteur DIY pour une Hydratation Optimale
  2. Horloge à Mots Italienne avec Arduino Nano, NeoPixel, LCD et RTC
  3. Économisez les broches Arduino : clavier 4×3 sur 3 entrées analogiques
  4. Construire une batterie MIDI compacte avec impression 3D
  5. Compteur kWh Sigfox fiable avec Arduino MKR Fox 1200
  6. Moniteur de température Bluetooth avec Arduino Nano
  7. Multimètre capacimètre auto-étendant DIY (10 pF – 10 µF) – Construction Arduino facile
  8. Circuit d'entrée analogique isolée pour Arduino : Protection contre les parasites industriels
  9. Test Précis de Temps de Réaction avec Arduino UNO