Frage Nachführung mit Steppermotor und Arduino

  • Ersteller des Themas Ersteller des Themas VisuSCor
  • Erstellungsdatum Erstellungsdatum
Status
Es sind keine weiteren Antworten möglich.

VisuSCor

Aktives Mitglied
Guten Morgen,

ich versuche gerade einen Motorantrieb für meine selbst gebabaute Gabelmontierung hinzubekommen. Wer sie noch nicht gesehen hat, so sieht das Ding aus:

Wedge3 DSC03496kl.jpg


Dazu habe ich mir erstmal ein paar Sachen zusammengekauft, von denen ich annehme, dass sich daraus was passendes bauen lässt:

motorarduino_klein.jpg


Im Dschungel gab es einen Kit mit einem Atmega 328 Board plus Shield und Motorkontroller, das eigentlich für die Entwicklung einer CNC-Maschine gedacht ist. Damit, so dachte ich, kann ich mir die Verkabelung etwas einfacher machen und dem Board dürfte es ja egal sein wieviele Motoren ich darüber ansteuere.

Ich muss dazu sagen, dass ich von Arduino & Co. und auch von Schrittmotoren keine Ahnung habe. Zum Glück habe ich im Netz ein Video und eine dazu gehörende Website gefunden, wo genau diese Komponenten für eine Motorsteuerung benutzt und erklärt werden: Arduino CNC Shield V3 and A4988 Hybrid Stepper Motor Driver, CNC Shield pinout, wiring, code, DIY

Damit habe ich die Anordnung spontan zum Laufen gebracht. So weit so gut.

Folgendes habe ich vor:
  • ich möchte die Montierung über 2 Motoren mit einem Joystick bewegen können, um Objekte manuell anzufahren
  • ich möchte den Motor der RA-Achse permanent auf Nachführgeschwindigkeit laufen lassen.
Ersteres dürfte kein Problem sein, denn die Verwendung des Joysticks ist in dem Video beschrieben. Vorab habe ich aber erstmal das erste Skript aus dem Video benutzt und so verändert, dass der Motor permanent läuft und ich die Geschwindigkeit über Delays steuern kann:

// Stepper Motor X
const int stepPin = 2; //X.STEP
const int dirPin = 5; // X.DIR

int SMSpeed = 1500; // Stepper Motor Speed
int x = 0;

void setup() {
// Sets the two pins as Outputs
pinMode(stepPin,OUTPUT);
pinMode(dirPin,OUTPUT);
}
void loop() {
digitalWrite(dirPin,HIGH);
x = x + 1;
digitalWrite(stepPin,HIGH);
delayMicroseconds(SMSpeed);
digitalWrite(stepPin,LOW);
delayMicroseconds(SMSpeed);
}


Nun habe ich das Problem, dass ich den Motor damit nicht langsam genug bekomme. Das Delay darf nicht größer sein als ca 16.000, danach wird der Motor wieder schneller. Bei der so geringsten Geschwindigkeit dauert es 4 Minuten, bis das linke Zahnriemenrad eine Umdrehung gemacht hat (Übersetzung 2:1). Das ist etwa 320 mal so schnell wie es für eine Nachführung erforderlich wäre.

Kann mir jemand einen Tipp geben, wie ich den Motor langsamer bekomme? Gehen müsste das ja elektronisch, sonst könnten GEM & Co. ja auch nicht über Schrittmotoren angetrieben werden.

Danke und einen schönen Sonntag!

CS.Oli
 
Zusatzangaben: der Motor wird mit 12 V versorgt und ist auf 1/16 Steps eingestellt.

CS.Oli
 
Hallo Wolfgang

danke für den Tipp! Stimmt jetzt läuft der Motor langsamer, aber wenn ich bei Delay den Wert 100 setze, dann läuft der Motor zwar deutlich langsamer, aber er machts lustige Geräusche und läuft auch sehr unruhig, mehr wie ein Traktor...

CS.Oli

P.S.: bin jetzt erstmal unterwegs für den Rest des Tages...
 
Hallo Oli,

ändere mal nur den zweiten Eintrag auf delay(). Der erste bestimmt die Pulslänge für den Steppuls. Der darf vielleicht nicht zu lang werden.
Also vielleicht so:
digitalWrite(stepPin,HIGH);
delayMicroseconds(1500); hier einen festen Wert
digitalWrite(stepPin,LOW);
delay(SMSpeed);

Gruß
Wolfgang
 
Hallo Oli,

verschiebe mal die dirPin ins Setup. Das brauchst du nicht jedes mal zu setzen. Das kann auch zu Verzögerungen führen.

Dann wie Wolfgan schon geschrieben hat. Die Pulsweite darf nicht zu lang oder zu kurz sein. Die ist im Treiber Datasheet dokumentiert...

Wenn du dann später deinen Stepper schneller laufen lassen willst, dann darfst du nicht von 0 auf 100 gehen, sonst gehen Schritte verloren oder es geht gar nicht mehr weiter. Hier musst du den Motor beschleunigen.

