Schrittmotor läuft nicht rückwärts

Liebe Community,

ich versuche gerade einen Schrittmotor über meinen Arduino UNO anzusteuern.
Jetzt habe ich das Problem, dass der Schrittmotor nur vorwärts aber nicht rückwärts läuft.
Ich habe schon in einem extra Programm nur rückwärts laufen lassen, in dem es auch funktioniert hat.

Hier der Quellcode:

#include <Stepper.h> 
int SPU = 2048; 
int taster=7; 
int i ;
int x=450 ;
int tasterstatus=0; 
Stepper Motor(SPU, 3,4,5,6); 

void setup() 
{
Motor.setSpeed(5); 
pinMode(taster, INPUT); 
}

void loop()
{ 
tasterstatus=digitalRead(taster);
if (tasterstatus == HIGH)  {  
Motor.step(x);
for(i=0;i<1;i+0){
 tasterstatus=digitalRead(taster);
if (tasterstatus == HIGH)  { 
 Motor.step(-1*x);             
 i=1;
}
}
}
}

Das Problem liegt also darin, dass der Arduino, nur in diesem Programm, nicht auf auf das "-" reagiert.

Ich freue mich über jegliche Hilfe. :slight_smile:

MFG,
Einsteinli

Stepper_mit_Taster_vers.1.ino (419 Bytes)

Hallo,

dein Code in der loop ist ein komplett sinnloses Konstrukt, wenn ich das mal so sagen darf.
Die Stepper Lib dürfte auch gute Bsp. haben, denke ich.

2x hintereinander Tasterabfrage, warum?
Der µC ist schneller als du blinzeln kannst.

Fehlerhafte for Schleife. Mit globalen int i wird das so nix.

Hallo,

das Programm funktioniert einwandfrei. Abgesehen davon, dass er nicht rückwärts laufen will.
Unser Plan ist es, bei einem Modell ein Auto aus- und einparken zu lassen. Auf Knopfdruck, so oft wie halt gedrückt wird.
Und weil das Auto erst auf das zweite Drücken wieder einparken soll, muss der Taster zweimal abgefragt werden. Das funktioniert auch super (ich habe es mit einem großen und einem kleinen Schritt getestet).

Was wäre Dein Verbesserungsvorschlag? Denn natürlich ist das nicht gerade schön programmiert.

MFG,
Einsteinli

das Programm funktioniert einwandfrei.

Eine solche Schleife findest du in keinem Lehrbuch!

for(i=0;i<1;i+0)
for(i=0;i<1;)
Macht das gleiche...

Einsteinli:
das Programm funktioniert einwandfrei. Abgesehen davon, dass er nicht rückwärts laufen will.

Und das widerspricht sich doch.

Danke
aber mein Problem liegt darin, dass der Moter nicht rückwärts läuft und zwar nur in diesen Programm.
Irgendwelche Idean warum ?

Einsteinli:
Danke
aber mein Problem liegt darin, dass der Moter nicht rückwärts läuft und zwar nur in diesen Programm.
Irgendwelche Idean warum ?

Vermutlich weil du für beide Laufrichtungen den selben Taster verwendest.
Woher soll der Stepper wissen, welche Richtung du meinst ?
Was dir ja auch schon mitgeteilt wurde.

Und bitte setze deinen Sketch in Code-Tags, des ist so schlecht zu lesen.

Die Code-Tags kannst du selbst erstellen, am Anfang des Sketches [code] und am Ende [/code] jeweils ohne den Stern(*). Oder du nimmst die Schaltfläche </> im Editorfenster unter "Preview".

versuch es mal so, Taster 1. mal drücken vorwärts, Taster nochmal drücken rückwärts usw.

#include <Stepper.h>
int SPU = 2048;
const byte tasterPin=7;
int x=450 ;
bool tasterstatus;
bool state;
Stepper Motor(SPU, 3,4,5,6);

void setup()
{
Motor.setSpeed(5);
pinMode(tasterPin, INPUT);
}

void loop()
{
tasterstatus=digitalRead(tasterPin);

if (tasterstatus)  
{
 delay(3);//entprellen
 
 if (state)  
 {Motor.step(x);
   state=!state;}
 else
 {Motor.step(-1*x);  
   state=!state;}       
}
}

ok Danke (an HotSystems)

