Hallo Leute, ich brauche dringend eure Hilfe. Ich bin dabei eine Cocktailmaschine zu bauen und mit Arduino zu programmieren. An sich hat es bisher immer gut geklappt nur jetzt wo alles aufgebaut und verdrahtet ist hängt es bei mir. Hier ist mein Programm: // include the library code: #include <LiquidCrystal.h> #include <Stepper.h> const int stepsPerRevolution = 200; // change this to fit the number of steps per revolution // for your motor // initialize the stepper library on the motor shield Stepper myStepper(stepsPerRevolution, 12, 13); // give the motor control pins names: const int pwmA = 3; const int pwmB = 11; const int brakeA = 9; const int brakeB = 8; const int dirA = 12; const int dirB = 13; int hallState_1 = 0; //Flasche1 - Hallsensor Signal int hallState_2 = 0; //Flasche2 - Hallsensor Signal int hallState_3 = 0; //Flasche3 - Hallsensor Signal int hallState_4 = 0; //Flasche4 - Hallsensor Signal int hallState_5 = 0; //Flasche5 - Hallsensor Signal int hallState_6 = 0; //Flasche6 - Hallsensor Signal int hallState_7 = 0; //Grundposition const int hallPin_6 = 30; //Flasche6 - Hallsensor Ausgang const int hallPin_5 = 31; //Flasche5 - Hallsensor Ausgang const int hallPin_4 = 32; //Flasche4 - Hallsensor Ausgang const int hallPin_3 = 33; //Flasche3 - Hallsensor Ausgang const int hallPin_2 = 34; //Flasche2 - Hallsensor Ausgang const int hallPin_1 = 35; //Flasche1 - Hallsensor Ausgang const int hallPin_7 = 36; //Grundposition const int magnet1Pin = 22 ;//Flasche1 - Magnetventil Ausgang const int magnet2Pin = 23;//Flasche2 - Magnetventil Ausgang const int magnet3Pin = 24;//Flasche3 - Magnetventil Ausgang const int magnet4Pin = 25;//Flasche4 - Magnetventil Ausgang const int magnet5Pin = 26;//Flasche5 - Magnetventil Ausgang const int magnet6Pin = 27;//Flasche6 - Magnetventil Ausgang // initialize the library with the numbers of the interface pins LiquidCrystal lcd(8, 9, 4, 5, 6, 7); char* myStrings[] = { // So uebersichtlich " ", "LongIslandIceTea", "Tequila Sunrise", " Blue Hawaiian ", " GinTonic ", " Basisl Smash ", " WodkaTonic ", " RumTonic ", " Caipirinha ", " Cuba Libre ", " Zombie ", "ChicagoFreestyle", "Sex on the Beach", "Hemingway Sour", "Electric Ice Tea", " Mai Tai ", " Blue Lagoon ", " Adios M ", " Tropical Derby ", " Aqua Velva ", " Angel Blue ", " Wrong Turn ", " Karussel ", "Don Julio Blanco", " Brown Russian " }; int i = 0; int k = 0; int f = 0; int a = 0; const int tasterrechtsPin = 41; //Bestätigung const int tasterlinksPin = 40; //Abbruch const int tasterupPin = 38; //Runter const int tasterdownPin = 39; //Hoch int tasterrechtsStatus = 0; int tasterlinksStatus = 0; int tasterupStatus = 0; int tasterdownStatus = 0; void setup() { pinMode(hallPin_1, INPUT); //Deklaration des Hallsensor1 Ausgangs als Arduino Eingang pinMode(hallPin_2, INPUT); //Deklaration des Hallsensor2 Ausgangs als Arduino Eingang pinMode(hallPin_3, INPUT); //Deklaration des Hallsensor3 Ausgangs als Arduino Eingang pinMode(hallPin_4, INPUT); //Deklaration des Hallsensor4 Ausgangs als Arduino Eingang pinMode(hallPin_5, INPUT); //Deklaration des Hallsensor5 Ausgangs als Arduino Eingang pinMode(hallPin_6, INPUT); //Deklaration des Hallsensor6 Ausgangs als Arduino Eingang pinMode(hallPin_7, INPUT); //Deklaration des Hallsensor1/Grundposition Ausgangs als Arduino Eingang pinMode(magnet1Pin, OUTPUT); //Deklaration des Magnetventil1 Eingangs als Arduino Ausgang pinMode(magnet2Pin, OUTPUT); //Deklaration des Magnetventil2 Eingangs als Arduino Eingang pinMode(magnet3Pin, OUTPUT); //Deklaration des Magnetventil3 Eingangs als Arduino Eingang pinMode(magnet4Pin, OUTPUT); //Deklaration des Magnetventil4 Eingangs als Arduino Eingang pinMode(magnet5Pin, OUTPUT); //Deklaration des Magnetventil5 Eingangs als Arduino Eingang pinMode(magnet6Pin, OUTPUT); //Deklaration des Magnetventil6 Eingangs als Arduino Eingang // set the PWM and brake pins so that the direction pins // can be used to control the motor: pinMode(pwmA, OUTPUT); pinMode(pwmB, OUTPUT); pinMode(brakeA, OUTPUT); pinMode(brakeB, OUTPUT); digitalWrite(pwmA, HIGH); digitalWrite(pwmB, HIGH); digitalWrite(brakeA, LOW); digitalWrite(brakeB, LOW); // set the motor speed (for multiple steps only): pinMode(tasterrechtsPin, INPUT); pinMode(tasterlinksPin, INPUT); pinMode(tasterupPin, INPUT); pinMode(tasterdownPin, INPUT); // set up the LCD's number of columns and rows: lcd.begin(16, 2); // Print a message to the LCD. lcd.setCursor(0, 0); lcd.print(" W e l c o m e "); lcd.setCursor(0, 1); lcd.print(" Cocktailwahl "); } void loop() { hallState_1 = digitalRead(hallPin_1); hallState_2 = digitalRead(hallPin_2); hallState_3 = digitalRead(hallPin_3); hallState_4 = digitalRead(hallPin_4); hallState_5 = digitalRead(hallPin_5); hallState_6 = digitalRead(hallPin_6); hallState_7 = digitalRead(hallPin_7); //Grundposition tasterdownStatus = digitalRead(tasterdownPin); tasterrechtsStatus = digitalRead(tasterrechtsPin); tasterlinksStatus = digitalRead(tasterlinksPin); tasterupStatus = digitalRead(tasterupPin); lcd.setCursor(0, 0); if (tasterrechtsStatus == HIGH) { lcd.setCursor(0, 1); lcd.print (" A B B R U C H! "); delay(250); lcd.setCursor(0, 0); lcd.print("FuerA B B R U C H"); lcd.setCursor(0, 1); lcd.print(" NochmalDruecken "); ++a; } else if( a == 2) { a = 0; } else if (tasterlinksStatus == HIGH) { lcd.setCursor(0, 0); lcd.print(" FuerZubereitung "); lcd.setCursor(0, 1); lcd.print(" NochmalDruecken "); ++k; } else if (tasterupStatus == HIGH) { i--; lcd.setCursor(0, 1); lcd.print(myStrings[i]); delay(650); } else if (tasterdownStatus == HIGH) { i++; lcd.setCursor(0, 1); lcd.print(myStrings[i]); delay(650); } // if ( tasterdownStatus == HIGH && tasterupStatus == HIGH && if ( a == 2) { lcd.setCursor(0, 0); lcd.print (" Cocktailwahl "); lcd.print (" "); } if (i == 25) { i = 1; lcd.setCursor(0, 0); lcd.print (" Cocktailwahl "); } if (i == 0) { i = 25; lcd.setCursor(0, 0); lcd.print (" Cocktailwahl "); } if (k == 2 && i == 1) // LongIslandIceTea { lcd.setCursor(0, 0); lcd.print("LongIslandIceTea"); lcd.setCursor(0, 1); lcd.print("LongIslandIceTea"); myStepper.setSpeed(20); myStepper.step(1); if ( hallState_4 == LOW && f == 0) //Grundposition { digitalWrite(brakeA, HIGH); //Motor bleibt stehen digitalWrite(brakeB, HIGH); digitalWrite(magnet4Pin, HIGH); lcd.setCursor(0, 0); lcd.print("Tequila laeuftein"); lcd.setCursor(0, 1); lcd.print(" NochmalDruecken "); delay(4500); //Flüssigkeit läuft ein //für 4cl 10000 und für 2 cl 4500 digitalWrite(magnet4Pin, LOW); digitalWrite(brakeA, LOW); //Motor läuft wieder an digitalWrite(brakeB, LOW); myStepper.step(1); ++f; } else { myStepper.step(1); } if (hallState_1 == LOW && f == 1) //Flasche 1 { digitalWrite(brakeA, HIGH); //Motor bleibt stehen digitalWrite(brakeB, HIGH); digitalWrite(magnet1Pin, HIGH); delay(4500); //Flüssigkeit läuft ein //für 4cl und für 2 cl 4500 digitalWrite(magnet1Pin, LOW); digitalWrite(brakeA, LOW); //Motor läuft wieder an digitalWrite(brakeB, LOW); myStepper.setSpeed(10); myStepper.step(-1); ++f; } else { myStepper.step(-1); } if (hallState_3 == LOW && f == 2) //Flasche 3 { digitalWrite(brakeA, HIGH); //Motor bleibt stehen digitalWrite(brakeB, HIGH); digitalWrite(magnet3Pin, HIGH); delay(4500); //Flüssigkeit läuft ein //für 4cl 10000 und für 2 cl 4500 digitalWrite(magnet3Pin, LOW); digitalWrite(brakeA, LOW); //Motor läuft wieder an digitalWrite(brakeB, LOW); myStepper.setSpeed(10); myStepper.step(100); ++f; } else { myStepper.step(1); } if (hallState_2 == LOW && f == 3) //Flasche 2 { digitalWrite(brakeA, HIGH); //Motor bleibt stehen digitalWrite(brakeB, HIGH); digitalWrite(magnet2Pin, HIGH); delay(10000); //Flüssigkeit läuft ein //für 4cl und für 2 cl 4500 digitalWrite(magnet2Pin, LOW); digitalWrite(brakeA, LOW); //Motor läuft wieder an digitalWrite(brakeB, LOW); myStepper.setSpeed(10); myStepper.step(100); ++f; } else { myStepper.step(1); } if (hallState_7 == LOW && f == 4) //Grundposition { digitalWrite(brakeA, HIGH); //Motor bleibt stehen digitalWrite(brakeB, HIGH); f = 0; k = 0; }}} Problem ist: der Motor fährt nicht los. das Display hängt sich auf sobald ich von dem letzten Cocktail in der Liste wieder auf den ersten springen will. und er verarbeitet mein Taster nur einmal keine zweimal das der Motor bei Bestätigung dann startet. Außerdem kann es sein das in meinen Motor allgemein ein Problem ist er rattert sehr dachte eigentlich es liegt am Grundaufbau noch aber vielleicht seht ihr ja genau den Fehler, der es im Programm ist. PS: Das Programm ist nur ein Ausschnitt für einen cocktail die anderen sind genauso nur das dort i einen anderen Wert hat.
Immer wenn Motoren und µC in Spiel sind: chekce doc mal ob AVR sich sporadisch resetet! Oft passiert es, wenn der Motor anläuft oder irgendein Relais eingeschaltet wird. Probehalber kannst mal AVR/Arduino von Batterien Speisen.
Findet jemand irgendwelche Logikfehler ??? weil daran liegt es habe einen Fehler gefunden: ei Tastendruck zählt er nicht nur 1 hoch sondern beliebig, dass habe ich jetzt schon geändert
Katrina, So ein Programm test, ohne genaue textuelle Beschreibung, was wann passieren soll und welche Ideen im Programmablauf stecken, ist nichts Wert. Hast du eine richtige Tastenentprellung in Gebrauch ? Was das ist ? Siehe: http://www.lothar-miller.de/s9y/categories/5-Entprellung Du MUST alle Hardwareteile einzeln, durch dedizierte Testprogramme, austesten. Nur so hast Du die Möglichkeit einzelne Hardwarefehler oder ein anderes Zeitverhalten zu finden. Wie sehen die EMV und EMVU Maßnahmen im Aufbau auf? Bitte mit Bildern.
Hallo Katrina, und die sehr vielen delay(650); usw. zeugen von wenig bis keiner Erfahrung in der Programmierung. Da hilft es auch nicht Arduino als Platform verwenden zu wollen. Bitte stelle auch noch einen kompletten Schaltplan des AVR µC Boards, der Peripherie und deren Beschaltung ein. Ich denke hier wurden schon viele Fehler gemacht. Im speziellen die Eingänge werden sicherlich nicht über Optokoppler geführt.
Einige Sachen, die mir aufgefallen sind: > char* myStrings[] das sind 25 Elemente --> Index von 0 - 24 > if (i == 25) <-- i kann maximal 24 sein! > { i = 1; ------------- > const int tasterrechtsPin = 41; //Bestätigung > const int tasterlinksPin = 40; //Abbruch ... >if (tasterrechtsStatus == HIGH) { // Taste gedrückt > lcd.setCursor(0, 1); > lcd.print (" A B B R U C H! "); tasterrechtsPin als Bestätigung definiert, bei Betätigung aber A B B R U C H! das gleiche gilt für tasterlinksStatus (für Zubereitung) -------------- > lcd.print("FuerA B B R U C H"); sind 17 Zeichen statt 16! -------------- > i=0; ... > else if (tasterupStatus == HIGH) { // Taste Up gedrückt > i--; // <-- i wird -1 > lcd.setCursor(0, 1); > lcd.print(myStrings[i]); > > delay(650); -------------- für weitere Hilfe: Schaltplan - Verdrahtung - Bilder welches MotorShield ? MfG Mandi
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.