Stepper Motor Problem

Hallo Zusammen,

ich habe folgendes vor, leider funktioniert es nicht so wie ich mir das vorstelle:

Ich habe zwei Stepper Motoren (NEMA17), die ich über den Arduino Uno und dem Adafruit Motorshield V2 ansteuere.
Die beiden Stepper Motoren sollen sich gleichzeitig eine gewisse Zeit lang drehen und dann ruhen (5 Sekunden). Danach sollen sie sich wieder so drehen wie beim ersten mal. Das soll ohne Stop Funktion so weiterlaufen.
Ich nutze die Accelstepper Bibliothek.

Die Motoren drehen sich nur einmal und dann nicht mehr.

Über ein paar hilfreiche Tipps wäre ich sehr verbunden, bin allerdings auch nicht der Profi bei Arduino, also verzeiht, falls ich grobe Schnitzer drin habe.

Danke im Voraus
Grüße
Sascha

Mein Code sieht wie folgt aus:

#include <Wire.h>
#include <AccelStepper.h>
#include <Adafruit_MotorShield.h>

Adafruit_MotorShield AFMS = Adafruit_MotorShield(); 


Adafruit_StepperMotor *myStepper1 = AFMS.getStepper(200, 1);
Adafruit_StepperMotor *myStepper2 = AFMS.getStepper(200, 2);

long myTimer = 0;
long myTimeout = 5000;

void forwardstep1() {  
  myStepper1->onestep(FORWARD, DOUBLE);
}
void backwardstep1() {  
  myStepper1->onestep(BACKWARD, DOUBLE);
}
// wrappers for the second motor!
void forwardstep2() {  
  myStepper2->onestep(FORWARD, DOUBLE);
}
void backwardstep2() {  
  myStepper2->onestep(BACKWARD, DOUBLE);
}

AccelStepper stepper1(forwardstep1, backwardstep1);
AccelStepper stepper2(forwardstep2, backwardstep2);


void setup()
{  
  AFMS.begin(); // Start the bottom shield
   
      stepper1.setMaxSpeed(30.0);
      stepper1.setAcceleration(100.0);
      stepper2.setMaxSpeed(30.0);
      stepper2.setAcceleration(100.0);
}

void loop()
{
if (millis() > myTimeout + myTimer ) {
      myTimer = millis();
  stepper1.move(1000);
  stepper2.move(1000);
   stepper1.run();
   stepper2.run();    
    }
 }

Papp' mal ein bischen debugoutput aka Serial.println(...) in dein loop()

Ganz nebenbei fragst Du millis() falsch ab - fällt Dir allerdings erst nach ca. 49,x Tagen 'auf die Füße'.

if (millis()-STARTZEIT>=WARTEZEIT){
   STARTZEIT+=WARTEZEIT; //oder STARTZEIT=millis(); ... dürfte aber länger dauern und ungenauer sein
   //tue irgendwas
}

Die run-Methode:

  stepper1.run();
   stepper2.run();

musst Du unabhängig von irgendeiner Bedingung ständig im loop aufrufen. Die gehören nicht in den if-Block rein.

P.S. außerdem müssen die Zeitvariablen als unsigned long definiert werden:

 unsigned long myTimer = 0;
unsigend long myTimeout = 5000;

Hi

