Arduino Schrittmotor

OP #7335640
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
}
Gast #7335657
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.

Gast #7335678
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).

Gast #7335683
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.

Gast #7335696
Lesenswert?

p.s. Kev schrieb im Beitrag #7335640:

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.

OP #7335702
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.

Gast #7335710
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...

Gast #7335715
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.

Gast #7335721
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

OP #7335792
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.

Gast #7335797
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

Gast #7336174
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

#7336226
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)

#7336248
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.

Gast #7336398
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 ...

Angehängte Dateien:
#7337302
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)

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren