Zitat
0x20 ist ein ASCII-Leerzeichen (Space)
0x30 ist ASCII "0"
0x31 ist ASCII "1"
0x32 ist ASCII "2"
0x33 ist ASCII "3"
Somit steht hinter dem mir nichts sagenden 0x7d, 0x01, 0x00, 0x01, 0x00
der Text
Alles anzeigen
GO benutzt hier das Sysex-Nachrichtenformat von Hauptwerk. Das erste Byte 0x7d ist die feste Herstellerkennung, das darauffolgende Byte 0x01 ist der Code für eine LCD-Nachricht. Dann folgen zwei Bytes für die ID des anzusteuernden Panels (hier 0x01), und schließlich noch ein Byte für die Farbcodierung (hier 0x00). Danach kommt dann der Text als 32 Byte 7-bit ASCII. Nachzulesen ist das alles in der Bedienungsanleitung von Hauptwerk. Wenn man nur ein Panel selbst ansteuern will, kann man die ersten 5 Bytes der Nachricht auch ignorieren und nur die benötigten Bytes aus dem Text extrahieren. Diese lassen sich dann auch ganz einfach ausgeben, es handelt sich ja bereits um Text.
Ich stelle mir nun die Frage, was muss ich tun, um die dreistellige Anzeige aus GO via Arduino auf ein Display zu transportieren. Denn genau dafür kann die Anzeige doch Sysex senden.
Benutzt du weiterhin die Arduino Midi Library auf dem Controller? Falls ja, kannst du die Sysex-Nachrichten ganz einfach über einen Callback abfangen, und dann dein Display direkt mit dem empfangenen Text ansteuern.
#include "LedControl.h"
LedControl leds = LedControl(data_pin, clk_pin, load_pin, 1);
MIDI.setHandleSystemExclusive(clbkHandleSystemExclusive);
void clbkHandleSystemExclusive(byte* data, unsigned int dataSize) {
if(dataSize < 9 || data[2] != 1)
return; // Not an LCD message
if(data[4] != 1)
return; // Not the right LCD panel id
leds.setChar(0, 2, data[6], false); // Hunderter
leds.setChar(0, 1, data[7], false); // Zehner
leds.setChar(0, 0, data[8], false); // Einer
}
Alles anzeigen
Dieses Beispiel schreibt die empfangene Setzer-Nummer auf drei 7-Segment-Anzeigen. Wenn du stattdessen ein LCD-Panel ansteuern willst, kannst du einfach dafür eine passende Library nehmen. Bei der Ansteuerung ist noch darauf zu achten, dass data hier am Anfang auch das Startbyte 0xF0 und am Ende das Abschlussbyte 0xF7 enthält. Hairless-Midi zeigt dir in den Debug-Nachrichten nur die Sysex-Nachricht zwischen Start- und Endbyte an, daher ist im Code der Index um eins höher als man vielleicht erwartet.
Falls dir ein ausführlicheres Codebeispiel für den Arduino bei der Programmierung hilft, kannst du mal hier schauen. In MIDIControl.cpp findest du unter anderem den Code, den ich benutze um aus GO heraus die Setzer-Nummer mit einem Arduino auf einem 7-Segment-Panel anzuzeigen (allerdings versende ich in GO 16 Byte String Werte statt 32 Byte LCD Werte, das Prinzip ist aber das gleiche).
Ich würde dir den Ratschlag geben nur über deinen Spieltisch zu arbeiten. Bedeutet dein Arduino kümmert sich um alles und sendet nur noch was für Register gewählt werden sollen. Dann musst du zwar eine Logik schreiben welche die Daten speichert, aber das ist kein Problem. Beispiel du hast 30 Register und 10 Setzer. Dann erstellst du für jeden ein Array mit 30 Felder. Dort speicherst du einfach für jedes Register 0=Aus oder 1=An. Wenn du nun Taste 1 drückst, dann sendet dein Programm in einer Schleife einfach für jedes Register NoteON/OFF. Da deine Steuerung weiß was los ist kann sie auch selbstständig LED's schalten und ein Display ansteuern. GO müsste nur einmalig ein Signal senden wenn es gestartet wurde, damit dein Arduino den aktuellen Stand beim Start senden kann.
Ja, das kann man natürlich auch machen. Mir stellt sich allerdings die Frage, wieso es gerade für Programmiereinsteiger einfacher sein sollte gleich die ganze Setzerlogik selbst zu implementieren, anstatt einfach den internen Setzer von GO zu benutzen Der lässt sich über MIDI ja prinzipiell genauso ansteuern wie etwa die Registerschalter.