Um Frustration zu vermeiden und stückweise voranzukommen, kannst du dich an folgende Regeln halten:
1. In setup() sollten nur Initialisierungen stehen. Das ist kein muss, aber allgemeine Konvention.
2. Nutze Funktionen, um kleine Teilabschnitte der Logik abzubilden. Die kann man dann sinnvoll benennen und einzeln testen.
3. In loop() kannst du dann diese Funktion aufrufen und hast dort einen übersichtlichen Code, den man sofort versteht.
Im folgenden habe ich zu Demonstation deinen Code geändert, und die o.g. Punkte umgesetzt. Wie die Servo-Bibliothek funzt, habe ich mir nicht angeschaut, sondern einfach aus deinem Code kopiert.
Code:
#include <Wire.h>
#include <Adafruit_MotorShield.h>
#include "utility/Adafruit_MS_PWMServoDriver.h"
auto shield = Adafruit_MotorShield();
auto motor = shield.getStepper(200, 1);
enum { ENDSCHALTER = 5 };
bool gedrueckt(int pin) {
return !digitalRead(pin);
}
void warteBisGedrueckt(int pin) {
while(!gedrueckt(pin));
}
void fahreGeradeaus() {
Serial.println("Start geradeaus!");
motor->setSpeed(20); // 3 rpm
motor->step(10, FORWARD, DOUBLE);
}
void fahreManoever() {
Serial.println("Start Manoever!");
motor->step(80, FORWARD, DOUBLE);
Serial.println("1");
delay(2000);
motor->step(40, BACKWARD, DOUBLE);
Serial.println("2");
delay(2000);
motor->step(60, FORWARD, DOUBLE);
Serial.println("3");
delay(2000);
motor->step(60, FORWARD, DOUBLE);
Serial.println("4");
delay(2000);
motor->step(40, FORWARD, DOUBLE);
Serial.println("5");
delay(5000);
}
void macheNixMehr() {
Serial.println("Ende! Reset druecken!");
while(true);
}
void setup() {
pinMode(ENDSCHALTER, INPUT);
shield.begin();
Serial.begin(9600);
Serial.println("Setup fertig!");
}
void loop() {
if (!gedrueckt(ENDSCHALTER)) {
fahreGeradeaus();
}
warteBisGedrueckt(ENDSCHALTER);
fahreManoever();
macheNixMehr();
}
LG
Sisor
Lesezeichen