bipolar Schrittmotor Steuerung für 2 Motoren die Synchron laufen sollen

Hallo zusammen.

Habe einen 4 Pin Bipolar Schrittmotor schon erfolgreich angesteuert mit folgendem Code unten.
Nun möchte ich einen 2 ten gleichen Motor Synchron ansteuern wie der erste Motor, aber mit weniger Zeiger Ausschlag.
Daztu muss ich die stepsPerRevolution (aktuell 185 für den ersten Motor) ja seperat hinschreiben in dem Befehl der Ansteuerung.
Nur wie ?
Der 2te Motor soll mit 110 Steps hoch und runter fahren.

Jemand einen Tipp ? :slight_smile:

Der Code sollte ja sonst selbsterklärend sein.
Also die 2 Motoren sollen gleichzeitig anfangen beide Nadeln Hochfahren, der eine Stoppt halt früher.

Dankeschön

//Erster Motor
#define A        2                     // the pin connected to the wire A of the coil A (or to the H-bridge pin controlling the same wire) 
#define A_bar    3                     // the pin connected to the wire A- of the coil A (or to the H-bridge pin controlling the same wire)
#define B        4                     // the pin connected to the wire B of the coil A (or to the H-bridge pin controlling the same wire)
#define B_bar    5                     // the pin connected to the wire B- of the coil A (or to the H-bridge pin controlling the same wire)

//Zweiter Motor
#define A2        8                      // the pin connected to the wire A of the coil A (or to the H-bridge pin controlling the same wire) 
#define A_bar2    9                      // the pin connected to the wire A- of the coil A (or to the H-bridge pin controlling the same wire)
#define B2        10                     // the pin connected to the wire B of the coil A (or to the H-bridge pin controlling the same wire)
#define B_bar2    11                     // the pin connected to the wire B- of the coil A (or to the H-bridge pin controlling the same wire)
#define x        4000                  // smaller values may make the motor produce more speed and less torque



void setup() {
  pinMode(A, OUTPUT);
  pinMode(A_bar, OUTPUT);
  pinMode(B, OUTPUT);
  pinMode(B_bar, OUTPUT);
  pinMode(A2, OUTPUT);
  pinMode(A_bar2, OUTPUT);
  pinMode(B2, OUTPUT);
  pinMode(B_bar2, OUTPUT);
}


void loop() {  
  for (int i = 0; i < (185/8) ; i++) {
    digitalWrite(A, HIGH);
    digitalWrite(A_bar, LOW);
    digitalWrite(B, LOW);
    digitalWrite(B_bar, LOW);
    delayMicroseconds (x);

    digitalWrite(A, HIGH);
    digitalWrite(A_bar, LOW);
    digitalWrite(B, HIGH);
    digitalWrite(B_bar, LOW);
    delayMicroseconds (x);
    
    digitalWrite(A, LOW);
    digitalWrite(A_bar, LOW);
    digitalWrite(B, HIGH);
    digitalWrite(B_bar, LOW);
    delayMicroseconds (x);

    digitalWrite(A, LOW);
    digitalWrite(A_bar, HIGH);
    digitalWrite(B, HIGH);
    digitalWrite(B_bar, LOW);
    delayMicroseconds (x);

    digitalWrite(A, LOW);
    digitalWrite(A_bar, HIGH);
    digitalWrite(B, LOW);
    digitalWrite(B_bar, LOW);
    delayMicroseconds (x);

    digitalWrite(A, LOW);
    digitalWrite(A_bar, HIGH);
    digitalWrite(B, LOW);
    digitalWrite(B_bar, HIGH);
    delayMicroseconds (x);

    digitalWrite(A, LOW);
    digitalWrite(A_bar, LOW);
    digitalWrite(B, LOW);
    digitalWrite(B_bar, HIGH);
    delayMicroseconds (x);

    digitalWrite(A, HIGH);
    digitalWrite(A_bar, LOW);
    digitalWrite(B, LOW);
    digitalWrite(B_bar, HIGH);
    delayMicroseconds (x);
  }
  delay(1000);  // the motor will complete a full revolution then waits for a second
  
  // Counter Direction 
  for (int i = 0; i < (185/8); i++) {
    digitalWrite(A, HIGH);
    digitalWrite(A_bar, LOW);
    digitalWrite(B, LOW);
    digitalWrite(B_bar, HIGH);
    delayMicroseconds (x);
    
    digitalWrite(A, LOW);
    digitalWrite(A_bar, LOW);
    digitalWrite(B, LOW);
    digitalWrite(B_bar, HIGH);
    delayMicroseconds (x);
    
    digitalWrite(A, LOW);
    digitalWrite(A_bar, HIGH);
    digitalWrite(B, LOW);
    digitalWrite(B_bar, HIGH);
    delayMicroseconds (x);

    digitalWrite(A, LOW);
    digitalWrite(A_bar, HIGH);
    digitalWrite(B, LOW);
    digitalWrite(B_bar, LOW);
    delayMicroseconds (x);

    digitalWrite(A, LOW);
    digitalWrite(A_bar, HIGH);
    digitalWrite(B, HIGH);
    digitalWrite(B_bar, LOW);
    delayMicroseconds (x);

    digitalWrite(A, LOW);
    digitalWrite(A_bar, LOW);
    digitalWrite(B, HIGH);
    digitalWrite(B_bar, LOW);
    delayMicroseconds (x);

    digitalWrite(A, HIGH);
    digitalWrite(A_bar, LOW);
    digitalWrite(B, HIGH);
    digitalWrite(B_bar, LOW);
    delayMicroseconds (x); 

    digitalWrite(A, HIGH);
    digitalWrite(A_bar, LOW);
    digitalWrite(B, LOW);
    digitalWrite(B_bar, LOW);
    delayMicroseconds (x);  
  }
  delay(1000);
}

Synchron heißt für mich gleichzeitig gleiche Drehgeschwindigkeit und jederzeit gleiche Winkelposition.

Du willst aber nur gleichzeitig 2 Motore ansteuern.

Mal Vorausgeschickt: so nicht.

Sollen die beiden Motore gleichschnell sein aber eine kürzer Drehen als der andere oder soll die Geschwindigkeit auch verschieden sein?

Grüße Uwe

uwefed: Synchron heißt für mich gleichzeitig gleiche Drehgeschwindigkeit und jederzeit gleiche Winkelposition.

Du willst aber nur gleichzeitig 2 Motore ansteuern.

Mal Vorausgeschickt: so nicht.

Sollen die beiden Motore gleichschnell sein aber eine kürzer Drehen als der andere oder soll die Geschwindigkeit auch verschieden sein?

Grüße Uwe

der erste Motor soll von null auf 190° der zweite Motor soll gleichzeitig von null auf ca 110° hochfahren

beide sollen die Endposition gleichzeitig erreichen.

und bei zurückfahren das gleiche: beide sollen gleichzeitig wieder auf der 0 (0°) Position ankommen.

Also es muss nicht Millisekunden genau sein, den das Auge sieht ja nicht all zu gut :D

Mit meinem Code oben konnte ich es so perfekt Einstellen mit dem ersten Motor. Der Halt ohne Stepper Library arbeitet..

Gruss Andreas

Hallo, leider liesst der 328p MCU, single core, ja nur 1 Befehls Linie von oben nach unten, somit kann ich zwar den ersten Motor ansteuern der zweite ja aber leider erst nach dem ersten Motor.

Ich sollte doch irgendwie 2 void Funktionen gestallten können die dann gleichzeitig ablaufen..?

Bisher leider ohne Erfolg rumgetestet.

Brauche eure Hilfe..

Ich möchte nicht auf die Stepper Library zurückgreiffen... die Beispielcodes hatten nicht wirklich funktioniert. Zeiger in slow betrieb, wie ein sekundenzeiger. Egal was ich eingestellt habe. Mit der obigen direkt ansteuerung habe ich erfolg und kann den umdrehungs Winkel und geschwindigkeit einstellen.

Es müssen auch nicht beide zeiger gleichzeitig am endpunkt ankommen. Ich kann das mit einem Delay Justieren. Nur Starten und auf die 0 Stellung zurückkommen sollte beide Motoren Synchron (Zusammen). Es muss nicht in Millis genau sein.

Hallo,

mit dem Spaghetti Code wird das nichts. Entweder schreibst du dir Funktionen die du per millis zeitlich aufrufst. Dann hinkt der eine Motor nur der Ausführungszeit einer Funktion hinterher. Sieht man optisch nicht. Oder nimmst 2 Motortreiber und eine Stepperlib. Bei ersteren lernste programmieren mit letzteren wirds richtig gut. Allerdings musste dann die Möglichkeiten der Lib überblicken. Übrigens void ist keine Funktion.

Daztu muss ich die stepsPerRevolution (aktuell 185 für den ersten Motor)

Der Wert "stepsPerRevolution" ist Motor spezifisch. Den kannst du nicht einfach so in Software ändern. Zumindest wäre das Widersinnig.

Vielleicht solltest du dir mal die AccelStepper Lib ansehen.

Ok der code ist spaghetti mist. stammt aber von Github… soviel dazu :wink: finde ihn gar nicht mist wen man den Motor Relativ einfach ansteuern möchte. die Arduino erklärung zur Stepper Lyb ist auch nur halbfertig… Beispiele fehlen! Habe ich doch schon paar mal Studiert.

#define stepsPerRevolution 200 // you can the number of steps required to make a complete revolution in the data sheet of your motor

mit diesem wert oder direkt als Statement eingetragen:

for (int i=0; i < (185/8); i++)

Kann ich wunderbar die Steps also Umdrehungswinkel einstellen auch die geschwindikeit:

#define x 5000 // smaller values may make the motor produce more speed and less torque 4000mind. 3500 will not work

Hi

Wenn Du eh schon ‘zu Fuß’ den Stepper ansteuerst - warum Das nicht auch mit dem 2.ten?
Klicke dafür auf Bresenham-Algorithmus
Was gut ist, zwei Achsen zeitgleich am Endpunkt ankommen zu lassen, sollte sich doch auch dafür eignen … genau: zwei Achsen zeitgleich am Endpunkt ankommen zu lassen.
Die Zeit bis zum nächsten Stepp berechnest Du bei jedem Schritt und prüfst in jedem Loop-Durchlauf, ob ‘die Zeit schon gekommen ist’.
Wenn, dann den Step ausführen und das nächste Wartezeit-Ende bestimmen.
Das mit beiden Achsel ‘gleichzeitig’.

Wenn Du jetzt noch eine dritte Achse dazu packst, hast Du schon fast eine CNC-Fräse/Plotter laufen.

MfG

PS: Vll. beim nächsten Mal die Vorschau benutzen, auch wenn’s nur ein banaler URL-Tag war …

Du fragst: "Ich setze mich ins Auto, aber der Motor springt nicht an!" Unsere Antwort: "Fülle Benzin in den Tank!" Deine Reaktion: "Laß mich mit dem Benzin in Ruhe, ich will doch nur mit dem Auto fahren!"

Deine Frage hat nichts mit Schrittmotoren zu tun, sondern lautet: "Wie kann ich zwei Prozesse gleichzeitig laufen lassen, wo doch nur ein Prozess möglich ist?" Die Antwort: "Kein delay und lasse mittels blinkWithOutDelay zwei LEDs mit unterschiedlicher Frequenz blinken. Das sind zwei quasie parallele Prozesse."

Ich hoffe, Du verstehst, was ich Dir sagen möchte.

Hallo,

ich glaube auch das Akropolis noch nicht verstanden hat wo sein eigentliches Problem liegt. Die Frage lautet nämlich wann welcher Stepper einen Schritt macht, dadurch kommt die zeitliche Komponente ins Spiel und dann kann man beide so steuern wie gewollt.

Wieviel Steps benötigt der "190° Stepper" für diese 190°. Wieviel Steps benötigt der "110° Stepper" für diese 110°. Die benötigte Zeit ist für beide gleich. Jetzt kannst du dir die Pausen zwischen den Steps für beide berechnen.

Und wie agmue schon schreibt, der Programmieransatz muss geändert werden. Schreibe dir Funktionen, arbeite mit millis. Mach dich frei von irgendwelchen Altlasten. Das Thema mit millis taucht hier jede Woche auf.