Hast du auch den Wiederstand am Treiber richtig eingestellt?

Gruß,
Martin.
 
Hallo Martin und Wolfgang,

danke für die Tipps.

Das mit den unzerschiedlichen Delays habe ich mir auch schon überlegt und das mit dem Beschleinigen zumindest geahnt.

Was ist mit dem Widerstnd gemeint? Die Nennspannung? Dazu fehlen mir leider die Angaben im Datenblatt des Motors. Und wie man die berechnen könnte ist mir nicht klar...

CS.Oli
 
Mit einem Drehpoti und Multimeter kannst du den Max Strom des Treibers einstellen (A4988), den der Stepper abkriegen darf. Normal betreibt man einen Motor bei max 80%, sonst läuft er heiß. Bei deinen 2A Motor wären das 1.6A. Wobei der Motor dreht so langsam, dass mehr gehen sollte. Man muss halt gucken wie heiß der Treiber und Motor werden, wenn es überhaupt notwendig ist so hoch zu gehen.
Der A4988 Treiber war ziemlich lange bei 3dDruckern beliebt, deswegen sind die so günstig und man findet viele Infos dazu. Mittlerweile benutzt man TMC Treiber. Die interpolieren die Einzelschritte in 256 Zwischenschritte, damit laufen sie ruhig und leise.

Gruß,
Martin.
 
Hallo Martin,

danke für den Tipp mit den TMC Treibern! Mir war natürlich nicht klar, dass die Stepper-Motoren mit dem A4988 Treiber so unruhig und mit so viel Geräusch laufen. Ich dachte schon das liegt an dem Script...

Hier kann man den Unterschied zum TMC2208 eindrücklich sehen:

Ich werde mir entsprechend zwei Treiber dieser Sorte besorgen. Die passen zum Glück auf den gleichen Sockel.

CS.Oli
 
So... einen Teil des Problems habe ich wohl gelöst. Ob das wirklich gut ist, weiß ich noch nicht. Aber immerhin habe ich die Steuerung nun soweit, dass der Motor bzw. die entscheidende Welle ca 1 x in 24 h eine volle Umdrehung macht. Also eine potentielle Nachführung. Dazu habe ich das Originalscript etwas anders abgewandelt:

// Stepper Motor X
const int stepPin = 2; //X.STEP
const int dirPin = 5; // X.DIR

void setup() {
// Sets the two pins as Outputs
pinMode(stepPin,OUTPUT);
pinMode(dirPin,OUTPUT);
}
void loop() {
digitalWrite(dirPin,HIGH); // Enables the motor to move in a particular direction
// Makes 1 pulse
for(int x = 0; x < 1; x++) {
digitalWrite(stepPin,HIGH);
delayMicroseconds(10);
digitalWrite(stepPin,LOW);
delayMicroseconds(10);
}
delay(13500); // 13.5 s delay
}


Der Motor macht damit alle 13,5 s einen Schritt bzw. mit der gewählten Einstellung einen 1/16 Schritt. Ausgerechnet habe ich das mit der Stoppuhr. Mit dem urspünglichen Delay von 10 mS hat meine Welle 64 Sekunden gebraucht, um eine Umdrehung zu machen. Damit kann man ausrechnen wie man das Delay am Schluss ändern muss, damit 1 Umdrehung in 24 h rauskommt. Ich werde mir noch eine Uhr an den Versuchsaufbau malen, um das in etwa nachprüfen zu können. Das Feintuning erfolgt dann draussen am Himmel. Da sieht man ja relativ schnell, ob die Objekte aus dem FOV laufen oder nicht.

Problem ist noch, dass die Steps recht 'hart' sind. Das heißt, der Motor ruckt alle 13 s ein Stück weiter. Ob das so hart ist, dass praktisch alles verwackelt wird, kann ich nicht einschätzen. Ich werde es probieren und hoffe auch auf den TMC 2208 Treiber, der ja um das 16fache feinere Steps ausführt, die dann kaum noch zu spüren sein sollten.

Aber zum Testen reicht mir das schonmal.

Jetzt kommt noch der Teil mit dem Joystick dazu und wenn ich die Optik etwas besser im Griff habe, dann gibt es einen Feldversuch. Wenn das Wetter mal mitspielt.

CS.Oli
 
Zuletzt bearbeitet:
Hallo Oli,

Für die ersten Schritte sind die Treiber erstmal gut. Die kann man später noch immer ersetzen und je nach Anforderung wählen... Es gibt auch Stepper, die mit 0.9° Schritten laufen. Da gibt's ja mehrere Versionen von den tmcs, die auch noch größere Motoren antreiben können.
Die Untersetzung von 1:2 ist ganz schön knapp wie du festgestellt hast. Visuell ist das noch OK, wenn nichts schwingt. Noch immer besser als Manuel nachzuführen finde ich. Fotographisch wird das aber nix.
Hier gibt es eine Faustformel, die ich nicht mehr im Kopf habe. Für eine flüssige Bewegung brauchst du viel mehr Schritte pro Sekunde.

