Hallo zusammen,
ich habe versucht einen StepperMotor nach dem Betätigen eines Tasters an Pin2 für 1000 Schritte laufen zu lassen. Wenn der Taster erneut gedrückt wird, soll der Stepper wieder die 1000 Schritte zurück laufen usw.. Der Code dafür sieht so aus:
#include <Stepper.h>
// Anzahl der Schritte pro Umdrehung des Motors
const int STEPS1 = 200;
// Pinbelegungen für den Schrittmotor
const int MOTOR_PIN1 = 8;
const int MOTOR_PIN2 = 9;
const int MOTOR_PIN3 = 10;
const int MOTOR_PIN4 = 11;
// Pinbelegung für den Taster
const int BUTTON_PIN = 2;
// Schrittmotor-Objekt
Stepper myStepper(STEPS1, MOTOR_PIN1, MOTOR_PIN3, MOTOR_PIN2, MOTOR_PIN4);
// Variablen für die Schrittzählung und die Schrittrichtung
int stepsCount = 0;
int stepsDirection = 1;
// Variablen für die Tasterabfrage
int buttonState = 0;
int lastButtonState = 0;
void setup() {
// Initialisierung der seriellen Schnittstelle
Serial.begin(9600);
// Initialisierung des Schrittmotors
myStepper.setSpeed(300);
// Initialisierung des Tasters
pinMode(BUTTON_PIN, INPUT);
digitalWrite(BUTTON_PIN, HIGH); // interner Pull-Up-Widerstand aktivieren
}
void loop() {
// Tasterabfrage
buttonState = digitalRead(BUTTON_PIN);
if (buttonState != lastButtonState) {
if (buttonState == LOW) {
// Taster wurde gedrückt
stepsCount += stepsDirection * 1000;
Serial.print("Schritte: ");
Serial.println(stepsCount);
}
lastButtonState = buttonState;
}
// Schrittmotor ansteuern
if (stepsCount != 0) {
myStepper.step(stepsDirection);
stepsCount -= stepsDirection;
}
}
Jetzt das Problem: Sobald ich den Taster an Pin2 gegen GRN schalte, dann brummt der Steppermotor kurz, 1000 Schritte macht er aber nicht.
Hat jemand eine Idee, ob der Fehler im Code liegen könnte?
Liebe Grüße
Frank
Hallo Frank,
poste mal ein paar Informationen zu deiner Hardware. Was ist das für ein Stepper, und wie hast Du ihn angeschlossen? Was verwendest Du als Stromversorgung? Ein Schaltbild wäre auch interessant.
Eine Ursache könnte sein, dass der Stepper aus dem Stand heraus mit deiner Schttrate nicht zurecht kommt. Dann brummt/summt er nur, bewegt sich aber nicht.
Deinen Sketch habe ich nur an der Stelle geändert, auf die @fony bereits hingewiesen hat:
// Initialisierung des Tasters
pinMode(BUTTON_PIN, INPUT_PULLUP);
damit der Port im offenen Zustand auf HIGH liegt.
Mir sind mehrere Dinge aufgefallen:
Deine Tastenabfrage ist nicht entprellt. Daher wird der Wert u.U. bei mehreren loop()s nacheinander mehrfach verändert .... Siehe auch bei Wokwi in der Simulation ...
Der Sketch verändert nicht die Drehrichtung, sondern addiert regelmäßig stepsDirection*1000 = 1000 zu stepsCount
Der Wert von stepsCount wird bei jedem Durchgang, bei dem stepsCount ungleich Null ist, um stepsDirection (also 1) reduziert ...
Das scheint nicht das zu sein, was Du willst ...
Und die MOTOR_PINs sind in der Reihenfolge 1, 3, 2, 4 in der Initialisierung angegeben; bei 1:1 Verdrahtung (siehe Grafik) sollte das in der Reihenfolge 1, 2, 3, 4 vorgenommen werden.
P.S.: Der große Knackpunkt dazu ist aber auch noch, dass der Stepper mit stepsDirection statt stepsCount angesteuert wird und dem Stepper keine Zeit gelassen wird, die Steps durchzuführen Oha ...
if (stepsCount != 0) {
myStepper.step(stepsDirection);
stepsCount -= stepsDirection;
}
Hallo zusammen,
Zunächst vielen Dank für eure Hinweise, ich habe mich prompt an die Fehlersuche begeben. Entschuldigt bitte die späte Rückmeldung, aber ich wollte einen Defekt des Motors ausschließen und habe mir einen neuen besorgt.
Die Vorschläge habe ich verstanden und versucht umzusetzen, aber auch mit dem neuen Motor funktioniert das nicht.
Es handelt sich um den Schrittmotor 28BYJ-48 mit ULN2003 Treiberplatine am Arduino. Im Prinzip das Setup wie hier:
Angeschlossen ist der Schritmotor an 8,9,10,11 und der Pin 2 wird für den Taster genutzt. Ich habe den ersten Code von Funduino testweise ausprobiert…
int SPU = 2048; // Schritte pro Umdrehung.
Stepper Motor(SPU, 8,9,10,11); // Der Schrittmotor erhält die Bezeichnung "Motor" und es wird angegeben an welchen Pins der Motor angeschlossen ist.
void setup() //Hier beginnt das Setup.
{
Motor.setSpeed(5); // Angabe der Geschwindigkeit in Umdrehungen pro Minute.
}
void loop() {
Motor.step(2048); // Der Motor macht 2048 Schritte, das entspricht einer Umdrehung.
delay(1000); // Durch diese Pause bleibt der Motor nach der Drehung für eine Sekunde stehen.
Motor.step(-2048); // Der Motor macht durch das Minuszeichen 2048 Schritte in die andere Richtung.
delay(1000); // Durch diese Pause bleibt der Motor nach der Drehung für eine Sekunde stehen.
}
…aber auch der funktioniert nicht. Der Motor läuft zwar, aber immer nur in eine Richtung. Die Pins habe ich angepasst. Da ich den Motor getauscht habe, gehe ich jetzt von einem defekten Board aus. Kann man das testen?
Ich werde eine neues Board bestellen und falls der Fehler am Board liegt, werde ich dies hier einstellen.
Lieben Dank für eure tolle Unterstützung.
Mit dem Code von oben (#6) fällt mir dabei folgendes auf:
Der Code compiliert zuerst mal nicht, weil folgende Zeile fehlt:
#include <Stepper.h>
Wenn ich diese einfüge, dann dreht auch bei mir der Stepper nur in eine Richtung.
Aber dieses Problem hatte ich vor einiger Zeit schon mal. Die Lösung war: Das Tauschen von 2 Anschlüssen. Bei mir waren es die beiden "inneren". Im konkreten Beispiel also 9 und 10.
Der Tausch kann in Hardware oder Software erfolgen.
Hier mal die Variante "Tausch in Software":
// Anschlüsse:
// IN1 ...... 8
// IN2 ...... 9
// IN3 ...... 10
// IN4 ...... 11
#include <Stepper.h>
int SPU = 2048; // Schritte pro Umdrehung.
Stepper Motor(SPU, 8, 10, 9, 11); // Die Anschlüsse werden "per Software" ausgekreuzt
void setup() {
Motor.setSpeed(5);
}
void loop() {
Motor.step(2048); // Der Motor macht 2048 Schritte, das entspricht einer Umdrehung.
delay(1000);
Motor.step(-2048); // Der Motor macht durch das Minuszeichen 2048 Schritte in die andere Richtung.
delay(1000);
}
So wird eine Umdrehung im Uhrzeigersinn gemacht und dann eine Umdrehung gegen den Uhrzeigersinn.
Vielleicht hilft der Austausch (9 und 10) ja auch bei dir.
Der "Tausch der inneren Pins" findet sich übrigens auch auf der verlinkten Website (siehe #6) im Beispielcode von Funduino.
Hallo zusammen,
ich kann Erfolg melden und die damit verbundenen Lösung:
Der Hinweis war goldrichtig, das ließ den Stepper in die gewünschte Richtung laufen. Der Sketch von ec2021 passte eigentlich auch, für meinen Stepper gab es aber ein Geschwindigkeits- und Spannungsproblem.
myStepper.setSpeed(300);
war zu hoch angesetzt. Mit 200er Geschwindigkeit funktionierte das. Außerdem benötigte der Stepper eine Spannung von 12V. 5V reichte ebenfalls nicht aus.
Vielen Dank für eure Hinweise!
Frank
Hier der funktionierende Code:
/*
https://wokwi.com/projects/359373581053041665
Nachbau spruenki für
https://forum.arduino.cc/t/steppermotor-startet-nicht/1102814
Mit Änderungen, um das gewünschte Verhalten zu erzeugen
ec2021
*/
#include <Stepper.h>
// Anzahl der Schritte pro Umdrehung des Motors
const int STEPS1 = 200;
// Pinbelegungen für den Schrittmotor
const int MOTOR_PIN1 = 8;
const int MOTOR_PIN2 = 10;
const int MOTOR_PIN3 = 9;
const int MOTOR_PIN4 = 11;
// Pinbelegung für den Taster
const int BUTTON_PIN = 2;
// Schrittmotor-Objekt
// Stepper myStepper(STEPS1, MOTOR_PIN1, MOTOR_PIN3, MOTOR_PIN2, MOTOR_PIN4);
// ACHTUNG: Pin Initialisierung an die Gegebenheiten hier bei Wokwi angepasst!!
Stepper myStepper(STEPS1, MOTOR_PIN1, MOTOR_PIN2, MOTOR_PIN3, MOTOR_PIN4);
// Variablen für die Schrittzählung und die Schrittrichtung
int stepsCount = 0;
int stepsDirection = 1;
// Variablen für die Tasterabfrage
boolean buttonReleased(){
static unsigned long lastChange = 0;
static int lastButtonState = HIGH;
static int bState = HIGH;
boolean Released = false;
int state = digitalRead(BUTTON_PIN);
if (state != lastButtonState) {
lastChange = millis();
lastButtonState = state;
}
if (millis()-lastChange > 30 && lastButtonState != bState){
bState = lastButtonState;
Released = bState;
}
return Released;
}
void setup() {
// Initialisierung der seriellen Schnittstelle
Serial.begin(9600);
// Initialisierung des Schrittmotors
myStepper.setSpeed(200);
// Initialisierung des Tasters
pinMode(BUTTON_PIN, INPUT_PULLUP);
digitalWrite(BUTTON_PIN, HIGH); // interner Pull-Up-Widerstand aktivieren
}
void loop() {
if (buttonReleased()) {
// Taster wurde gedrückt und wieder losgelassen
stepsCount = stepsDirection * 1000;
Serial.print("Schritte: ");
Serial.println(stepsCount);
}
// Schrittmotor ansteuern
if (stepsCount != 0) {
myStepper.step(stepsCount);
stepsCount = 0;
stepsDirection = -stepsDirection;
delay(500);
}
}