Forum: Mikrocontroller und Digitale Elektronik Arduino Schrittmotor


Announcement: there is an English version of this forum on EmbDev.net. Posts you create there will be displayed on Mikrocontroller.net and EmbDev.net.
von Kev (kev408)


Lesenswert?

Hallo,

ich habe hier einen Arduino Nano, einen 28BYJ-48 Schrittmotor und eine 
passende Treiberplatine.

Ich habe das Beispielprogramm von Funduino genommen und möchte den 
Winkel und die Geschwindigkeit einstellen. In dem Programm unten habe 
ich es schon hinbekommen, dass der Schrittmotor sich von 270° bis -270° 
dreht.

Ich weiß jetzt allerdings nicht wie ich die Geschwindigkeit anpassen 
kann. Ich möchte gerne dass der Schrittmotor dafür 1 Stunde braucht.
Motor.setSpeed kann ich nicht kleiner als 1 setzten. Wenn ich allerdings 
int SPU verkleinere ändert sich auch die Geschwindigkeit. Gibt es da 
eine Formel mit der man die Zeit berechnen kann? Irgendwie Werte 
ausprobieren ist ja auch nicht wirklich sinnvoll.
1
#include <Stepper.h> // Hinzufügen der Programmbibliothek.
2
int SPU = 2048; // Schritte pro Umdrehung.
3
Stepper Motor(SPU, 3,5,4,6); // Der Schrittmotor erhält die Bezeichnung "Motor" und es wird angegeben an welchen Pins der Motor angeschlossen ist.
4
5
void setup() //Hier beginnt das Setup.
6
{
7
Motor.setSpeed(1); // Angabe der Geschwindigkeit in Umdrehungen pro Minute.
8
}
9
10
void loop() {
11
Motor.step(1536); // Der Motor macht 2048 Schritte, das entspricht einer Umdrehung.
12
delay(500); // Durch diese Pause bleibt der Motor nach der Drehung für eine Sekunde stehen.
13
Motor.step(-1536); // Der Motor macht durch das Minuszeichen 2048 Schritte in die andere Richtung.
14
delay(500); // Durch diese Pause bleibt der Motor nach der Drehung für eine Sekunde stehen.
15
}

von Joe (Gast)


Lesenswert?

Pausen verlängern,
bzw. Einzelschritte ausführen und lange Pausen dazwischen machen.

von Maxl (Gast)


Lesenswert?

Die stepper lib beinhaltet die Funktion stepper.setSpeed(20).
Damit kann man die Geschwindigkeit in Umdrehungen pro Minute anpassen

von Kev (kev408)


Lesenswert?

Maxl schrieb:
> Die stepper lib beinhaltet die Funktion stepper.setSpeed(20).
> Damit kann man die Geschwindigkeit in Umdrehungen pro Minute anpassen

Die habe ich gefunden. Nur kann ich da nicht kleiner als 1 werden.

von OldMan (Gast)


Lesenswert?

Setze eine Timerinterupt mit einer Intervall von 1,7578125 Sekunden.
Bei jedem Tick lässt Du den Schrittmotor einen Schritt ausführen. Dann 
hast Du deine Dauer von 3600 Sekunden.
Oder ein (sehr unschön) ein Mikrosekunden delay.

von Frank E. (Firma: Q3) (qualidat)


Lesenswert?

"delay(x)" gilt zwar allgemein als "Bäh", weil der Arduino dann steht 
und nix Anderes mehr tut. Falls er aber wirklich keine andere Aufgabe 
haben sollte, ist das auch ok und der Einsatz von delay absolut 
"erlaubt" ...

von OldMan (Gast)


Lesenswert?

Frank E. schrieb:
> "delay(x)" gilt zwar allgemein als "Bäh", weil der Arduino dann steht
> und nix Anderes mehr tut. Falls er aber wirklich keine andere Aufgabe
> haben sollte, ist das auch ok und der Einsatz von delay absolut
> "erlaubt" ...

Es ging mir darum, dass der TO sich mit dem Thema Interrupt beschäftigt. 
Dass die "Arduino"-User mit den ganzen Libs überhaupt keinen Überblick 
über die Internas der AVR haben ist schon schlimm genug.
Ich konnte mich noch nie mit der Arduino Framework anfreunden. Das ist 
wie Android, weit weg von der Hardware (aus User Sicht).

von Wolfgang (Gast)


Lesenswert?

