PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Bascom Servos "Beschleunigung"



Lenox
05.11.2006, 12:03
Hey Leute,
da ich gerade ein Roboterarm mit Servos baue hab ich folgendes Problem.
Ich möchte das der Servo nicht mit voller Geschwindigkeit sich von Pos. A nach Pos. B bewegt.
Er sollte am Anfang beschleunigen und kurz vor erreichen der Position langsamer werden, geht das?
Zurzeit steuer ich ihn so an (ATMega16):


'Config Servo
Config Servos = 1 , Servo1 = Portb.3 , Reload = 7


'Config Servopin on AVR
Config Portb.3 = Output

'Enables Interrupts
Enable Interrupts

Do

Servo(1) = 50
Wait 1

Servo(1) = 145
Wait 1

Servo(1) = 240
Wait 1

Loop
End

Und überhaupt, wie realisiere ich am besten eine Roboterarmsteuerung für 7 Servos?

Mfg
Stefan

coCo
05.11.2006, 15:58
Hi,
ich hab mal ne Frage. Für was steht denn das Reload=7. Was macht das?

Und als Servosteuerung werde ich das hier verwenden:
http://www.kreatives-chaos.com/artikel/rs232-servocontroller-s8io

Ich krieg morgen einen Tiny2313 und werde dann mal berichten wie das so ist mit der Steuerung :D

Aber das mit der Geschwindigkeit würde mich auch interessieren, wenn das denn überhaupt geht.

MfG

badamtam
09.11.2006, 20:59
Hey Leute,
da ich gerade ein Roboterarm mit Servos baue hab ich folgendes Problem.
Ich möchte das der Servo nicht mit voller Geschwindigkeit sich von Pos. A nach Pos. B bewegt.
Er sollte am Anfang beschleunigen und kurz vor erreichen der Position langsamer werden, geht das?
Zurzeit steuer ich ihn so an (ATMega16):


'Config Servo
Config Servos = 1 , Servo1 = Portb.3 , Reload = 7


'Config Servopin on AVR
Config Portb.3 = Output

'Enables Interrupts
Enable Interrupts

Do

Servo(1) = 50
Wait 1

Servo(1) = 145
Wait 1

Servo(1) = 240
Wait 1

Loop
End

Und überhaupt, wie realisiere ich am besten eine Roboterarmsteuerung für 7 Servos?

Mfg
Stefan

Wenn Du den Servo langsamer bewegen willst, kannst du den Paramater für die Positionierung in Schritten in Richtung Zielposition zählen. Zwischen den Schritten kannst Du mit WAITMS Pausen einlegen - um so länger die Pausen, um so langsamer die Bewegung. Alternativ könntest Du auch zum Beschleunigen die Zählschritte erhöhen bzw. zum verlangsamen verringern.

Lenox
10.11.2006, 14:36
ah danke, hab ich auch schonmal dran gedacht, ist nur n bisschen umständlich.. ich muss mir Bascom noch was reinzieht, ich möchte auch 2 servos gleichzeitig bewegen, aber halt konfortable, und nicht jedesmal 4 seite coden!

Murus
10.11.2006, 17:34
Ich hab das über ne For-Schleife und mit waitms gemacht. Funktioniert tadellos und lässt sich relativ gut stufen.

Lenox
10.11.2006, 17:54
kannst du mal ein Beispiel posten? wäre nett =)

Murus
10.11.2006, 19:10
For i=1 to 50
servo(1)=i
waitms 30
next

So dreht das Servo von der Position 1 bis zur Position 5o.

kolisson
10.11.2006, 21:49
entschuldigt, wenn ich mich hier mal einklinke:

hab da so ein paar theoretische ideen. im beispiel von murus dreht der servo von 1 bis 50. was ist denn der gesamtbereich eines servos in eurem system ? ( 0 bis 255 oder mehr)

das mit dem wait-befehl ist ja ganz lustig aber ne verschwendung von cpu-leistung und zudem kommt es ja dem ursprünglichen gedanken von LENOX nicht nahe. er will ja die schrittgeschwindigkeit umsomehr verringern, je näher der arm seinem ziel kommt.

dazu müsste man wohl ein vereinfachtes logarithmisches verfahren anwenden.

was mein ihr ?

gruss kolisson

badamtam
11.11.2006, 07:39
entschuldigt, wenn ich mich hier mal einklinke:

hab da so ein paar theoretische ideen. im beispiel von murus dreht der servo von 1 bis 50. was ist denn der gesamtbereich eines servos in eurem system ? ( 0 bis 255 oder mehr)

das mit dem wait-befehl ist ja ganz lustig aber ne verschwendung von cpu-leistung und zudem kommt es ja dem ursprünglichen gedanken von LENOX nicht nahe. er will ja die schrittgeschwindigkeit umsomehr verringern, je näher der arm seinem ziel kommt.

dazu müsste man wohl ein vereinfachtes logarithmisches verfahren anwenden.

was mein ihr ?

gruss kolisson


Wenn man die CPU auch für anderes nutzen möchte, kann man die Servosteuerung ja in eine Interruptroutine oder auf eine extra CPU (kosten ja nicht viel) packen. Das immer lansgamere heranfahren an die Zielposition kann man erreichen, wenn man den Parameter für WAITMS ebenfalls hochzählt. Z.B:

FOR I = 1 TO 50
SERVO(1) = I
WAITMS I
NEXT I

Den Übergabeparameter für WAITMS muß man ggbf. noch teilen oder multiplizieren um ein vernünftiges verhalten hinzubekommen.

Es gibt meines Wissens einfach keine andere Möglichkeit einen Modelbauservo in seiner Verfahrgeschwindigkeit zu maniplulieren. Vielleicht noch wenn man die Versorgungsspannung variiert, aber das klappt bestimmt nicht richtig.

Lenox
11.11.2006, 09:51
50-240 muss ich ihn bewegen, die Idee mit der for-schleife und einer Variablen bei WAITMS kling gut, muss ich mal testen!! danke ;)

badamtam
11.11.2006, 14:31
50-240 muss ich ihn bewegen, die Idee mit der for-schleife und einer Variablen bei WAITMS kling gut, muss ich mal testen!! danke ;)

Besser wäre wohl noch, den Servo erst am Ende der Fahrt zu verlangsamen:

FOR i = 1 TO 50
SERVO(1) = I
IF I > 30 THEN
WAITMS I
ENDIF
NEXT I

Für die 50 und 30 kommen dann natürlich Variablen rein und den Schwellwert fürs Verlangsamen rechnet man sich dann Prozentual, bezogen auf I aus.

Ich weiß jetzt allerdings nicht ob man das mit den 255 Stufen eines Modelbauservos ruckfrei hinkriegt.