Forum: Mikrocontroller und Digitale Elektronik Arduino Display Motor digitale Taster


von Katrina (Gast)


Lesenswert?

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.

von Franzis I. (reparateur)


Lesenswert?

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.

von Katrina (Gast)


Lesenswert?

Mhm daran liegt es leider nicht. Aber Vielen Dank

von Katrina (Gast)


Lesenswert?

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

von Karl M. (Gast)


Lesenswert?

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.

von Karl M. (Gast)


Lesenswert?

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.

von Mandi (Gast)


Lesenswert?

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
Noch kein Account? Hier anmelden.