Steppermotor startet nicht

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.

Franz-Peter

Versuche so was im setup

Moin @spruenki,

das Schöne heutzutage ist ja, dass man vieles am Rechner simulieren kann, ohne den Aufbau real nachzustellen ... :wink:

Ich habe (hoffentlich korrekt) Deinen Aufbau bei Wokwi nachgebildet:

https://wokwi.com/projects/359372678957818881

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 ... :wink:

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.

Grafik:

Gruß
ec2021

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 :wink: Oha ...

  if (stepsCount != 0) {
    myStepper.step(stepsDirection);
    stepsCount -= stepsDirection;
  }

Und so könnte es aussehen, was Du eigentlich willst (hoffe ich jedenfalls :wink: ):

https://wokwi.com/projects/359373581053041665

/*
  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 = 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);
// 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(300);

  // 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); 
  }
}

Reagiert auf das Loslassen des Tasters ...

ec2021

Achtung: Die Motorpins ggf. noch anpassen!!!!

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:

Funduino

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.

Wokwi.com

Das kannte ich noch nicht und feiere das gerade. Lieben Dank anEc2021

Frank

Ich hab das mal nachgebaut.
Und zwar nicht in Simulation, sondern "in echt" :slight_smile:

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.

1 Like

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); 
  }
}

Super, dass es jetzt klappt!

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