PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Arduino und Stepper



Borsti089
06.10.2017, 20:30
Hallo, ich beschäftige mich gerade das erste Mal mit Arduino und Stepper.

Mein Vorhaben:
Der Stepper soll zu Beginn so lange fahren bis ein Taster gedrückt wird, quasi als Endschalter.
Um danach eigenständig eine Schleife mit vorgegebenen Schritten fahren.

Mein Problem:
ICH!!
Ich raff es einfach nicht.
Ich hab den Sketch bereits mehrfach aufgesetzt, komme aber nie auf das gewünschte Ergebnis.
Langsam aber sicher treibt mich das Ding noch zur Verzweiflung...

Hier einer der Sketche:

https://pastebin.com/embed_js/yzA9bSbi

Sisor
06.10.2017, 21:49
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.


#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

Borsti089
07.10.2017, 11:05
Ich sag mal vielen lieben Dank.
So ganz ist es noch nicht das wie ich es mir vorstelle.
Aber ich denke mal das werd ich dann mit ausprobieren hinbekommen.
Und evtl kapier ich dann auch mal die Befehle...

Danke nochmal!

shedepe
07.10.2017, 13:10
Mein Tipp. Lies die Dokumentation zur Servo Library ?