Die Drehzahl kann man berechnen...

Pro Umdrehung hast du 200 Schritte * 16 Micro Steps * 2 Untersetzung

Macht grob 86400 / 6400 = 13.5 Sekunden

Gruß,
Martin
 
Hallo Martin,

danke für die Berechnung, da lag ich ja dann wohl richtig mit meiner Stoppuhr. Allerdings kommt im Experiment was anderes raus, denn nach 45 Minuten sah es so aus:

timer 45 min.jpg


Ich hab das Delay jetzt mal auf 6000 gestellt und werde sehen was passiert...

CS.Oli
 
Stimmt das nicht? Für mich sieht das nach etwas weniger als 1/24 Umdrehung aus, wenn es oben los ging.

Kleine Abweichungen können entstehen, da
die Controller ihren CPU Taktgeber als Uhr benutzen. Diese unterliegen Schwankungen je nach Temperatur. Sind nicht besonders genau...
Hier gibt es zum Bsp. Externe Module wie den ds3231 mit einen Quarz und Temperatursensor. Visuell aber nicht relevant...
 
o_O:ROFLMAO::sneaky:

Au Mann! Böser Lapsus, wenn man ein 12-Stunden-Ziffernblatt nimmt, um 24 h zu messen.

DANKE für die Auflösung. (Ich lach mich kaputt...)

CS.Oli
 
Die Kollegen bei CN meinen, dass man für den Antrieb von Montierungen Motoren mit Planetengetrieben oder Schneckengetriebe mit Übersetzungen von 1 : 100 oder 1: 150 benutzt.

Weiß jemand wo man so etwas herbekommt? Bei 'A' gibt es nur ein Modell, das aber recht viel Spiel haben soll. Und eines, das dann gleich 1,7 kg wiegt...

CS.Oli
 
Hallo,
ich habe mir auch schon eine Nachführung auf Arduino Basis gebaut. Was ich sagen kann ist folgendes: Das wird mit dem Schrittmotor und der Untersetzung nix. Auch alle 13,xxxx Sekunden ein Schritt bringt nix, da ja in der Wartezeit die Sterne trotzdem verziehen.

Ich habe bei meiner zwei Untersetzungsgetriebe mit 73:1 verbaut. Ergibt in der Summe eine Untersezung von 5329 : 1!!!!!
Der von mir verbaute Schrittmotor durfte da mit maximal 3,7 1/min drehen. Was mittels Leadshine Motortreiber nicht das Problem war.
Das große Problem war die Taktgenauigkeit des Arduinos. In der warmen Wohnung lief er besser wie draussen in der Kälte. Auch ein Arduino Mega 2560 verhielt sich anders als ein Nano. Man sieht schon, gar nicht so einfach. Aber auch hierfür gab es eine Lösung. Mittels Uhrmodul DS3231 welches einen sehr genauen Takt ausgeben kann. Das ganze ist auch noch Temperaturkompensiert. Dann mit dem Timer des Arduinos einfach hochzählen und immer zum richtigen Zeitpunkt einen puls ausgeben.
Das ganze klappte richtig gut, aber die Drehzahl war sehr mühsam richtig zu einstellen. Auch die Komponenten wurden recht warm, Motor und Treiber vor allem.

Dann habe ich weiter überlegt und gelesen und geredet und zum Entschluß gekommen dass ein normaler DC Motor besser ist. Davon einen mit nochmaliger Untersetzung von 650: 1 anstatt dem Schrittmotor angeflanscht. ergibt eine Untersetzung von 3.463.850 : 1!!!!

Somit kann der kleine DC Motor mit knapp 2700 Umdrehungen arbeiten und es lässt sich per PWM Signal und einem Poti ganz fein und easy justieren.

So, nun genug der Worte.
ich hoffe ich konnte was dazu beitragen.

Gruß Nic
 
Hallo Nic,

Das mit dem DC Motor hatte ich mir auch Mal vor Jahren überlegt, allerdings habe ich keinen bezahlbaren Motor mit der entsprechenden Untersetzung gefunden. Deswegen am Ende eine Eq5 gekauft und eine Nachführung hierfür gebastelt.
Für einen kleinen Startracket fände ich das aber noch immer nicht uninteressant.
Welchen Motor hast du hier benutzt?

Wegen den Ungenauigkeiten kann man phd2 anbinden. Das ist nicht wirklich kompliziert.
Habe hierfür das alte lx200 Protokoll genommen. Es reicht eine Handvoll Befehle...

Gruß,
Martin
 
Hallo. Hier noch die Bezeichnung des Motors.

25mm DC 12V 25GA-370​

Kostet grad im großen online Versandhandel knapp 10€. Ich habe noch vor einen ausführlichen Baubericht zu erstellen. Da kommen dann auch alle relevanten Dinge mit rein.
 
Status
Es sind keine weiteren Antworten möglich.
Zurück
Oben