Kev schrieb:
> Ich weiß jetzt allerdings nicht wie ich die Geschwindigkeit anpassen
> kann. Ich möchte gerne dass der Schrittmotor dafür 1 Stunde braucht.
> Motor.setSpeed kann ich nicht kleiner als 1 setzten. Wenn ich allerdings
> int SPU verkleinere ändert sich auch die Geschwindigkeit. Gibt es da
> eine Formel mit der man die Zeit berechnen kann?

Formeln gibt es genug. Du musst nur die richtige auswählen - oder 
einfacher noch - du schreibst dir deine eigene Formel.

Wenn du Geschwindigkeit nicht in dem von dir gewünschten Bereich 
anpassen kannst, ist das Beispielprogramm von Funduino, besser deren 
Bibliothek vielleicht nicht für deine Anwendung geeignet. Da wirst du 
dir timergesteuert selber die Steuerpulse für deinen Treiber erzeugen 
müssen.
Bei so langsamen Drehungen werden allerdings oft besser Getriebe 
eingesetzt, z.B. Schnecke mit Schneckenrad, so dass sich der Motor 
deutlich schneller dreht und der Motor nicht dauernd das Haltemoment 
aufbringen muss. Der Strom kann dann reduziert werden.

Dein Motortreiber wird wahrscheinlich über Impulse angesteuert, die den 
Motor jeweils zu einem Schritt veranlassen. Der Winkel pro Schritt ist 
durch den Aufbau des Motors festgelegt. Wenn es feiner und/oder 
laufruhiger sein soll, verwendet man Mikroschritte. Dabei findet eine 
feinere Unterteilung der Schrittbewegung statt. Der Strom durch die 
Spulen des Motors nähert sich mit zunehmender Feinheit der Unterteilung 
einer Sinus- bzw. Cosinusform.
Ob deine "passende Treiberplatine" das kann, hängt davon ab, was dort 
für ein Treiber drauf sitzt.

von Wolfgang (Gast)


Lesenswert?

p.s.
Kev schrieb:
> Stepper Motor(SPU, 3,5,4,6); // Der Schrittmotor erhält die Bezeichnung
> "Motor" und es wird angegeben

Diese Zeile in deinem Programm deutet allerdings darauf hin, dass sich 
auf deiner Treiberplatine kein Schrittmotortreiber (IC zur Umsetzung von 
Schrittpulsen in Strommuster für den Motor) befindet, sondern als ob die 
Pins direkt den Spulenanschlüssen zugeordnet sind, d.h. der Treiber aus 
ein paar simplen Schaltern besteht.

Vielleicht verrätst du einfach, was für einen Treiber du verwendest.
Wenn das ein simpler ULN<irgendwas> ist, muss die Umsetzung von 
Schrittimpulsen auf die passende Ansteuerung der Spulen in der Software 
gesteuert werden. Dann gibt es auch keine Stromregelung, was für deine 
langsamen Drehungen allerdings sowieso nicht erforderlich ist.

von Kev (kev408)


Lesenswert?

Ich habe eine ULN2003 treiberplatine.

Wenn ich den SPU wert auf 128 setzte dreht der schrittmotor sich schon 
sehr langsam. Aber ich weiß nicht wie langsam.

Ich weiß dass 1528 Schritte 270° entsprechen.
Wenn ich das in einer Stunde zurücklegen will brauche ich 1528/60 = 
25,46 also knapp 25 Schritte in der Minute.

: Bearbeitet durch User
von Schlafloser (Gast)


Lesenswert?

Kann mich etz schon irren,
Vorausgesetzt der Arduino macht nix anderes als den Motor zu bewegen.

1.SPU geteilt durch 60 (2048/60=34,13) the dann sollte er bei 
setSpeed(1) 60 Minuten je Umdrehung brauchen..

Variante 2:
Wenn der Motor 1536 Schritte zu gehen hat...
3600/1536=alle 2,34375 Sekunden ein Schritt (step(1))
Das kannst du theoretisch mit
Delay(2343)
DelayUs(750)
Step(1)

Erreichen.
Ohne timer Interrupt oder mindestens millis() machts aber nicht wirklich 
Sinn...

von Kev (kev408)


Lesenswert?

Der Motor soll sich nur drehen.

von Schlafloser (Gast)


Lesenswert?

Schon klar,
Er wird sich auch drehen. Mit allen Vorschlägen die du bekommen hast. 
Jedoch Bauartbedingt ruckelig.
Darf man mal nach dem Ziel / Verwendungszweck fragen??
Vllt ist ein stepper nicht die richtige Wahl?
Evtl gibt es bessere Treiber die es dank microstepping besser machen.

