Hallo Microbahner, Hallo agmue,
ich habe mir die Schrittmotor-Beispiele der Moba-Tools angeschaut. Da gibt es einige Zeilen die ich nicht verstehe:
void loop() {
enum {ENDPOSITION, STARTPOSITION, BEWEGUNG};
static byte status; // Schrittkettenstatus
static bool alt = digitalRead(weiterPin), akt = digitalRead(weiterPin);
alt = akt;
akt = digitalRead(weiterPin);
Den zwei Variablen alt und akt wird der Zustand von Pin "weiterpin" zugewiesen
Dann wird alt = akt gesetzt
dann wird noch einmal akt neu eingelesen
dann gibt es eine Abfrage auf
} else if (alt && !akt) {
Da würde ich sagen das kann doch gar nicht funktionieren weil "alt" und "akt" den gleichen Wert haben müssten.
Dann kann doch true && !true bzw. false und !false niemals true ergeben.
Jedenfalls nicht zuverlässig weil ja genau passend wenn in akt noch einmal der Schaltzustand von "weiterpin" eingelesen wird sich der Schaltzustand von "weiterpin" geändert haben müsste.
Aber vielleicht habe ich auch gerade "unlogische" Tomaten auf den Augen. Kann die Tomaten mal bitte jemand abnehmen ich finde den "Lösehebel" nicht ;-)))
Edit hier der komplette code
/* Demo zum Anschluß eines unipolaren Stepmotors 28BYJ-48
mit Verwendung einer Beschleunigungsrampe
Slider-Minimalprogramm: Endposition - Startposition - Bewegung von Start- zu Endposition
Danke an 'agmue' vom arduino.cc Forum für dieses Beispiel
*/
#include <MobaTools.h>
MoToStepper Step1(4096); // HALFSTEP ist default
const byte linksPin = 8, rechtsPin = 9, weiterPin = 10;
void setup() {
Serial.begin(9600);
Serial.println("Anfang");
pinMode(linksPin, INPUT_PULLUP); // aktiv LOW
pinMode(rechtsPin, INPUT_PULLUP); // aktiv LOW
pinMode(weiterPin, INPUT_PULLUP); // aktiv LOW
Step1.attach( 4, 5, 6, 7 ); // Anschluß an digitalen Ausgängen; Treiber IN1,IN2,IN3,IN4
Step1.setSpeed( 60 ); // = 6 U/Min
}
void loop() {
enum {ENDPOSITION, STARTPOSITION, BEWEGUNG};
static byte status; // Schrittkettenstatus
static bool alt = digitalRead(weiterPin), akt = digitalRead(weiterPin);
alt = akt;
akt = digitalRead(weiterPin);
if (alt != akt) {
delay(30); // einfaches Entprellen
}
switch (status) {
case ENDPOSITION:
if (!digitalRead(linksPin)) {
Step1.doSteps(10);
} else if (!digitalRead(rechtsPin)) {
Step1.doSteps(-10);
} else if (alt && !akt) {
Step1.setZero(); // Endpunkt für Motor 1 setzen
Serial.println("STARTPOSITION");
status++;
} else {
Step1.stop();
}
break;
case STARTPOSITION:
if (!digitalRead(linksPin)) {
Step1.doSteps(10);
} else if (!digitalRead(rechtsPin)) {
Step1.doSteps(-10);
} else if (alt && !akt) {
Step1.setSpeed( 240 ); // = 24 U/Min
Step1.setRampLen(500); // Beschleunigung
Step1.write(0); // Bewegung zu Endpunkt
Serial.println("BEWEGUNG");
status++;
} else {
Step1.stop();
}
break;
case BEWEGUNG:
if ( !Step1.moving() ) { // warten bis die Bewegung abgeschlossen ist
Step1.setSpeed( 60 ); // = 6 U/Min
Step1.setRampLen(0); // Beschleunigung
Serial.println("ENDPOSITION");
status = 0;
}
break;
default:
status = 0;
}
}
viele Grüße Stefan