Hallo Leute und guten Abend,
ich hoffe ich bin hier richtig! ![]()
Ist mein erster Forumbeitrag.
Ich bastel gerade an einem Projekt bei dem ich nun nicht mehr weiter komme und hoffe auf Eure Hilfe.
Beschreibung:
Gitarren-Effektpedal-Looper.
Über mein Arduino Uno steure ich mithilfe von Tastern verschiedene Relais (im Testaufbau Leds) oder verschiedene Presets an. Dafür benutze ich einen Drehschalter mit drei Stellungen.
-
Stellung: Relais-Auswahl
-
Stellung: Relais-Auswahl als Preset auf einem der Taster speichern. (EEPROM.h)
-
Stellung: Auswahl des vorher gespeicherten Presets.
Die Idee des Aufbaus und der Umsetzung stammt von:
CarraN
Link:
Mit diesem Code hat es auch alles so weit funktioniert, nur wollte ich es gerne um ein Relais erweitern.
Der Code basiert auf der keypad.h library . Da ich durch die Anzahl der Pins am Arduino begrenzt war hab mir extra Pins mit dem MCP23017 über I2C geschaffen. Zur Ansteuerung benutze ich die MCP23017 Library, da sie für mich schnell verständlich war. (Gute Erklärung vom Verfasser: ).
Ich hab den Code nun für meine Anwendung umgeschrieben und alles funktioniert wie gewollt, bis auf eine Sache- Ich kann alle 6 Relais ansteuern (Led on/off) und meine Auswahl als eines von 6 Presets speichern. Sobald ich aber die Presets wieder aufrufe sind Relais 1 - 5 richtig geschalten und Relais 6 ist immer aus (LOW). Ganz egal wie das Preset aussieht Relais 6 ist immer aus und das frustriert mich, da ich den Fehler nicht finden kann. Ich vermute, dass ich entweder einen Fehler beim Speichern in den EEPROM oder beim Auslesen des EEPROM habe.
Ich habe mal beide Codes angehangen als Zip.
Looper_test_file ist der umgeschriebene Code von mir, Five_pedals_looper ist der Original Code den ich mir als Vorlage genommen habe.
Ich hoffe ihr könnt mir helfen.
Lieben Gruß und vielen Dank !
EDIT: looper_test_file befindet sich nun 2 Posts weiter unten.
EDITEDIT:
#define MCP_ADDRESS 0x20 // (A2/A1/A0 = LOW) /*Libraries hinzugefügt*/
#include <Wire.h>
#include <MCP23017.h>
MCP23017 myMCP(MCP_ADDRESS,13); /*Set Reset Pin 13*/
#include <EEPROM.h>
#include <Keypad.h>
/**/
const byte rows = 6; /*Manuelle Eingabe über Keypad*/
const byte cols = 3;
char keys[rows][cols] = { /*Keypad funktion, bsp. Pin-Eingabe-Feld. Aufgebaut wie eine Matrix*/
{'a','g','m'}, /*hier: 6Reihen; 3Spalten, daraus ergeben sich 18verschiedene Eingabe */
{'b','h','n'}, /*Möglichkeiten. die Cols stehen für den Poti (3Positionen/"Mode")*/
{'c','i','o'}, /*Rows sind die momentary switchs(Loop-Anwahl)*/
{'d','j','p'}, /*s.u. 18 versch. "cases" a-r*/
{'e','k','q'},
{'f','l','r'},
};
byte rowPins[rows] = {2,3,4,5,6,7}; /*Arduino Ausgang*/
byte colPins[cols] = {8,9,10}; /*Arduino Ausgang */
Keypad keypad = Keypad(makeKeymap(keys), rowPins, colPins, rows, cols);
/******************************************************/
void setup()
{
Serial.begin(9600);
Serial.println();
Serial.print("Loading...");
Serial.println();
/*digitalWrite(13,LOW); /*Reset vom MCP23017*/
/*delay(50);
digitalWrite(13,HIGH);*/
Wire.begin();
myMCP.Init();
for(int i=0; i<6; i++)
{
myMCP.setPortMode(B11111111, A); /*Port A - Relais alle Output*/
myMCP.setPortMode(B11111111, B); /*Port B - LEDs alle Output*/
myMCP.setPin(i, A, HIGH);
delay(60);
myMCP.setPin(i, A, LOW);
myMCP.setPin(i, B, HIGH);
delay(60);
myMCP.setPin(i,B, LOW);
}
for(int i=4; i>0; i--) /*buntes Farbspiel*/
{
myMCP.setPin(i, A, HIGH);
delay(60);
myMCP.setPin(i, A, LOW);
myMCP.setPin(i, B, HIGH);
delay(60);
myMCP.setPin(i,B, LOW);
}
myMCP.setAllPins(A, HIGH);
myMCP.setAllPins(B, HIGH);
delay (500);
myMCP.setAllPins(A, LOW);
myMCP.setAllPins(B, LOW);
Serial.print("Ready!");
Serial.println();
/*readPreset(11, 1, 0); /* initiate default mode */
}
/*********************************************************/
int value;
int Addr;
void memory(int addr, int led)
{
for(int i=0; i<6; i++)
{
value = EEPROM.read((addr)+ i);
EEPROM.write((addr) + i, myMCP.getPin(i, A));
myMCP.setPin(i, B, LOW); // all leds reset
Serial.print("Relais ");
Serial.print(i);
Serial.print(" stat: ");
Serial.print(value);
Serial.println();
}
Serial.println();
delay(100);
myMCP.setPin((led), B, HIGH);
delay(100);
myMCP.setPin((led), B, LOW);
delay(100);
myMCP.setPin((led), B, HIGH);
delay(100);
myMCP.setPin((led), B, LOW);
delay(100);
myMCP.setPin((led), B, HIGH);
delay(100);
myMCP.setPin((led), B, LOW);
delay(100);
myMCP.setPin((led), B, HIGH);
delay(100);
myMCP.setAllPins(B, HIGH);
delay(500);
myMCP.setAllPins(B, LOW);
}
/*********************************************************/
void resetAllRelays()
{
for(int i=0; i<6; i++)
{
myMCP.setPin(i, A, LOW);
}
}
/*********************************************************/
void resetAllLeds()
{
for(int i=0; i<6; i++)
{
myMCP.setPin(i, B, LOW);
}
}
/*********************************************************/
int Pa;
void writeOut(int relay)
{
resetAllLeds();
myMCP.togglePin((relay), A);
for (int e=0; e<6; e++)
{
Pa = myMCP.getPin(e, A);
Serial.print("Pin ");
Serial.print(e);
Serial.print(" stat: ");
Serial.print(Pa);
Serial.println();
}
Serial.println();
/* digitalWrite(ledPin[relay], !digitalRead(relayPin[relay])); /*from Original Script*/
/* thanks to anton.efremoff.1 for this tip */
}
/*********************************************************/
void readPreset(int addr, int pcNum, int led)
{
for(int i=0; i<6; i++)
{
myMCP.setPin(i, A, EEPROM.read((addr)+i));
myMCP.setPin(i, B, LOW);
myMCP.setPin((led), B, HIGH);
}
}
/*********************************************************/
void loop()
{
char key = keypad.getKey();
if(key) // Check for a valid key.
{
switch (key)
{
case 'a': // a to x //"LoopMode"
writeOut(0); // relay
break;
case 'b':
writeOut(1);
break;
case 'c':
writeOut(2);
break;
case 'd':
writeOut(3);
break;
case 'e':
writeOut(4);
break;
case 'f':
writeOut(5);
break;
/****************************** "STORE PRESET MODE" */
case 'g':
memory(11,0); //addr, led
break;
case 'h':
memory(21,1);
break;
case 'i':
memory(31,2);
break;
case 'j':
memory(41,3);
break;
case 'k':
memory(51,4);
break;
case 'l':
memory(61,5);
break;
/****************************** "READ PRESET MODE" */
case 'm':
readPreset(11, 1, 0); // addr, pcNum, led
break;
case 'n':
readPreset(21, 2, 1);
break;
case 'o':
readPreset(31, 3, 2);
break;
case 'p':
readPreset(41, 4, 3);
break;
case 'q':
readPreset(51, 5, 4);
break;
case 'r':
readPreset(61, 6, 5);
break;
}
}
}
five_pedals_looper.zip (4.05 KB)