von Wolfgang (Gast)


Lesenswert?

Kev schrieb:
> Ich weiß dass 1528 Schritte 270° entsprechen.

Mmmh, ich hätte eher erwartet, dass es 1536 Schritte für 270° wären.
Woher hast du deine Zahl?

von nicht in Seattle (Gast)


Lesenswert?

Da es so scheint als will der TO nur eine einfache Lösung und nicht 
lange lernen wie es funktioniert empfehle ich eine andere Treiberplatine 
- nämlich eine die nur ein Takt/Richtungssignal entgegen nimmt und dann 
selber die Muster für den Stepper generiert.

Also quasi das was ich an meiner CNC Fräse benutze, das gibts auch in 
niedlich klein für 3D Drucker. Damit reduziert sich der 
Schwirigkeitsgrad darauf im richtigen Zeitabstand ein pulse() im Arduino 
Code aufzurufen. Wenn man es dann noch übertreiben will und der Treiber 
Microstepping hat (haben die ja nu inzwischen fast alle.

Nimmt man z.B ein DRV8825 und ist fertig. Kost 7€.
https://www.amazon.de/dp/B06Y2FX1VG/?th=1

von J. S. (jojos)


Lesenswert?

Wenn das Motörchen nicht zu schlapp ist, dann kann ich die AccelStepper 
Lib empfehlen. Die hat mehr Funktionen als das Minimalbeispiel der 
Arduino IDE.

von Wolfgang (Gast)


Lesenswert?

J. S. schrieb:
> Wenn das Motörchen nicht zu schlapp ist, dann kann ich die AccelStepper
> Lib empfehlen. Die hat mehr Funktionen als das Minimalbeispiel der
> Arduino IDE.

Welche Funktionen aus der Lib sind denn speziell für die Anwendung des 
TO nutzbringend?

von J. S. (jojos)


Lesenswert?

Alle.

von Maxe (Gast)


Lesenswert?

Kev schrieb:
> Motor.step(1536);

Mach da mal ein Einzelschritt draus und pausiere dazwischen.

for 0 bis 1536{
  Motor.step(1);
  sleep(5000*x);
}

Pseudocode!

von Kev (kev408)


Lesenswert?

Schlafloser schrieb:
> Schon klar,
ich meine damit dass halt nichts anderes passieren soll.

Schlafloser schrieb:
> Darf man mal nach dem Ziel / Verwendungszweck fragen??

Ich möchte daras ein Podest für ein Zeitraffervideo bauen.

Wolfgang schrieb:
> Mmmh, ich hätte eher erwartet, dass es 1536 Schritte für 270° wären.
> Woher hast du deine Zahl?
Ich bin von 2038 Schritten für eine ganze Umdrehung ausgegangen. Wenn 
man 2048 Schritte nimmt passt deine Zahl natürlich besser. Von Prinzip 
her müssen es nicht genau 270° sein.

von Uwe (Gast)


Lesenswert?

Hi,
ich will jetzt nicht unken , aber
dein Schrittmotor > 28BYJ-48
hat aber 4096 Schritte je U.
Du brauchst also für 270° eigentlich 3072 Steps bei Vollschritt.
wo du deine Zahlen her hast.....?
Viel Erfolg, Uwe

von Kev (kev408)


Lesenswert?

Uwe schrieb:
> wo du deine Zahlen her hast.....?

den Wert habe ich hier her:
https://funduino.de/nr-15-schrittmotor

von Uwe (Gast)


Lesenswert?

Hi,
Das finde ich bei Reihelt
> Schrittmotor 28BYJ-48 (Schrittwinkel 5,625 x 1/64)
=0,08789...° ->360°/... =4096
???
Irgendwer schwindelt
viel Erfolg, Uwe

von Kev (kev408)


Lesenswert?

Uwe schrieb:
> Irgendwer schwindelt

Joar. Mit 2048 und dem Code von Funduino bekomme ich eine komplette 
Umdrehung hin.

von Uwe (Gast)


Lesenswert?

Hi,
ist schon lustig
klicke mal unter
https://funduino.de/nr-15-schrittmotor
bei
>Für die Durchführung dieser Anleitung benötigst du:
auf
>Schrittmotor 28BYJ-48 mit ULN2003 Treiberplatine
und dann gehe zur Beschreibung
>Schrittweite: 5.625 * 1/64
macht für 360° 4096 Schritte.
es sei denn dein Programm macht aus 1 Schritt 2
Aber ist eigentlich egal mache du aller xx Zeit einen Step und sei 
glücklich.
Viel Erfolg, Uwe

von J. S. (jojos)


Lesenswert?

Die 5,626 Grad sind pro Halbschritt, macht also 4096 Halb- oder 2048 
Vollschritte für eine Umdrehung.
Ist natürlich blöd sowas für Halbschritte anzugeben.

von Klaus S. (kseege)


Lesenswert?

Kev schrieb:
> Ich weiß jetzt allerdings nicht wie ich die Geschwindigkeit anpassen
> kann. Ich möchte gerne dass der Schrittmotor dafür 1 Stunde braucht.

Bei so langsamen Bewegungen sind typische Libraries für Schrittmotoren 
wohl außerhalb ihres Rechenbereichs und man muß selber rechnen.

Da +-270 Grad Drehwinkel bei dem Motor 3072 Schritten entsprechen, 
müssen die 3072 Schritte auf 3600 Sekunden verteilt werden, also etwas 
mehr als eine Sekunde Wartezeit zwischen 2 Schritten.
Mit  { Step(1); delay(1172) }  und Step(-1); delay(1172) } und zwei 
Schleifen, die diese Befehlsfolgen jeweils 1536mal aufrufen, sollte das 
Problem erschlagen sein.

