PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Problem mit Servos



portege_moi
26.09.2009, 21:01
Hallo!

Bin zwar schon länger im Forum angemeldet, kam aber noch nie zum schreiben...

Und mein erster Post ist natürlich aufgrund eines für mich nicht lösbaren problems...

Die Vorgeschichte:

Ich habe mir bei Conrad 7 servos bestellt, um einen kleinen roboterarm (oder greifer?) zu bauen.

Hier mal ein paar Bilder für den Überblick:
(das lezte Gelenk + Greifer sind nicht montiert, habs abgenommen um herumzuprobieren...)

http://www.pictureupload.de/originals/pictures/260909214654_IMG_0273.JPG
http://www.pictureupload.de/originals/pictures/260909215009_IMG_0274.JPG
http://www.pictureupload.de/originals/pictures/260909215207_IMG_0275.JPG
http://www.pictureupload.de/originals/pictures/260909215303_IMG_0276.JPG
http://www.pictureupload.de/originals/pictures/260909215418_IMG_0277.JPG

Soweit, sogut, mein Problem ist nun folgendes:

da die servos bei jedem gelenk gegenüber voneinander liegen, muss ichs sie ja auch genau gegengleich ansteuern...

das funktioniert aber nur bei zb.: 2 Servos (servo1, servo2)

Servo 1 = 0 Grad
Servo 2 = 180 Grad

->

Servo 1 = 180 Grad
Servo 2 = 0 Grad


Dann bewegen sie sich vom einen Anschlagpunkt zum anderen Anschlagpunkt.

Wenn ich aber zum Beispiel 70 Grad bei einen Servo will, muss ich den anderen (rein theoretisch) auf 110 Grad stellen lassen.

Nur funktioniert das überhaupt nicht. Die Servos bewegen sich nicht nebeneinander sondern einer der beiden ist dann immer etwas versetzt... so ca. 10 Grad.

Was tun?

Hat jemanden einen Tipp? Toll wäre es, wenn ich das ganze mit einer Formel lösen könnte...

Oder geht das so einfach nicht? Vielleicht bin ich ja völlig auf dem Holzweg...
Im WWW finde ich einfach nichts dazu....

Hilfe :)

radbruch
26.09.2009, 21:30
Hallo

Ich befürchte, was jetzt kommt wird dir nicht gefallen: Der Drehbereich (speziell der billigen RS2-3€-Servos) ist nicht linear, die selbe Impulsänderung verursacht je nach Anschlagseite unterschiedliche Winkeländerungen.

Plan A wäre dieses Verhalten über eine Umrechnungstabelle für jedes Servo zu kompensieren. In den Tabellen kannst du dann auch gleich die seitenverkehrten Impulslängen reinrechnen. Also einen Wert für ein Servo ausgeben und den Wert für das Andere solange ändern bis es passt. Dann beide Werte notieren. Je nach geplanter Schrittweite ergibt das mehr oder weniger umfangreiche Tabellen. Beachten mußt du noch, dass die Servos im kaltem Zustand anders drehen als im erwärmten Zustand, sie sollten also warmgelaufen sein bevor du die Werte ermittelst.

Plan B halte ich für langfristig sinnvoller: Baue dir linke und rechte Servos indem du jeweils bei einem der Pärchen den Motor und das Poti umpolst. Das Umpolen ist bei diesen Servos recht einfach, erfordert aber Lötkenntnisse und etwas mechanisches Geschick. Dafür kannst du dann beide Servos mit dem selben Signal versorgen. Ob sie dann allerdings wirklich syncron laufen habe ich noch nicht getestet, kann ich aber nachholen. Vermutlich wird sich der Restfehler letztlich durch die mechanische Verbindung aufheben. Bilder vom geöffneten Servo mit mehr Details zum Umbau kann ich dir nachliefern, falls du diesen Weg gehen willst.

Gruß

mic

portege_moi
26.09.2009, 21:40
okay, mal vielen dank für die aufklärung... genau so etwas habe ich befürchtet...

da mein Arm ja noch nicht ganz fertig aufgebaut ist werde ich mich eher für variante B eintscheiden...

auch davon habe ich bereits im netz gelesen, allerdings war ich etwas gehemmt, an meinen servos herumzulöten...

Lötkenntnisse habe ich eigentlich ziemlich gute, also würde mir nur noch eine kleine anleitung mit bebilderung fehlen :)
Wäre toll wenn du mir etwas dazu geben könntest :)

Und wie sicher funktioniert das ganze dann? Oder funktioniert der Servo nach dem Umbau dann einfach nur genau Verkehrt rum?

Danke für die rasche Antwort :)

radbruch
26.09.2009, 23:00
Hallo

Ich baue morgen mal eins um und mache ein paar Bilder. Das umgebaute Servo läuft dann spiegelverkehrt zum Orginal.

