Kleines Fahrzeug mit 2 Schrittmotoren steuern

Das Problem ist die 2 Motoren laufen nicht zusammen. ein Programmfehler? Bitte um Hilfe.

Arduino UnoR3
2 Schrittmotoren 28 BYJ-48 mit jeweils uln2003

9V für die Motoren
5 V DC für Arduino


Hier noch das Programm: Es soll eine gerade Strecke fahren dann eine Kurve dann wieder gerade Strecke usw.

//2 Motoren   X Schritte bei 1 Motor dann 2 Motor x Schritte 



// Definieren der Pins für den ersten ULN2003 Treiber Achtung: PINS gedreht wegen falscher stepper bibliothek stepper 1.1.3 Installation one this device 
const int in1 = 8;
const int in2 = 9;
const int in3 = 10;
const int in4 = 11;

// Definieren der Pins für den zweiten ULN2003 Treiber Achtung: PINS gedreht wegen falscher stepper bibliothek stepper 1.1.3 Installation one this device 
const int in5 = 4;
const int in6 = 5;
const int in7 = 6;
const int in8 = 7;

// Definieren der Schrittwerte für den Schrittmotor <link>28BYJ-48</link>
const int stepsPerRevolution = 2048;  // Der <link>28BYJ-48</link> hat 2048 Schritte pro Umdrehung

// Initialisieren der Stepper-Bibliothek
#include <Stepper.h>
Stepper myStepper1(stepsPerRevolution, in1, in3, in2, in4);  // Initialisieren des Schrittmotors1
Stepper myStepper2(stepsPerRevolution, in5, in7, in6, in8);  // Initialisieren des Schrittmotors2


void setup() {
  

  // Setzen der Pins als Ausgänge Motor1
  pinMode(in1, OUTPUT);
  pinMode(in2, OUTPUT);
  pinMode(in3, OUTPUT);
  pinMode(in4, OUTPUT);

  // Setzen der Pins als Ausgänge Motor2
  pinMode(in5, OUTPUT);
  pinMode(in6, OUTPUT);
  pinMode(in7, OUTPUT);
  pinMode(in8, OUTPUT);
}


void loop() {
 delay(1000);

 // x Schritt weiter
 myStepper1.setSpeed(15);  // Geschwindigkeit einstellen (in Umdrehungen pro Minute)max. 15 stabil
 myStepper2.setSpeed(15);   // Geschwindigkeit einstellen (in Umdrehungen pro Minute)max. 15 stabil
 
 myStepper1.step(2048);  // x Schritt weiter vorwärts
 myStepper2.step(-2048);  // x Schritt weiter vorwärts

 delay(1000);// Verzögerung X für stabil
    
 myStepper1.step(2048);  // x Schritt weiter Kurve
 myStepper2.step(0);
 delay(300);
 
 myStepper1.step(7243);  // x Schritt weiter vorwärts
 myStepper2.step(-7243);  // x Schritt weiter vorwärts
 delay(1000);

 myStepper1.step(2048);  // x Schritt weiter Kurve
 myStepper2.step(0);
 delay(300);
 
 myStepper1.step(7243);  // x Schritt weiter vorwärts
 myStepper2.step(-7243);  // x Schritt weiter vorwärts
 delay(1000);

 myStepper1.step(2048);  // x Schritt weiter Kurve
 myStepper2.step(0);
 delay(300);
 
 myStepper1.step(7243);  // x Schritt weiter vorwärts
 myStepper2.step(-7243);  // x Schritt weiter vorwärts
 delay(1000);
}
//Ende

Da Stepper.step() blockiert wird das vermutlich nur so was wie zwei Kreise, keine Gerade.

1 Like

Hallo,
nutze eine andere Lib für die Ansteuerung der der Motoren. Die von Dir verwendete arbeitet blockierend das Program läuft erst weiter wenn die Schritte abgearbeitete sind.
Die Lib Mobatools oder AccelSteppe können das besser.

1 Like

ok danke für die schnelle Antwort.

Danke für die schnelle Antwort. Ja fährt Kreise. versuche es mit Mobatools, alles umprogrammieren

