Motor läuft nicht rückwärts

Hallo zusammen,
ich versuche gerade den Fehler in folgendem Code zu finden. Vielleicht hat jemand von euch eine Idee was ich hier falsch programmiert habe:

#include <AFMotor.h>

AF_DCMotor motor(1); // M1=1 M2=2 M3=3 M4=4
int buttonPin = A0;
bool running = false;
bool forward = true; // Vorwärtsrichtung zu Beginn des Programms

void setup() {
  pinMode(buttonPin, INPUT_PULLUP);
  motor.setSpeed(50); // 50
  motor.run(RELEASE);
}

void loop() {
  if (digitalRead(buttonPin) == LOW && !running) { // Starten bei Tastendruck
    running = true;
    uint8_t i;
    if (forward) {
      motor.run(FORWARD); // Vorwärts fahren
      for (i = 0; i < 255; i++) {
        motor.setSpeed(i);
        delay(20); // Beschleunigungszeit
      }
      for (i = 255; i != 0; i--) {
        motor.setSpeed(i);
        delay(20); // Abbremszeit
      }
      forward = false; // Nächster Durchlauf in umgekehrter Richtung
    } else {
      motor.run(BACKWARD); // Rückwärts fahren
      for (i = 0; i < 255; i++) {
        motor.setSpeed(i);
        delay(20); // Beschleunigungszeit
      }
      for (i = 255; i != 0; i--) {
        motor.setSpeed(i);
        delay(20); // Abbremszeit
      }
      forward = true; // Nächster Durchlauf in Vorwärtsrichtung
    }
    motor.run(RELEASE); // Pause
    delay(500);
    running = false;
  }
}

Mein Ziel ist es, den Motor mit einem Tastendruck laufen zu lassen. Danach bleibt der Motor stehen und soll bei erneutem Tastendruck wieder zurücklaufen. Leider fährt der Motor aber nicht in umgekehrter Richtung zurück, sondern beginnt immer wieder von vorne.
Liegt das vielleicht daran, dass meine Idee mit der Abfrage true/false hier nicht anwendbar ist?

Mein Setup:
Arduino Uno mit MotoShield L293d
Taster an Pin A0 und Getriebemotor an M1

Beste Grüße
Frank

Ne, Du hast vergessen der Variablen forward zu sagen, das die nicht true sein soll, sondern nach dem ersten Anlauf false werden muss.

    motor.run(RELEASE); // Pause
    delay(500);
    running = false;
    forward = !forward;  // <==***** Kehrt den Wert um
  }
}

Ansonsten ist noch viel Entwicklungspotential. :wink:

Davon bin ich überzeugt :wink:

    motor.run(RELEASE); // Pause
    delay(500);
    running = false;
    forward = !forward;  // <==***** Kehrt den Wert um
  }
}

Danke für den Tipp - das habe ich verstanden. Wenn ich die Variablenumkehr so einbaue, dann passiert aber nichts. Nach meiner Auffassung muss die Umkehrung vorher erfolgen vor der else-Schleife. Klappt aber auch nicht.

Ich würde als erstes mal eine andere lib benutzen.
Die wird seit 5 Jahren nicht mehr gepflegt... GitHub - adafruit/Adafruit-Motor-Shield-library: Adafruit Motor shield V1 firmware with basic Microstepping support. Works with all Arduinos and the Mega

Mal den Code umgeschrieben:

#include <AFMotor.h>

AF_DCMotor motor(1); // M1=1 M2=2 M3=3 M4=4
int buttonPin = A0;
bool running = false;
bool forward = true; // Vorwärtsrichtung zu Beginn des Programms

void setup()
{
  Serial.begin(9600);
  Serial.println(F("Start..."\r\n));
  pinMode(buttonPin, INPUT_PULLUP);
  motor.setSpeed(50); // 50
  motor.run(RELEASE);
}

void loop()
{
  if (digitalRead(buttonPin) == LOW && !running)   // Starten bei Tastendruck
  {
    running = true;
    uint8_t i;
    if (forward)
    {
      motor.run(FORWARD); // Vorwärts fahren
      Serial.print(F("vorwärts "));
    }
    else
    {
      motor.run(BACKWARD);
      Serial.print(F("rückwärts "));
    }
    Serial.println(F("ausgelöst"));
    for (i = 0; i < 255; i++)
    {
      motor.setSpeed(i);
      delay(20); // Beschleunigungszeit
    }
    for (i = 255; i != 0; i--)
    {
      motor.setSpeed(i);
      delay(20); // Abbremszeit
    }
    motor.run(RELEASE); // Pause
    Serial.println(F("Durchlauf beendet"));
    delay(500);
    running = false;
    forward = !forward; // Nächster Durchlauf in umgekehrter Richtung
  }
}

Was siehst Du im seriellen Monitor als Ausgabe, wenn Du die Taste drückst?
Passt die Ausgabe zur Drehrichtung?

motoshield L293d ist noch keine präzise Angabe was das für ein Motorshield ist.

Adafruit hat seine Motorshields von V1 auf V2 geändert und die neueren Version brauchen eine andere library als die alten Versionen weil da ganz andere chips verbaut sind.

Poste mal ein Foto von der Oberseite und der Unterseite von deinem shield

vgs

Hallo zusammen,

Ich komme leider nicht soweit. Ich bekomme eine Fehlerausgabe beim Compilieren:

In file included from
[...]
exit status 1

Compilation error: stray '' in program

So sieht mein Motorshield aus.

Okay, wieder etwas gelernt. Vielen Dank dafür!

Für eure Hilfsbereitschaft nochmals herzlichen Dank!

Oh nein, wie peinlich :see_no_evil:! Durch die Bitte den Motorshield zu fotografieren ist mir aufgefallen, dass ich den Motor an den falschen Pin angelegt habe (GND). Umgelegt und siehe da, jetzt arbeitet er korrekt mit dem Hinweis von my_xy_projekt
Vielen Dank für eure Geduld! :+1:

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.