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.
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" ...
"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).
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.
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.
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.
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.
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.
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?
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
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.
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.
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 ;-)
"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 ;-)