Das Poti ist neben dem Anschlußkabel angelötet, nach dem Ablöten kann man den Motor an der Platine rausziehen. Zuvor aber unbedingt das Getriebe komplett wegbauen, auch das erste große Zahnrad direkt am Motor (Achse rausziehen wenn sie nicht im Deckel steckt) Das Ritzel auf der Motorwelle ist vorne dicker als hinten und könnte sonst beim Rausziehen des Motors das große Zahnrad beschädigen. Dann denn Motor aus der Platine auslöten (zuvor Einbaulage/Anschlüsse markieren!), alle fünf Lötstellen zinnfrei machen und den Motor verpolt wieder einlöten. Die äußeren zwei Drähte des Potis isolieren, überkreuzen und so hinbiegen dass die Lötaugen der Platine genau draufpassen (Mitteldraht als Zielhilfe beim Ausrichten der Drähtchen). Poti einlöten, dann alles wieder zusammenbauen und fertig:)

Gruß

mic

portege_moi
26.09.2009, 23:19
okay, danke... vielen dank :)

das poti gehört also auch umgepolt?

Ceos
27.09.2009, 09:49
wenn man nur den motor umpolt, würde er in die, für die regelstrecke, entgegengesetzte richtung drehen und mit sicherheit das getriebe zerlegen, darum dreht man motor UND poti um, damit die vorzeichen wieder stimmen

portege_moi
27.09.2009, 11:45
also, gehört das poti völlig umgedreht, also ausgebaut und wieder verkehrtrum eingebaut, oder reicht es die beiden äußeren kontakte umzupolen?

021aet04
27.09.2009, 11:48
Die beiden äuseren Anschlüsse musst du umpolen. Wie willst du das Poti umdrehen? :-k :-k

portege_moi
27.09.2009, 12:07
genau das hab ich mich ja auch gefragt :P

aber sicherheitshalber nachfragen schadet nie :)

radbruch
27.09.2009, 13:12
Hallo

Ein Bild sagt mehr als tausend Worte:
http://radbruch.bplaced.net/servoumbau/servo-umbau1_klein.jpg (http://radbruch.bplaced.net/servoumbau/servo-umbau1.jpg) http://radbruch.bplaced.net/servoumbau/servo-umbau2_klein.jpg (http://radbruch.bplaced.net/servoumbau/servo-umbau2.jpg) http://radbruch.bplaced.net/servoumbau/servo-umbau4_klein.jpg (http://radbruch.bplaced.net/servoumbau/servo-umbau4.jpg)

Die Videos dazu:
http://i2.ytimg.com/vi/uL_am_61jfU/default.jpg (http://www.youtube.com/watch?v=uL_am_61jfU) http://i4.ytimg.com/vi/KLWulyIWCak/default.jpg (http://www.youtube.com/watch?v=KLWulyIWCak) http://i2.ytimg.com/vi/IAP3Z-bAb-g/1.jpg (http://www.youtube.com/watch?v=IAP3Z-bAb-g)
http://www.youtube.com/watch?v=uL_am_61jfU
http://www.youtube.com/watch?v=KLWulyIWCak
http://www.youtube.com/watch?v=IAP3Z-bAb-g

Die Drähte der Potis sind leider zu kurz und müssen verlängert werden. Viel Spass beim Nachbau.

Beide Servos erhalten das selbe Signal und können deshalb auch parallel angeschlossen werden:

#include <avr/io.h> // I/O Port definitions
#include <avr/interrupt.h> // Interrupt macros

uint8_t i, x, y, z;
volatile uint8_t p;

void init(void)
{
TCCR0 = (0 << WGM00) | (1 << WGM01); // CTC-Mode
TCCR0 |= (0 << COM00) | (0 << COM01); // ohne OCR-Pin
TCCR0 |= (0 << CS02) | (0 << CS01) | (1 << CS00); // kein prescaler
TIMSK = (1 << OCIE0); // Interrupt ein
OCR0 = 79; // 100kHz

DDRA |= 16; // E_INT1 als Ausgang
DDRC |= 3; // SCL und SDA als Ausgang

sei();
}
void pause(uint8_t dauer)
{
p=dauer;
while(p);
}
int main(void)
{
x=y=z=140;
init();
pause(200);

while(1)
{
x=y=z=60;
pause(100);
x=y=z=220;
pause(100);
}
return(0);
}
ISR(TIMER0_COMP_vect)
{
static uint16_t count;
if(count>x) PORTA &= ~16; // E_INT1 (Pin8)
else PORTA |= 16;
if(count>y) PORTC &= ~1; // SCL (Pin10)
else PORTC |= 1;
if(count>z) PORTC &= ~2; // SDA (Pin12)
else PORTC |= 2;
if(count<2000)count++;
else { count=0; if(p) p--; }
};
(Für einen 8MHz-Mega32)

Gruß

mic

[Edit]
26.03.2016: Bilder neu verlinkt

portege_moi
27.09.2009, 13:16
super , danke!

werd mich gleich mal dransetzen...^^

wenn was dabei rauskommt werd ichs posten.

danke ^^