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.
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.
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.
"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" ...
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).
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.
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.
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.
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...
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.
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?
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
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.
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?
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!
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.
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
Hi,
Das finde ich bei Reihelt
> Schrittmotor 28BYJ-48 (Schrittwinkel 5,625 x 1/64)
=0,08789...° ->360°/... =4096
???
Irgendwer schwindelt
viel Erfolg, Uwe
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
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.
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)
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 ...
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)
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.
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)
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 ;-)