hilfe bei Fehlersuche

Hallo,
wir haben ein Skript geschrieben, das ihr ganz am ende sehen könnt jedoch bewegen sich unsere Motoren (Schrittmotoren) nicht. es lässt sich alles auf den Arduino (UNO) laden jedoch wenn man dann das Fach angibt passiert nichts.
Wir würden uns sehr freuen wenn jemand es zumindest versucht einen Fehler zu finden :smiley:
danke im voraus für die Zeit investierung

Skript:

int fach;

// Pindefinition der Motoren
const int StepMot1 = 12;  
const int RiMot1 = 11;
const int StepMot2 = 8; 
const int RiMot2 = 7;
const int StepMot3 = 5;
const int RiMot3 = 4;

// Definition der Drehrichtung
// Im Ausgang davon, dass rechts = hoch, links = runter, links = vor, rechts = zurück
const boolean links = 1;  
const boolean rechts = 0;
boolean flag;

int pos;  // aktuelle Position, muss bekannt sein, damit jeweils
         // ein Schritt nach links oder rechts ausgegeben werden kann

void setup()
{
 Serial.begin(9600);
 
 // Pins als Output festlegen
 pinMode(StepMot1, OUTPUT);
 pinMode(StepMot2, OUTPUT);
 pinMode(StepMot3, OUTPUT);
 
 pinMode(RiMot1, OUTPUT);
 pinMode(RiMot2, OUTPUT);
 pinMode(RiMot3, OUTPUT);
 
 pos = 0;  // und merken, dass er auf Schritt 0 steht
 
}
void loop()  {
if(Serial.available() > 0)
  {
    fach = Serial.read(); // das Fach wird aus dem seriellen Monitor erlesen
    
    // Fach 1: Herbert (unten links)
  if(fach == 'Herbert'  )
  {
    // Schritte a) Motor 3
           for (int i = 0; i < 200; i++)
      {
        digitalWrite(RiMot3, flag);
       digitalWrite(StepMot3, HIGH);
       delay(2);
       digitalWrite(StepMot3,LOW);
      } 
 if (flag == links) {flag=rechts;} else {flag= links;}
delay(1000);
         
     // Schritte Motor 2 
       for (int i = 0; i < 900; i++)
      {
        digitalWrite(RiMot2, flag);
       digitalWrite(StepMot2, HIGH);
       delay(2);
       digitalWrite(StepMot2,LOW);
      }
if (flag == links) {flag=rechts;} else {flag= links;}
delay(1000);
    //Schritte Motor 1
    for (int i = 0; i < 4400; i++)
      {
        digitalWrite(RiMot1, flag);
       digitalWrite(StepMot1, HIGH);
       delay(2);
       digitalWrite(StepMot1,LOW);
      }if (flag == links) {flag=rechts;} else {flag= links;}
delay(1000);


      //Schritte b) Motor 3
       for (int i = 0; i < 200; i++)
      {
        digitalWrite(RiMot3, flag);
       digitalWrite(StepMot3, HIGH);
       delay(2);
       digitalWrite(StepMot3,LOW);
      }if (flag == links) {flag=rechts;} else {flag= links;}
delay(1000);

      // jetzt zurück zu pos=0 durch Motor 1
       for (int i = 0; i < 4400; i++)
      {
        digitalWrite(RiMot1, flag);
       digitalWrite(StepMot1, HIGH);
       delay(2);
       digitalWrite(StepMot1,LOW);
      }if (flag == links) {flag=rechts;} else {flag= links;}
delay(1000);

       // Schritte Motor 2 zurück 
       for (int i = 0; i < 900; i++)
      {
        digitalWrite(RiMot2, flag);
       digitalWrite(StepMot2, HIGH);
       delay(2);
       digitalWrite(StepMot2,LOW);
      } 
    if (flag == links) {flag=rechts;} else {flag= links;}
delay(1000);

  }

als anhängsel jetzt nochmal das komplette programm

meins.ino (12.9 KB)

hi,

auf die schnelle gesehen:

Du definierst eine
int fach;

und fragst dann auf
if(fach == 'Herbert' )

gruß stefan

danke, da hast du recht, das ist auf jeden fall einer der fehler

könnt ihr noch andere fehler sehen ?

Serial.read liefert dir nur ein einziges byte. Daher war dein int schon richtig, du müsstes dann aber die Fächer mit Nummern belegen und die Nummern übertragen und prüfen.

Wenn du statt dessen einen String verwenden willst, dann brauchst du Serial.readString. Ich würde dann Serial.readStringUntil verwenden und einen Terminator mitschicken.

Die Richtungsänderung (also wieder auf Zurück schalten) machst du viel zu kompliziert.
flag = !flag;

so invertierst du den Wert (falls er true war, dann wird er danach false sein).

Und die Rumfahrerei solltest du in eine Funktion auslagern. Es ist ja immer das selbe. Fahre n Schritte auf der X-Achse, fahre n Schritte auf der Y-Achse, fahre n Schritte auf der Z-Achse.

Das mit dem flag machst du auch falsch. Du lässt Motor X fahren und setzt direkt hinterher das flag auf die andere Richtung um (du willst damit erreichen, dass Motor X nachher zurück fährt). Da flag aber für alle Motoren gilt, fährt Motor Y jetzt rückwärts und wechselt danach wieder. Motor Z fährt dann wieder vorwärts.

Du musst entweder jedem Motor ein eigenes flag verpassen oder flag erst nach der kompletten Hinbewegung (alle 3 Motoren sind gefahren) wechseln.

die motoren laufen jetzt porblemlos, allerdings, wenn wir einmal "herbert" in den serial monitor eingegeben hat, dann läuft er die if schleife immer wieder durch...

unten der code

meins.ino (10.7 KB)

Hier ist mit read_serial() eine vernünftige Funktion um einen String von der seriellen Schnittstelle einzulesen:
http://forum.arduino.cc/index.php?topic=329469.msg2273780#msg2273780

Dabei den Serial Monitor so einstellen dass er am Ende ein CR oder LF sendet! Sonst geht es nicht. Die Funktion liefert true zurück wenn ein String da ist. Ansonsten false. Dann ruft man sie ständig in loop() auf und fragt den Rückgabewert ab. Wenn true macht man was mit dem String

Das arbeitet mit C Strings. Die kannst du nicht mit == vergleichen. Statt dessen brauchst du strcmp(). Also so:

if(strcmp(serial_buffer, "Herbert") == 0)
{
}

Oder besser:

if(strcmp_P(serial_buffer, PSTR("Herbert")) == 0)
{
}

Dann belegt der Vergleichs-String kein RAM