Statt unsigned long geht auch uint32_t - DAS klappt auf ALLEN 'Arduinos' - egal, ob die kleinen AVRs, oder die großen ESP.
millis() ist ein 32-Bit-Wert - bei 'den Kleinen' ist Das - unter Anderem - unsigned long (kein Vorzeichen, 'long'=32 Bit).
uint32_t sagt GENAU Das aus - und dazu noch egal, welcher µC Da Seine Kreise dreht.
Einzig - 'int' ist DER Datentyp, wenn's um Geschwindigkeit geht - da Das DER Datentyp ist, Den die µC DIREKT verarbeiten können.
Das ist bei einem 'kleinen' Arduino zwar immer noch nicht uint16_t (ist eben ein 8-Bit'er), aber bei den ESP wohl 32 Bit breit. - DAS können die µC 'ziemlich einfach verdauen'.

Wer selber die Kontrolle darüber haben will, wie viele Bits wirklich bewegt werden, nimmt die uintx_t (oder intx_t), Wem Das 'scheiß egal' ist (oder sonstige Gründe hat), eben nicht.

MfG

postmaster-ino:
Einzig - 'int' ist DER Datentyp, wenn's um Geschwindigkeit geht - da Das DER Datentyp ist, Den die µC DIREKT verarbeiten können.
Das ist bei einem 'kleinen' Arduino zwar immer noch nicht uint16_t (ist eben ein 8-Bit'er)

Das solltest Du aber besser wissen - int ist immer mindestens 16 Bit breit und kann auf einem 'kleinen' AVR deshalb auch nicht direkt verarbeitet werden.

Das hat mit seinem Problem aber jetzt nichts zu tun.

postmaster-ino:
...
Das ist bei einem 'kleinen' Arduino zwar immer noch nicht uint16_t (ist eben ein 8-Bit'er), aber bei den ESP wohl 32 Bit breit. - DAS können die µC 'ziemlich einfach verdauen'.
...

Hatte ich erwähnt (und auch schon zuvor nicht verstanden, weshalb int 'wegen der Geschwindigkeit' zu 16 Bit wird - auf den AVRs.

MfG

PS: VOR Arduino war Byte 8 Bit, Word 16 Bit, D-Word 32 Bit und DD-Word 64 Bit. ALLES ganz einfach und - da in Assembler unterwegs (80286er - rein hobby-mäßig) - auch durchaus anwendbar - allerdings auch nur bei EINEM 'Typ'.

MfG

PS: nebenbei ist BYTE nicht wirklich mit '8 Bit' definiert - ASCII selbst lässt erahnen, daß auch schon Mal 7 Bit 'voll gut' waren - Zeichen bis 127 waren 'Standard' - drüber konnte Jeder machen, was Er wollte - Chaos pur ... lasst die Spiele beginnen :slight_smile:

Eine andere Ursache könnte sein, daß der Treiber oder das Netzteil nicht zum Schrittmotor paßt.

  • NEMA17 gibt den Durchmesser des Flansches des Motors an.
  • Treiber max 1,2A pro Ausgang.

Grüße Uwe

sascha9090:
Ich habe zwei Stepper Motoren (NEMA17),

Dass etwas wie NEMA17 eine Leistung beschreibt, ist ein leider weit verbreiteter Irrtum. Das ist eine Angabe zur Gehäuseform.

Gruß

Gregor

PS: Naja, wie Uwe schreibt, ist es sogar nur die Form des Flansches.

Dass etwas wie NEMA17 eine Leistung beschreibt, ist ein leider weit verbreiteter Irrtum. Das ist eine Angabe zur Gehäuseform

Nicht ganz. Ein großer Motor hat mehr Oberfläche und kann darum mehr Abwärme abführen.
Darum sagt die Größe des Gehäuses im Groben auch etwas über die Leistung aus.

Ich gebe Dir aber Recht daß die Größe des Motors das letzte ist, das ich wissen muß.

Was die Gehäusegröße nicht aussagt ist der Nennstrom und die Nennspannung / Wicklungswiderstand. Diese Parameter sind wichtig für die Auswahl des Treibers / Netzteil.

Grüße Uwe

Hallo,

danke für eure Antworten.
Habe nun die Zeitvariable als unsigned long definiert und den stepper1.run und stepper2.run aus der If Schleife entfernt.

Leider funktioniert es immer noch nicht.

Hat jemand noch einen Tipp?

Ich bin echt am verzweifeln.

Mir ist bewusst, dass NEMA17 keine Aussage über die Leistung abgibt.
Ich habe ein 12V , 1,25A Netzteil in der Verwendung.

Ich sehe mir mal das Datenblatt an.

Grüße

Dann zeige doch mal, wie Dein Sketch jetzt aussieht.

Gruß Tommy

Mein Code sieht so aus:

#include <Wire.h>
#include <AccelStepper.h>
#include <Adafruit_MotorShield.h>

//Adafruit_MotorShield AFMSbot(0x61); // Rightmost jumper closed
//Adafruit_MotorShield AFMStop(0x60); // Default address, no jumpers
Adafruit_MotorShield AFMS = Adafruit_MotorShield(); 

// Connect two steppers with 200 steps per revolution (1.8 degree)
// to the top shield
Adafruit_StepperMotor *myStepper1 = AFMS.getStepper(200, 1);
Adafruit_StepperMotor *myStepper2 = AFMS.getStepper(200, 2);

unsigned long myTimer = 0;
unsigned long myTimeout = 5000;

// you can change these to DOUBLE or INTERLEAVE or MICROSTEP!
// wrappers for the first motor!
void forwardstep1() {  
  myStepper1->onestep(FORWARD, DOUBLE);
}
void backwardstep1() {  
  myStepper1->onestep(BACKWARD, DOUBLE);
}
// wrappers for the second motor!
void forwardstep2() {  
  myStepper2->onestep(FORWARD, DOUBLE);
}
void backwardstep2() {  
  myStepper2->onestep(BACKWARD, DOUBLE);
}


// Now we'll wrap the 3 steppers in an AccelStepper object
AccelStepper stepper1(forwardstep1, backwardstep1);
AccelStepper stepper2(forwardstep2, backwardstep2);


void setup()
{  
  AFMS.begin(); // Start the bottom shield
   
      stepper1.setMaxSpeed(60.0);
      stepper1.setAcceleration(120.0);
      stepper2.setMaxSpeed(60.0);
      stepper2.setAcceleration(120.0);
}

void loop()
{
if (millis() > myTimeout + myTimer ) {
     myTimer = millis();
  stepper1.moveTo(1000);
  stepper2.moveTo(1000);
    
   Serial.println("Test");    
    }
   stepper1.run();
   stepper2.run();
   }

Das Datenblatt nennt die Werte:

PN: 17HS5425L20P1-X2

Nennspannung: 3,1 V
Nennstrom: 2,5 A
Widerstand: 1.25± 10% Ω/Phase

Treiber ist ja auf dem Motorshield installiert, oder?
Den kann ich ja nicht ändern.

Aber eina anderes Netzteil kann ich verwenden. Aber ich weiß nicht was für ein.
Habt ihr eine Idee?

Der Motor ist für einen Treiber mit Stromsteuerung gedacht. Zu deinem Shield passt der nicht. Auch die 2,5 A schafft das nicht.

Alles klar, vielen Dank, das erklärt dann einiges.

Ich denke der Threat kann geschlossen werden.

Gruß
Sascha

Nennspannung: 3,1 V
Nennstrom: 2,5 A
Widerstand: 1.25± 10% Ω/Phase

Doppelten Strom weil 2 Motore. Je nach Ansteuerungsmode dann auch doppelter Strom weil beide Wicklungen bestromt.

Ich habe ein 12V , 1,25A Netzteil

Sieht Du nicht daß das nicht zusammenpaßt?

Du brauchst entweder einen 12V, 0,3 bis 0,4A Motor, und ein stärkeres Netzteil.
oder
Einen geeigneten Stromtreiber und ein stärkeres Netzteil. Die üblichen A4988, DRV8825 können verwendet werden aber nicht mit Nennstrom des Motors. Für Bestromung mit Nennstrom brauchst Du einen stärkeren Treiber.

Grüße Uwe