MIDI IN – czyli transoptor w akcji

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:

MIDI_IN_yar

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:

MIDI_IN_yar_pic

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:

rys. MIDI-IN EASYEDA
Schemat MIDI-IN for arduino

Płytka PCB:

I zlutowany interfejs:

Dodaj komentarz