Go Down

Topic: (Motor)Positionen erlernen (Read 956 times) previous topic - next topic

flomei

Hallo!
Ist wieder mal eine etwas allgemeinere Frage, tut mir Leid.

Wie wird das gemacht, dass Motoren die Positionen die sie anfahren sollen, "lernen".

Wenn mich nicht alles täuscht, dann wird das bei manchen Robotern gemacht. Die werden in den "Lernmodus" versetzt, dann bewegt jemand den Arm zu den entsprechenden Positionen und dabei "lernt" der Controller wie er zur Endposition fahren soll.

Ist so etwas aufwändig zu realisieren oder geht das sogar mit den Bordmitteln eines Arduino bzw. eines Servomotors?

Besten Dank und Gruß!
Beste Grüße
Florian

http://www.flomei.de

uwefed

#1
May 02, 2011, 04:44 pm Last Edit: May 02, 2011, 04:46 pm by uwefed Reason: 1
Du speicherst für jede Position in einer Variablen oder im EEprom einen Referenzwert.
Beispiel (Zahlen sind zufällig und für einen Servo über PWM gesteuert)
Motor1: 0 Grad = PWM 23
Motor1: 180Grad = PWM 230
Motor2: 0 Grad = PWM 18
Motor2: 180Grad = PWM 199

Daraus kannst Du dan für jeden Winkel die Ansteuerung ausrechnen, unabhängig von den Tolleranzen und Ungenauigkeit der Mechanik und Elektronik.

Oder Du machst eine Tabelle mit den Ansteuerungswerten für jede der Positionen die der Motor einnimmt.
Motor1 Position1 = PWM 40
Motor1 Position2 = PWM 67
Motor1 Position3 = PWM 123
Motor1 Position4 = PWM 160
Motor1 Position5 = PWM 200
ecc

Das gleiche gilt für Schrittmotore oder Gleichstrommotore mit Encoder; da arbeitest Du halt mit Schritten.
Grüße Uwe
   

sth77

#2
May 02, 2011, 04:56 pm Last Edit: May 02, 2011, 04:58 pm by sth77 Reason: 1
Um es ganz allgemein zu halten: Man definiert für jedes Stellglied, egal ob Motor, Schrittmotor oder Servo, eine Grundposition. Eine Endposition soll programmiert werden, folglich muss irgendwo reproduzierbar abgelegt werden, wo sich diese Position befindet und wie sie agefahren werden muss.
Für einen Servo ist das recht trivial, dem übermittelt man ja direkt die Anfahrposition. Bei Schrittmotoren definiert man im einfachsten Fall eine bestimmte Anzahl von Schritten. Hierbei muss man natürlich beachten, dass bei hohen Schrittverluste auftreten können, die es durch geeignete Maßnahmen auszuschalten gilt. Das könnte man wie bei "normalen" Elektromotoren machen, indem man die Umdrehungen der Motor- bzw. einer Getriebeachse misst. Das geht beispielsweise kontaktlos mit Lichtschranken oder Hallsensoren.
Um diese "Lernphase" zu programmieren, die anzufahrende Position also unabhängig von einer neuen Programmierung zu machen, müssen im Quelltext zwei Modi erstellt werden: ein normaler Betriebsmodus und ein Lernmodus. Wird dieser ausgeführt, muss die abstrakte Positionsvariable (Anzahl Schritte, Winkel beim Servo etc.) in einem nichtflüchtigen Speicher abgelegt werden. Hier bietet sich das interne oder ein externes EEPROM an. Auch kann man hier ablegen, wie diese Position angefahren werden soll, beispielsweise mit Zeitangaben oder über Rampen.
Bei mehreren zeitgleichen Bewegungen wird das ganze natürlich ungleich komplexer.
Mein Arduino-Blog: http://www.sth77.de/ - letzte Einträge: Teensy 3.0 - Teensyduino unter Window 7 - Teensyduino unter Windows 8

big-maec

Hi,

wenn das ganze Professionell gemacht werden soll kann ich nur eine Lösung mit einem INKREMENTALGEBER empfehlen. Zur Erläuterung habe ich diesen Link gefunden. http://www.cncplayer.com/forum/quadratur-inkremental-encoder-mit-firmware-im-arduino-t7.html
Gruesse
big-maec

Gurkengraeber

.. und den Inkrementalgeber mit dem Motor koppeln. ( Input benötigt Output = 2 Werte  -> die wiederum verarbeitet werden müssen )

Man könnte aber auch Schrittmotoren ( wie in Disketten-Laufwerken ) dazu nötigen, eine bestimmte Umdrehung zu machen. ( Input sagt, was Output zu machen hat = 1 Wert )
Und der Geber weiß, wo der Motor steht.

MfG

Go Up