Oto podstawowy schemat interfejsu MIDI współpracującego z Arduino. Głównym elementem w układzie jest transoptor 6N138, zwany też optoizolatorem. Pozwala on przesyłać sygnały elektryczne z wejścia na wyjście bez połączeń galwanicznych obwodów wejściowego i wyjściowego. Separacja, w tym wypadku, jest ważna, bo mamy do czynienia z dwoma różnymi obwodami elektrycznymi połączonymi kablem MIDI. Oto schemat układu:
Oszczędzi nerwów i sporo czasu właściwe połączenie nóżek transoptora i gniazda (albo wtyczki) MIDI. (Na schemacie zaznaczyłem numery nóżek układu i gniazda.) A tak wygląda prawidłowo złożony układ na płytce prototypowej:
UWAGA! Na zdjęciu 7-ma nóżka transoptora jest połączona z masą rezystorem 2k2 zamiast 4k7. Akurat nie miałem pod ręką właściwego opornika, ale chyba wartość nie jest tak istotna, bo na różnych schematach ten rezystor ma wartość od 470R do 10k. A czasem 7-ma nóżka wcale nie jest podłączona.
Kod1:
#include // Add Midi Library #define LED 13 // Arduino Board LED is on Pin 13 //Create an instance of the library with default name, serial port and settings MIDI_CREATE_DEFAULT_INSTANCE(); void setup() { pinMode (LED, OUTPUT); // Set Arduino board pin 13 to output MIDI.begin(MIDI_CHANNEL_OMNI); // Initialize the Midi Library. // OMNI sets it to listen to all channels.. MIDI.begin(2) would set it // to respond to notes on channel 2 only. MIDI.setHandleNoteOn(MyHandleNoteOn); // This is important!! This command // tells the Midi Library which function you want to call when a NOTE ON command // is received. In this case it's "MyHandleNoteOn". MIDI.setHandleNoteOff(MyHandleNoteOff); // This command tells the Midi Library // to call "MyHandleNoteOff" when a NOTE OFF command is received. } void loop() { // Main loop MIDI.read(); // Continuously check if Midi data has been received. } // MyHandleNoteON is the function that will be called by the Midi Library // when a MIDI NOTE ON message is received. // It will be passed bytes for Channel, Pitch, and Velocity void MyHandleNoteOn(byte channel, byte pitch, byte velocity) { digitalWrite(LED,HIGH); //Turn LED on } // MyHandleNoteOFF is the function that will be called by the Midi Library // when a MIDI NOTE OFF message is received. // * A NOTE ON message with Velocity = 0 will be treated as a NOTE OFF message * // It will be passed bytes for Channel, Pitch, and Velocity void MyHandleNoteOff(byte channel, byte pitch, byte velocity) { digitalWrite(LED,LOW); //Turn LED off }
Kod2
SysEx
#include <MIDI.h>; #define LED 13 // Definicja pinu LED int i; //Instancja biblioteki z domyślną nazwą, portem szeregowym i ustawieniami MIDI_CREATE_DEFAULT_INSTANCE(); void setup() { pinMode (LED, OUTPUT); // ustawienie pinu 13-tego jako wyjście MIDI.begin(MIDI_CHANNEL_OMNI); // Inicjijemy kanał MIDI // OMNI ustawia nasłuch na wszystkie kanały MIDI MIDI.setHandleSystemExclusive(MyHandleSystemExclusive); // // Gdy na wejściu pojawi się komunikat SysEx zostanie wykonana funkcja // MyHandleSystemExclusive } void loop() { // Main loop MIDI.read(); // Nasłuch komunikatów MIDI } void MyHandleSystemExclusive(byte *array, byte size) { // deklarujemy funkcję, która zaświeci LED tyle razy // co wielkość otrzymanego komunikat SysEx (size) for( i=0; i<size; i++){ digitalWrite(LED,HIGH); //Turn LED on delay(50); digitalWrite(LED,LOW); //Turn LED off delay(50); } }
Schemat MIDI-IN w EasyEDA: