PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Suche nach Stepper-Library



fredyxx
31.05.2016, 17:57
Hallo,

nachdem ich nun einige Zeit mit 2 Stepper-Libraries experimentiert habe, nämlich "Stepper" der in den Arduino Beispielen vorhanden ist, und "CustomStepper".

Nachteile der Ersten:
- stoppt den Programmablauf in der Zeit, in der der Motor laufen soll. Ok kann man insbesondere bei Motoren mit integriertem Getriebe kurz halten.
- es ist zwar ein Quasi-Gleichzeitbetrieb von 2 oder mehreren Motoren möglich, aber nur immer mit einer, der kleinsten Speed.
- Strom wird bei Stillstand nicht abgeschaltet. Mag für ein Haltemoment manchmal nötig sein.

Nachteile der Zweiten:
- hohe Empfindlichkeit bei Zeitproblemen (kein delay, nicht zu schnelle Ausgabe mit Serial.print). Ich weiß, delay sollte man auch nicht verwenden!!
- beeinflusst offensichtlich auch andere Timer

Das ist sicher kein vollständiges Bild der beiden Libraries.

Nun 2 Fragen:
- gibt es für den Stepper doch eine Möglichkeit des gleichzeitigen Betriebs von 2 oder mehr Motoren mit unterschiedlichen Speeds?

- Gibt es eine andere Library für einen Stepperantrieb, die diese Nachteile nicht hat und bei der man evtl. einen Drehwinkel vorgeben kann?

Gruß
fredyxx

PICture
31.05.2016, 19:44
Hallo!


- gibt es für den Stepper doch eine Möglichkeit des gleichzeitigen Betriebs von 2 oder mehr Motoren mit unterschiedlichen Speeds?

ja, wenn jeder Motor eigenen Controller hat.

fredyxx
31.05.2016, 21:45
Hallo!

ja, wenn jeder Motor eigenen Controller hat.

Meinst du das damit oder die Hardware?



#include <Stepper.h>

const int stepsPerRevolution = 2048; // mit 2048 macht der 28BYJ-48 genau eine Umdrehung.
// for your motor

// initialize the stepper library on pins 22 through 28:
Stepper myStepper(stepsPerRevolution, 22, 26, 24, 28);
Stepper Stepper2(stepsPerRevolution, 32, 36, 34, 38);



Das habe ich ja versucht und die o.g. Einschränkungen festgestellt.

Gruß fredyxx

PICture
31.05.2016, 22:00
Ich meine beides. Das kann für jeden Motor gleich aber ganz unabhängig voneinander sein.

fredyxx
31.05.2016, 22:38
Mit diesem Code laufen die Motore quasi gleichzeitig, aber beide mit derselben langsamen Geschwindigkeit.



#include <Stepper.h>

const int stepsPerRevolution = 2048; // mit 2048 macht der 28BYJ-48 genau eine Umdrehung.

// initialize the stepper library on pins 22 through 28:
Stepper myStepper(stepsPerRevolution, 22, 26, 24, 28); // keine saubere Reihenfolge, aber läuft nur so !
Stepper Stepper2(stepsPerRevolution, 32, 36, 34, 38);

void setup() {
Serial.begin(250000);
while (!Serial);

myStepper.setSpeed(16);
Stepper2.setSpeed(6);
}

void loop() {


myStepper.step(1); // während der läuft, stoppt der Programmablauf an dieser Stelle
// mit step(1) läuft der Motor fast kontnuierlich


Stepper2.step(1); // während der läuft, stoppt der Programmablauf an dieser Stelle
// mit step(1) läuft der Motor fast kontnuierlich

unsigned long millialt =micros();

Serial.print("Zeit = "); // die Programmlaufzeit bei diesem Programm ist ca. 80 us
Serial.println(micros() - millialt);


} // ***************ENDE loop



Gruß
fredyxx

i_make_it
01.06.2016, 05:33
Bei der Marlin Firmware für 3D-Drucker funktioniert es.
Da dort die Motordrehzahlen für X, Y, Z und den Filamentvorschub spätestens bei Kreisbahnen, aktivem Bead leveling und Filamentdurchmesser abhängigem Vorschub ständig variieren und sich zueinander andern wärend sie kontinuierlich laufen.

Allerdings dürfte es nicht ganz einfach sein da soweit einzusteigen um deren Stepper Steuerung für was eigenes zu extrahieren.
Beim Ramps 1.4 macht das Marlin mit bis zu 5 Steppern.
beim RAPS128 mit bis zu 6 Steppern. ( Korrektur: hier ist eigentlich das RADDS1.5 für den Due gemeint auf dem die RAPS128 als Treiber sitzen)

fredyxx
01.06.2016, 07:01
Hallo,
ich sehe das Problem ja auch nicht bei den Motoren, wenn jeder Motor einen eigenen Treber hat, sondern darin, das mit der Arduino Software zu realisieren.

