Midi LCD Part 2

Kommen wir zu Part2 (Anschluss/Programmierung der MIDI IN Buchse). Wir brauchen dazu einen Optokoppler (ein Optokoppler 4N35 ist beim Arduino Starter Kit mit dabei). Dieser überträgt die Signale aus dem MIDI System in unser Arduino System. Der Optokoppler lässt dabei die beiden Stromkreise galvanisch voneinander getrennt. Die Signale werden innerhalb des Optokopplers per Licht übertragen. Daher ist bei dem Aufbau der Schaltung darauf zu achten den Optokoppler richtig rum (Der Punkt auf dem Optokoppler gehört nach links unten) auf das Board zu stecken, da die Signale „nur“ in eine Richtung laufen können. Die Diode unterhalb des 220 Ohm Widerstands dient dem Schutz unseres Arduinos. Der in der Skizze grüne Draht gehört an den PIN 4 der MIDI Buchse (mit dem 220 Ohm Widerstand davor), der gelbe Draht an den PIN 5 der Midi Buchse. Der Plan sieht so aus:

 

Das Ergebnis (Klicken für größer) sollte dann wie folgt aussehen:

Nun können wir bereits das MIDI Out Kabel des MIDI Interfaces (was am Computer angeschlossen ist) in unsere MIDI In Buchse stecken. Viele Spieltische (Orgeln) verwenden ja fast nur MIDI IN des Computers um die Daten vom Spieltisch zu empfangen und an Hauptwerk (HW) oder GrandOrgue (GO) zu senden. Hier sendet HW oder GO etwas an uns (die LCD Informationen), daher sollte eigentlich jeder noch ein MIDI Out an seinem System frei haben.

Kommen wir wieder zur Programmierung. Auch hier könnten wir jetzt wieder alles selber programmieren. Das brauchen wir aber nicht, da es eine schöne MIDI Bibliothek für den Arduino gibt. Diese erledigt für uns (wie bei der LCD Bibliothek) die meisten Aufgaben und wir arbeiten diesmal halt mit einem MIDI Objekt. In dem folgenden Video https://www.youtube.com/watch?v=Twx0kzxXvp4 könnt Ihr sehen, wie die Bibliothek in die Arduino Software eingebunden werden kann. Das Video ist auf englisch, eins auf deutsch (generell) hier: https://www.youtube.com/watch?v=ke-tOzy1Hzo

Nachdem Ihr die MIDI Library in die Arduino IDE eingebunden haben, könnt Ihr euch hier zunächst den fertigen sketch herunterladen: Download Sketch zu Part 2. Nun noch ein paar Erläuterungen zum Programm Code (wenn dazu ein Video gewünscht ist, bitte schreibt es in die Kommentare). Als Erstes fügen wir die MIDI Library zu unserem Programm mit der folgenden Zeile hinzu:

#include <MIDI.h>
Jetzt legen wir eine Konstante für die Display Nummer aus HW oder GO in unserem Programm fest, displayNummer 0 heißt Display 1 da in der Programmierung bei 0 mit dem Zählen begonnen wird. In Part 3 werden wir noch den DIP Schalter einbauen, damit wir per Schalter festlegen können, auf welches Display aus HW oder GO wir reagieren möchten.
int displayNumber = 0;
Mit dem folgenden Befehl initialisieren wir dann zunächst unsere MIDI Library:
//Create an instance of the library with default name, serial port and settings
MIDI_CREATE_DEFAULT_INSTANCE();
In unsere SETUP Funktion erstellen wir uns nun ein Midi Objekt (so wie bei dem LCD in Part 1). Die Angabe MIDI_CHANNEL_OMNI sorgt dafür, dass wir auf jedem Midi Kanal empfangen.
MIDI.begin(MIDI_CHANNEL_OMNI);

In der nächsten Zeile sagen wir der MIDI Library, welche Funktion die MIDI Library ausführen soll, wenn ein Midi SysEx Befehl (welche HW und GO für Ihre LCD benutzen) empfangen wird. Diese Funktion (MyHandleSystemExclusive) ist eine von uns komplett neu hinzugefügte Funktion (neben der SETUP und LOOP Standard Funktion).

MIDI.setHandleSystemExclusive(MyHandleSystemExclusive);
In unserer LOOP Funktion müssen wir jetzt nur noch eine Zeile einfügen, die permanent prüft, ob MIDI Daten eingetroffen sind.
MIDI.read(); // Continuously check if Midi data has been received.
Kommt jetzt ein SysEx Befehl bei uns an, springt der Arduino automatisch in unsere MyHandleSystemExclusive Funktion, in der wir die angekommenen Daten analysieren und die Informationen anschließend auf unserem LCD ausgeben. Mehr ist nicht erforderlich um die HW oder GO Daten auf dem LCD auszugeben. Weiter geht es bald mit Part 3 und einer Zusammenfassung. Bis dahin viel Spaß beim Basteln.
So sieht die gesamte MyHandleSystemExclusive Funktion aus:
void MyHandleSystemExclusive(byte *data, unsigned int array_size)
{
  if (data[3] != displayNumber) {
    //Not the selected Display number
    return;
  }
  
  int column = 0;
  bool start = false;

  //Turn Arduino Board LED on - to see on the Arduino, that somthing happens
  digitalWrite(13,HIGH); 

  lcd.clear(); //clear LCD
  lcd.setCursor(0, 0); //set Cursor to first row and column

  for (int i = 0; i < array_size; i++)
  {
    //iterate through received Data Array
    if (data[i] >= 32 && data[i] <= 126 && start)
    {
      lcd.write(data[i]); //write Information to LCD
      column = column + 1;
      if (column == 16)
      {
        lcd.setCursor(0,1); //after 16 Char switch to row 2
      }
    }

    if (data[i] == 125) //check if LCD starts
    {
      start = true;
    }
  }
  digitalWrite(13,LOW); //Turn LED off - we have finnished
}

Kommentar verfassen

Trage deine Daten unten ein oder klicke ein Icon um dich einzuloggen:

WordPress.com-Logo

Du kommentierst mit Deinem WordPress.com-Konto. Abmelden /  Ändern )

Google Foto

Du kommentierst mit Deinem Google-Konto. Abmelden /  Ändern )

Twitter-Bild

Du kommentierst mit Deinem Twitter-Konto. Abmelden /  Ändern )

Facebook-Foto

Du kommentierst mit Deinem Facebook-Konto. Abmelden /  Ändern )

Verbinde mit %s

This site uses Akismet to reduce spam. Learn how your comment data is processed.