Gruß Klaus (der soundsovielte)

von J. S. (jojos)


Lesenswert?

https://community.element14.com/members-area/personalblogs/b/blog/posts/arduino-controlling-stepper-motor-28byj-48-with-accelstepper-library

https://www.airspayce.com/mikem/arduino/AccelStepper/

Die Arduino Lib kann keine Halfsteps. AccelStepper unterstützt 'very 
slow speeds'.

Klaus S. schrieb:
> Da +-270 Grad Drehwinkel bei dem Motor 3072 Schritten entsprechen,

3072 Halbschritte, die aber die Arduino Lib nicht kennt.

: Bearbeitet durch User
von Jester (Gast)


Angehängte Dateien:

Lesenswert?

So'n 28BYJ-48 auseinandergerupft zeigt sich das Getriebes wie folgt:

 - Ritzel = 9Z
 - Doppelzahnrad = 32Z / 11Z
 - Doppelzahnrad = 22Z / 9Z
 - Doppelzahnrad = 26Z / 10Z
 - Ausgangsachse = 31Z

und damit eine Untersetzung von 25792 / 405.

Da sind fast 64. Aber halt nicht ganz, sondern rund 5e-3 daneben ...

von Klaus S. (kseege)


Lesenswert?

J. S. schrieb:
> 3072 Halbschritte, die aber die Arduino Lib nicht kennt.

Ich halte mich nur an das, was Kev selbst gemessen hat:
>Joar. Mit 2048 und dem Code von Funduino bekomme ich eine komplette
>Umdrehung hin.

Den Rest können die Theoretiker unter sich ausmachen.

Gruß Klaus (der soundsovielte)

von Wolfgang (Gast)


Lesenswert?

Klaus S. schrieb:
> Ich halte mich nur an das, was Kev selbst gemessen hat:
>>Joar. Mit 2048 und dem Code von Funduino bekomme ich eine komplette
>>Umdrehung hin.
>
> Den Rest können die Theoretiker unter sich ausmachen.

Oder vielleicht doch 6112 Schritte für drei Umdrehungen?

Kev schrieb:
> Ich weiß dass 1528 Schritte 270° entsprechen.

von Klaus S. (kseege)


Lesenswert?

Wolfgang schrieb:
> Oder vielleicht doch 6112 Schritte für drei Umdrehungen?
>
> Kev schrieb:
>> Ich weiß dass 1528 Schritte 270° entsprechen.

"Wissen" altert! Nur ein paar Postings weiter war Kev schon schlauer.

Und für eine Zeitrafferaufnahme kommt es sicherlich nicht auf die 
letzten (1536-1528)*100/1536=0,5208periode3 % Fehler an. Obwohl man 
natürlich auch darüber diskutieren könnte ;-)

Gruß Klaus (der soundsovielte)

von Wolfgang (Gast)


Lesenswert?

Klaus S. schrieb:
> "Wissen" altert! Nur ein paar Postings weiter war Kev schon schlauer.

Inzwischen wissen wir ja auch, dass es sich um einen Schrittmotor mit 
Getriebe handelt und nicht um eine Softwareuntersetzung im Treiber.
Langsam fügen sich die Dinge ;-)

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.