Gruß
fredyxx

i_make_it
01.06.2016, 07:19
Marlin läuft auf Arduino (ist eine .ino).
Ramps1.4 ist ein Shield für einen Mega.

Oben hatte ich mich vertan.
RAPS128 ist der Motortreiber der beim RADDS Board benutzt wird (das meinte ich eigentlich) was wiederum ein Shield für einen Due ist.

PICture
01.06.2016, 08:48
... ich sehe das Problem ja auch nicht bei den Motoren, wenn jeder Motor einen eigenen Treber hat, sondern darin, das mit der Arduino Software zu realisieren.

Ich sehe kein Problem, wenn jeder Motor auch eigenen kleinen Controller (z.B. AVR Tiny) hat, der von Arduino erhaltene Parameter passend für den eigenen Treiber verarbeitet. ;)

fredyxx
01.06.2016, 09:19
Ich sehe kein Problem, wenn jeder Motor auch eigenen kleinen Controller (z.B. AVR Tiny) hat, der von Arduino erhaltene Parameter passend für den eigenen Treiber verarbeitet. ;)

Irgendwie verstehe ich das nicht.

Soll die Hardware dann so aussehen?

Arduino MEGA >> ATTINY 13A-PU >> Driver ULN2003 >> Stepper 28BYJ-48

Der ATTINY bekommt vom MEGA z.B Umdrehungen, Geschwindigkeit und Richtung. Rest erledigt der ATTINY ?

Dann habe ich natürlich weiter Fragen.

Wie kommunizieren MEGA und ATTINY ?
Wie bekommt der ATTINY ein Programm?

Gruß
fredyxx

Hubert.G
01.06.2016, 09:47
Die Steppertreiber brauchen doch nur einen Takt. Der Mega2560 hat eine Menge Timer die man verwenden kann. Ob es dafür aber Libs für die Arduino IDE gibt, kann ich nicht sagen. Das muss man wahrscheinlich zu Fuß programmieren.

i_make_it
01.06.2016, 09:50
Arduino MEGA
|
+-ATTINY 13A-PU >> Driver ULN2003 >> Stepper 28BYJ-48
|
+-ATTINY 13A-PU >> Driver ULN2003 >> Stepper 28BYJ-48
|
:
:
:
|
+-ATTINY 13A-PU >> Driver ULN2003 >> Stepper 28BYJ-48


So verstehe ich das auch.
Sinnvoll wäre das eventuell wenn man einen Motor mit einen Encoder und Drehmoment Ermittlung hat, da man da dann die Regelung für Drehzahlregelung,Positionsregleung und Drehmomentregelung dahin auslagern kann.

Da z.B. mit Marlin (das ja auf einigen 3D-Druckern läuft) bewiesen ist, das bis zu 6 Stepper unter Arduino laufen können und das mit unterschiedlichen und unabhängig voneinander variierenden Drehzahlen, wäre das hier überflüssig.
Es geht tatsächlich nur um die entsprechene Ansteuerung der Stepper.
Bei RAMPS werden die Motortreiber halt nur mit STEP und DIR angesteuert, ENABLE ist meines Wissens fest auf High gelegt. RADDS hat wohl ENABLE zum Ansteuern.
Lad Dir doch einfach mal Marlin runter und schau dir in der IDE die Stepper.h und Stepper.ccp an.
Eventuell bringt das neue Ideen.
Ansonsten mal:
https://github.com/laurb9/StepperDriver
probieren
das ist eine Library für: A4988, DRV8825, DRV8834 und andere DIR/STEP Motor Treiber.

fredyxx
01.06.2016, 22:12
Hallo,

ich werde weiter experimentieren.

Gruß

fredyxx

fredyxx
13.06.2016, 13:05
Hallo,

ich habe nun folgende Lösung gewählt:

für jeden der 6 Motore habe ich eine eigene Funktion, die mit den Parametern für AusgangsPin 1 - 4, der gewünschten Anzahl der Umdrehungen, der Drehgeschwindigkeit und - richtung aufgerufen wird. Ist vielleicht nicht die eleganteste Lösung, aber sie funktioniert.
In diesen Funktionen werden für die Stepperschritte die 4 Ausgänge für die unipolaren Stepper 28BYJ-48 erzeugt. Ich arbeite ohne Interrupt, aber mit der Funktion micros(). Das hat den Nachteil, dass die Drehgeschwindigkeit der Stepper nicht ganz genau ist, da sie in geringem Maße von der Programmzykluszeit abhängt. Das spielt aber für meine Anwendung keine große Rolle. Dafür können aber mehrere Motore gleichzeitig mit verschiedenen Geschwindigkeiten und Drehrichtungen drehen.

Gruß

fredyxx