das nächste mal schreibe ich es in Code-Tags.
Das mit den Taster funktioniert (habe statt der Rückwärtsbewegung einfach eine deutlich kürzere Bewegung eigestellt als beim ersten Wert und dann bewegt er sich beim ersten mal drücken der Moter weiter als beim zweiten mal).
Ich verstehe nicht warum da Fehler auftreten sollten ?

Hallo,

#4 ... das hatte ich mich auch gefragt.

Scheinbar weißt du nicht was dein wilder Code macht.

tasterstatus = digitalRead(taster);

if (tasterstatus == HIGH)  {
  Motor.step(x);              // x = 450
  for (i = 0; i < 1; i + 0) {
    tasterstatus = digitalRead(taster);
    if (tasterstatus == HIGH)  {
      Motor.step(-1 * x);     // x = -450
      i = 1;
    }
  }
}

dein tasterstatus wird durch drücken high,
if wird demzufolge ausgeführt,
Motor.step ist bestimmt blockierungsfrei,
for Schleife wird umgehend abgearbeitet,
tasterstatus ist immer noch high, weil der µC Sau schnell ist, bzw. du den Finger nicht so schnell runter bekommst,
nächste if wird ausgeführt,
und hier wette ich das die Stepper Lib noch beschäftigt ist mit auf Position +450 fahren,
im gleichen Atemzug wird i auf 1 gesetzt, das wars gewesen für mal -1, die for wird nie wieder ausgeführt
die loop kann im besten Fall nur noch um 450 nach + fahren lassen, je nachdem was die Funktion Motor.Step() macht.

Die for Schleife ist in der Form völlig sinnfrei. Eine if Abfrage notfalls mit Verriegelung wäre sinnvoller. Zudem du noch deine Taster entprellen musst.

Danke für den Vorschlag ardubu,

Zu erst war da ein Fehlermeldung, da du "tasterPin" und "taster" (vermute ich) ausversehen für die selbe Sache genutzt hast.( habe einfach alle beide gleich genannt)
Doch bewegt er sich wieder nur vorwärts :frowning:

weißt du vielleicht weiter ?

Hallo,

mein letzter Hinweis, mach mal statt 3ms 30ms zum entprellen, lese den Thread und schau dir die Bsp. der Lib an, anstatt wild zu probieren wenn die Basics fehlen. Die muss du dir leider erarbeiten, da muss jeder durch. Ist leider so.

Das funst trotsdem nicht, auch bei 3s entprellen.

ich habe es nochmal ein wenig umgeschrieben, versuch es mal

#include <Stepper.h>
int SPU = 2048;
const byte tasterPin=7;
int x=450 ;
bool tasterstatus, stateAlt, dir;
Stepper Motor(SPU, 3,4,5,6);

void setup()
{
Motor.setSpeed(5);
pinMode(tasterPin, INPUT);
}

void loop()
{
tasterstatus=digitalRead(tasterPin);

if (tasterstatus != stateAlt) 
 {
 delay(3);//entprellen
 
 if (tasterstatus) 
    {dir=!dir;
     if(dir) Motor.step(x);
     else    Motor.step(-1*x);
    }
 stateAlt=tasterstatus;
 }
}

Wie hast du deinen Taster angeschlossen? Externer Pulldown Widerstand?

Vielen Dank

geht aber immer noch nicht, auch mit einer Prellzeit von 30ms.
Und ja ich verwende einen Pulldown Wiederstand von 1000Ohm.

PS: Hir merkt man, dass es mehr oder weniger wertvolle Beiträge gibt.

dreht denn dein Motor andersherum wenn du Motor.step(-450); schreibst?

Ja, in einem ganz einfachen Programm, dass nur den Motor zum drehen bringt funktioniert es mit einem "-" davor.

zeigst du das Programm mal?

Einsteinli:
PS: Hir merkt man, dass es mehr oder weniger wertvolle Beiträge gibt.

Ehrlich, diesen Satz verstehe ich nicht .
Und das hättest du dir sparen können.

Unsere Beiträge sind immer so wertvoll wie deinen Antworten.

Z.B. "Geht immer noch nicht" ist keine Antwort mit der irgend jemand etwas anfangen kann.
Ein paar mehr Informationen von deiner Seite wären da besser.
Aber das passt zu deinem Sketch.
Du solltest den etwas aufräumen und selbst ein paar Debugging-Zeilen einfügen, damit du erkennen kannst, wo dein Sketch hakt.