PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Greifarmsteuerung



Transformer
19.06.2014, 19:05
Servus

Habe den RP6 mit einem Greifarm erweitert. Zusätzlich habe ich das W-LAN-Modul M256 (Master), das über I2C mit dem Servoboard SD21 verbunden ist.

Den Greifarm hab ich soweit über I2C des Servoboards angesteuert.





#define SD21_Servoboard_I2C_ADR 0xC2


void I2C_SD21(uint8_t servo, uint8_t servo_speed, uint16_t servo_position)

{
uint8_t transmitBuf[4];
transmitBuf[0] = (servo -1)*3; // Register 0-2 = Servo1, 3-5 = Servo2, ...
transmitBuf[1] = servo_speed; // Geschwindigkeit 0...255
transmitBuf[2] = (servo_position & 0xff); // Low Byte Position
transmitBuf[3] = ((servo_position >> 8) & 0xff); // High Byte Position

I2CTWI_transmitBytes(SD21_Servoboard_I2C_ADR,&transmitBuf[0],4);
}

// STOP Servo

void I2C_SD21_STOP(uint8_t servo, uint8_t servo_speed)

{
I2CTWI_transmit2Bytes(SD21_Servoboard_I2C_ADR,1,0) ;
}

Meine frage ist, wie ich einen Servo anhalten (Stoppen) kann. Habe bei der Funktion I2C_SD21_STOP,

den servo 1 anhalten wollen, indem ich die servo_speed auf 0 setze. Klappt aber nicht wie ich es will.

Ich möchte gerne das der Servo während er verfährt, nach einem bestimmten Eingabebefehl stoppt und

auf der Position bleibt, wo er sich gerade befindet.

Wenn Ihr noch Informationen braucht fragt mich.

Gruß

Filou89
20.06.2014, 07:37
Hallo Transformer,
ich kenne das Board nicht. So wie ich das aus der Doku zum SD21-Print (http://www.shop.robotikhardware.de/shop/catalog/product_info.php?products_id=198) entnehme, kannst du nur die geschriebenen Register auslesen. Die aktuelle Position auszulesen scheint nicht zu funktionieren. Da bleibt dir wohl nichts anderes übrig, als die Ziel-Position anzupassen. Eventuell musst du auf der M256 dazu mitrechnen, wie die aktuelle Position ist.
Hoffe, das nützt dir was.

Gruss
Filou

[Edit]
Dank dem Hinweis von Rabenauge ergänze ich:
Mit aktuelle Position auslesen, wollte ich sagen, der Aktuelle Wert des PWM-Signals (also die Soll-Position) übernehmen und als Zielposition einsetzen. Bei schnellen Geschwindigkeiten ist aber nicht sichergestellt, dass der Servo der Soll-Position folgen kann. Ein Poti, das ein Feedback liefert, wäre wohl die einfachste Variante.

Rabenauge
20.06.2014, 15:09
Aktuelle Servopositionen kann man, ohne Umbau, nie auslesen.
Modellbauservos haben keinerlei Feedback.
Wenn du jetzt dem Servo eine Sollposition übergibst, wird es versuchen, diese anzufahren und auch zu halten.
Da Software schneller ist als Hardware, wird ein einfacher Stopp-Befehl nicht funktionieren, da der Rechner gar nicht weiss, wo das Servo sich aktuell befindet.
Das kann man nur umgehen (ohne das Servo umzubauen), indem man es Stück für Stück verstellt und zwischen den Schritten immer wieder nachguckt, ob der Stopp-Befehl auftaucht.

Transformer
02.07.2014, 14:27
Danke erstmal für eure Hilfe. Habe die Servos so angesteuert, dass diese verschiedene Positionen anfahren.

Doch leider habe ich jetzt gemerkt dass manche Servos ruckeln, wenn Sie eine bestimmte Position anfahren und diese halten. ( Da wackelt der ganze Arm :-( )

Was kann man da machen , sodass die Servos nicht mehr Ruckeln? Habe im Programm ausprobiert die Servogeschwindigkeit zu erhöhen/reduzieren, verschiedene

Positionen anzufahren, doch leider bleibt das Ruckeln.

Infos:

ModellbauServos(Bluebird Standard-Servo BMS-620 DMG;Bluebird (BMS-396V) Mini-Servo BMS-396V) an Servoboard SD21(6V Versorgungsspannung) angeschlossen

Gruß

RolfD
02.07.2014, 20:29
Das Ruckeln der Servos kann verschiedenen Gründe haben.
Letztlich befindet sich im Servo ein Regelkreis der Soll und Ist Wert an Hand eines Potis vergleicht. Ist das Poti oxydiert - wie man es manchmal von hifi-Anlagen kennt - kann es zu "kratzen" und damit zu Fehlstellungen und Geruckel kommen. Es kann aber auch sein, das der Arm für die Servos nicht gebaut bzw. zu schwer sind und er schlicht und einfach seine Regekurve nicht einhalten kann... und je nach dem was für Regelglieder dort arbeiten, wirken sich Fehlstellungen z.B. dann in Ruckeln aus. Servos sind eigentlich für Kräfte ausgelegt, wie die Steuerung einer Flugklappe/Ruder... nicht um zig bis hunderte Gramm zu heben/bewegen.
Es mag noch mehr Gründe geben.. incl. fehlerhafter Ansteuerung im Timing aber grundsätzlich fehlen mal wieder ein Haufen Angaben zum Problem in deiner Frage damit man das zumindest eingrenzen könnte.

Machen denn die Servos das auch ohne das Gewicht also wenn sie unverbaut sind? Wenn nein, weisst du zumindest das mit dem Gewicht zuzsammenhängt. Wenn doch... versuchs mal mit Kontaktspray am Poti... oder kauf dir gleich vernünftige Servos die für Last ausgelegt bzw. entsprechende Drehmomente ausgelegt sind. Und ich hoffe deine Spannungsversorgung leistet den nötigen Anlaufstrom für alle Servos... auch was, was man wieder nicht weiss.
Gruß