Hallo zusammen, ich bin ganz neu hier im Forum, habe auch nur wenig Erfahrung mit Arduino und bin obendrein ein lausiger Programmierer...
Ich habe mir dennoch vorgenommen, eine Art Patchbay mit einem 8 Kanal Relais Modul zu basteln, welches ich über MIDI ansteuern möchte (Daten gehen über den RX Pin ein).
Hardwareseitig habe ich mir da diverse Youtube Videos zum Thema Arduino und MIDI angeschaut und darauf basierend zunächst einen Sketch programmiert, der jedes einzelne Relais über je einen Pin ansteuert, was auch soweit gut funktioniert hat.
Nun möchte ich allerdings auch noch eine 7 Segment Anzeige mit einbauen, welches anzeigt welches aktuelle "Preset" aktiv ist (also welche Relais gerade offen und welche geschlossen sind).
Da werden mir nun die Pins an meinem Arduino Uno knapp, weshalb ich zwei Schieberegister hintereinander geschaltet habe (74HC595) um so nur noch mit 3 Pins alles zu steuern.
Aktuell geht es mir aber erstmal nur um die Ansteuerung der 8 Relais, da ich die Segmentanzeige erst bestellt habe.
Und das funktioniert aus irgendeinem Grund nicht und ich komme nicht dahinter. Hier zunächst mal der Code:
// Relaisschaltung für Schieberegister 74HC595
#include <MIDI.h> // Midi Library einbinden
#define PIN_DATA 10 // Definiere PIN als seriellen Ausgang für Schieberegister Pin 14 (DS)
#define PIN_STORE 9 // Definiere PIN als Storage Pin für Schieberegister Pin 12 (ST_CP)
#define PIN_SHIFT 8 // Definiere PIN als Shift Pin für Schieberegister Pin 11 (SH_CP)
#define MIDI_CHANNEL 10 // Definiere Eingangs-MIDI-kanal
#define CC_NUMBER 20 // Definiere Eingangs-CC-Nummer
byte PRE_1[] = {1,1,1,1,1,0,1,1};
byte PRE_2[] = {0,0,0,0,1,0,1,1};
byte PRE_3[] = {1,1,0,0,1,0,1,1};
byte PRE_4[] = {0,0,0,1,0,1,1,1};
// Erzeuge Standard MIDI Instanz
MIDI_CREATE_DEFAULT_INSTANCE();
void setup() {
pinMode(PIN_STORE, OUTPUT); // Setze Steuer Pins auf OUTPUT
pinMode(PIN_SHIFT, OUTPUT); // ...
pinMode(PIN_DATA, OUTPUT); // ...
// Initialisiere Preset 3 beim Start (da häufig benutzt)
for (byte i = 0; i < sizeof(PRE_3); i++) {
digitalWrite(PIN_SHIFT, LOW); // Shift Pin auf Abruf
digitalWrite(PIN_DATA, PRE_3[i]); // Setze Daten Pin auf aktuellen binären Wert;
digitalWrite(PIN_SHIFT, HIGH); // Anschließend Wert ins Register schieben
}
digitalWrite(PIN_STORE, HIGH); // Für die Ausgabe an die Pins freigeben
// Starte MIDI
MIDI.begin(MIDI_CHANNEL); // Initialisiere MIDI Library und empfange Daten von MIDI Kanal 10
MIDI.setHandleControlChange(MyCCfunction); // Rufe bei CC-Daten Funktion "MyCCfunction" auf
}
void loop() { // Main loop
MIDI.read(); // Kontinuierliche Abfrage von MIDI Daten auf dem RX Pin starten
}
// Funktion zum Empfangen der CC Daten
void MyCCfunction(byte channel, byte number, byte value) {
if (number == CC_NUMBER) { // falls Daten von entsprechender CC empfangen werden ...
if (value < 30) { // ... und diese unter dem Wert 30 liegen ...
for (byte i = 0; i < sizeof(PRE_1); i++) {
digitalWrite(PIN_SHIFT, LOW); // Shift Pin auf Abruf
digitalWrite(PIN_DATA, PRE_1[i]); // Setze Daten Pin auf aktuellen binären Wert;
digitalWrite(PIN_SHIFT, HIGH); // Anschließend Wert ins Register schieben
}
digitalWrite(PIN_STORE, HIGH); // Für die Ausgabe an die Pins freigeben
}
else if (value >= 30 && value < 60) { // Sollten die Werte zwischen 30 und 59 liegen ...
for (byte i = 0; i < sizeof(PRE_2); i++) {
digitalWrite(PIN_SHIFT, LOW); // Shift Pin auf Abruf
digitalWrite(PIN_DATA, PRE_2[i]); // Setze Daten Pin auf aktuellen binären Wert;
digitalWrite(PIN_SHIFT, HIGH); // Anschließend Wert ins Register schieben
}
digitalWrite(PIN_STORE, HIGH); // Für die Ausgabe an die Pins freigeben
}
else if (value >= 60 && value < 90) { // Sollten die Werte zwischen 60 und 89 liegen ...
for (byte i = 0; i < sizeof(PRE_3); i++) {
digitalWrite(PIN_SHIFT, LOW); // Shift Pin auf Abruf
digitalWrite(PIN_DATA, PRE_3[i]); // Setze Daten Pin auf aktuellen binären Wert;
digitalWrite(PIN_SHIFT, HIGH); // Anschließend Wert ins Register schieben
}
digitalWrite(PIN_STORE, HIGH);
}
else if (value >= 90 ) { // Sollten die Werte größer gleich 90 liegen ...
for (byte i = 0; i < sizeof(PRE_4); i++) {
digitalWrite(PIN_SHIFT, LOW); // Shift Pin auf Abruf
digitalWrite(PIN_DATA, PRE_4[i]); // Setze Daten Pin auf aktuellen binären Wert;
digitalWrite(PIN_SHIFT, HIGH); // Anschließend Wert ins Register schieben
}
digitalWrite(PIN_STORE, HIGH);
}
}
}
Nachdem ich den Patch hochgeladen habe schalten die Relais zunächst das Initial Preset (Zeile 23 - 29), soweit so gut. Aber es entstehen keine Änderungen durch eingehende MIDI Daten wenn ich den Wert des CC 20 auf Kanal 10 über einen angeschlossenen Controller ändere. Das hat in dem Sketch, den ich für einzelnen Ausgänge des Arduino Boards vorher geschrieben habe problemlos funktioniert. MIDI Daten kommen offenbar an, denn die RX LED blinkt immer wieder auf, wenn ich einen CC Controller betätige.
Jemand eine Idee?