Dieses Programm hat funktioniert, beide Motoren laufen gleichzeitig 5000 Schritte.
Vielen Dank für eure schnelle Hilfe.

#include <MobaTools.h>
MoToStepper Step1(2048);           
MoToTimer   delayTime;
MoToStepper Step2(2048);           

void setup() {
  Step1.attach( 4, 5, 6, 7 ); // Anschluß an digitalen Ausgängen; Treiber IN1,IN2,IN3,IN4
  //Step1.attach( SPI_1 );        // alternativ über SPI
  Step1.setSpeed( 150 );        // = 15 U/Min
  
  Step1.setZero();              // Referenzpunkt für Motor 1 setzen

  Step2.attach( 8, 9, 10, 11 ); // Anschluß an digitalen Ausgängen; Treiber IN1,IN2,IN3,IN4
  //Step2.attach( SPI_2 );        // alternativ über SPI
  Step2.setSpeed( 150 );        // = 15 U/Min
  
  Step2.setZero();              // Referenzpunkt für Motor 2 setzen
}

void loop() {
  Step1.write(5000);
  Step2.write(-5000);
}

28 BYJ-48 gibt es als 5V und als 12V Version. 9V, auch mit dem Spannungsabfall am ULN2003, ist dann entweder zu viel oder zu wenig.

Wobei 9V bei einem 12V Motor funktionieren kann, dieser aber weniger Kraft hat bzw bei einem geringeren Bremsmoment stehen bleibt. DH der Motor hat weniger Kraft als er haben könnte.
Grüße Uwe

1 Like

Ja die Spannungsversorgung muss ich mich noch drun kümmern. Das Fahrzeug soll vorerst ein Quadrat abfahren 1m x1m
Es soll noch ein HC SR 04 später dazukommen.

Die Motoren haben 5V DC hatte wohl meine Brille nicht auf, haben jedenfalls die 9V überlebt. Laufen sehr gut mit handy powerbank, 5V/2A, 5200mAH.
Danke nochmals.

Hier der neueste Stand:

//Robo 2 Motoren , getestet:ok 24.2.24
// Robo fährt im Quadrat 0,5mx0,5m endlos

#include <MobaTools.h>
const int i=0;
const int FULLROT1 = 2048;
const int FULLROT2 = 2048;

MoToStepper Step1(FULLROT1); // Motor 1
MoToStepper Step2(FULLROT2); // Motor 2

const byte stPn1[] = { 4, 5, 6, 7 }; // Pins für Motor 1
const byte stPn2[] = { 8, 9, 10, 11 }; // Pins für Motor 2

void setup() {
  Step1.attach(stPn1[0], stPn1[1], stPn1[2], stPn1[3]); // Motor 1 an digitalen Ausgängen anschließen
  Step2.attach(stPn2[0], stPn2[1], stPn2[2], stPn2[3]); // Motor 2 an digitalen Ausgängen anschließen

  Step1.setSpeed(300); // Geschwindigkeit von Motor 1 = 30 U/Min
  Step1.setZero(); // Referenzpunkt für Motor 1 setzen

  Step2.setSpeed(300); // Geschwindigkeit von Motor 2 = 30 U/Min
  Step2.setZero();//Referenzpunkt Motor2
  

}
  

void loop() {
  
  // Motor 1 und 2 bewegt sich vorwärts 
  Step1.doSteps(14500);//ca. 0,5m
  Step2.doSteps(-14500);
  
  while (Step1.moving()); // Warten, bis Motor 1 die Bewegung abgeschlossen hat
  Step1.doSteps(2200); // Motor 1 Kurve links empirisch ermittelt
  Step2.doSteps(2200);// Motor 2 läuft gegenläufig dadurch kurzer Kurvenradius

  while (Step1.moving()); //warten bis 1 die Bewegung abgeschlossen hat
  Step1.stop();//Motor1 anhalten
     
  while (Step2.moving()); // Warten, bis Motor 2 die Bewegung abgeschlossen hat
  Step2.stop(); // Motor 2 anhalten


 }

Überbleibsel?

Das ist Absicht, damit man, wenn man eine Globale Variable namens i definiert, auf die Finger gehauen kriegt. :stuck_out_tongue:

2 Likes

So ist es! :grinning:

1 Like

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