PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Servos als Antrieb...



Maxi P.
12.05.2010, 21:03
Moin Jungs!
Ich bin gerade dabei mir meinen ersten Roboter zusammen zu löten.
Er soll erstmal nicht viel können, einfach nur mal rumfahren und Hindernissen ausweichen reicht (wobei das erst später realisiert werden soll).
Herzstück ist ein Mega16, welcher mit Bascom gefüttert wird.

Der Roboter ist 160x100mm groß, und wiegt inkl. Akku derzeit nichtmal 200gr.
Antreiben sollen ihn zwei gehackte Servos, die ich noch in der Bastelkiste hatte.
Nun hab ich die Servos gerade offen auf dem OP-Tisch liegen und wundere mich, warum das Poti in der Neutralposition hackt und einen Widerstandswert von 0Ohm hat, hab ich noch nie erlebt! Nun hab ich erstmal zwei 3,3kOhm Widerstände als Spannungsteiler eingebaut und an den Mega16 angeschlossen und o wunder: Sie drehen sich^^
Nun meine Frage: Wie bekomme ich es hin, dass die Servos auch mal aufhören zu drehen? Bislang drehen sie immer unendlich in eine Richtung, mal schnell mal langsam, aber ich bekomms nicht hin, dass sie nichts tun?! Könnt ihr mir helfen?

bnitram
12.05.2010, 21:29
Wenn du die Elektronik aus dem Servo nimmst (nur den Motor drin lassen)und nur dem Motor direkt anschließt dann läuft das Servo nur wenn Strom drauf ist.
Wenn es in die andere Richtung drehen soll dann musst du einfach die Pole umdrehen.

Maxi P.
13.05.2010, 11:25
Die Original-Servoelektronik ist noch drin.

Mein Problem ist jetzt, dass sich das Servo sofort dreht, wenn Spannung auf dem Board ist, obwohl es das eigentlich nicht sollte.
Der Code:

'erstes Bascom-Programm für Roboter

$regfile "m16def.dat"
$crystal = 8000000

Config Portd.6 = Output
Config Portd.7 = Output
Config Portb.2 = Output
Config Pind.5 = Input
Config Pind.4 = Input

Config Lcdpin = Pin , Db4 = Portc.4 , Db5 = Portc.5 , Db6 = Portc.6 , Db7 = Portc.7 , E = Portc.3 , Rs = Portc.2
Config Lcd = 16 * 2

Config Servos = 2 , Servo1 = Portd.6 , Servo2 = Portd.7 , Reload = 10

Enable Interrupts 'Interrupts für Servo erforderlich!

Taster1 Alias Pind.5
Taster2 Alias Pind.4
Led_gruen Alias Portb.2

'hier dreht sich das Servo!

Portd.6 = 0
' hier dreht es sich immernoch?!

Cursor Off

Cls
Locate 1 , 1
Lcd "# RobiRobo 1.0 #"
Waitms 500
Led_gruen = 1
Wait 1

Servo(1) = 100
Cls
Locate 2 , 1
Lcd "Servo 1 an"
Wait 60

Portd.6 = 0
Cls
Locate 2 , 1
Lcd "Servo 1 aus"

End

Wenn ich den ganzen Servo-Müll rausschmeiße, dann dreht es sich nicht, also schließe ich daraus, dass es zu 100% an der Software liegt?!
Bei einem anderen gehackten Servo ist das gleiche Problem, hier ist auch noch das Poti drinne, aber wenn man am Poti dreht ändert sich komischerweise garnichts?

Rabenauge
13.05.2010, 11:43
Ich würde es so machen: Servo an Spannung (Plus und Minus halt, 5V), und die Signalleitung vom Servo an einen PWM-Ausgang.
Servos _können_, wenn sie gar keine PWM bekommen, unkontrolliert laufen, darum musst du ihnen per PWM eine Vorgabe liefern (deswegen darf man bei RC-Anlagen auch z.B. nie den Empfänger vor dem Sender einschalten, das kann die Servos beschädigen).


Potis stellst du am besten auf Mitte, misst sie und ersetzt die dann durch passende Widerstände (es _geht_ auch mit Poti, aber dann ist es schwer, sie wirklich ruhig zu stellen).
So funktioniert es bestens.

Der Trick ist dann nur noch, das passende PWM-Signal zu den Widerständen zu erzeugen, bei dem das Servo auch stehenbleibt.

TobiKa
13.05.2010, 11:44
Normalerweise schmeisst man die ganze Elektronik raus und benutzt ne Doppel-H-Brücke ( L293 ) um 2 Servos zu betreiben.

oberallgeier
13.05.2010, 13:10
... hab ich erstmal zwei 3,3kOhm Widerstände als Spannungsteiler eingebaut und ... Sie drehen sich ... mal schnell mal langsam ...Es gibt zwei Möglichkeiten, Ser vos zu hacken:

A) Elektronik drinlassen.
Dabei wird - wie Du es wohl gemacht hast, die Ser vo-Mittelstellung durch einen Spannungsteiler simuliert. Im Ser vo muss noch der Drehwinkel-Anschlag entfernt werden. JETZT kannst Du mit einer üblichen Ser vo-P WM den Motor steuern. Du kennst das übliche P WM-Signal für Ser vos? Etwa 50 mal pro Sekunde kommt ein Signal mit Pegel high, etwa +5V gegen GND des Ser vo (jaaa- Ser vo-GND und Controller-GND müssen verbunden sein) von etwa 0,5 bis 1,5 ms Länge. Bei Deinem Spannungsteiler wird der Ser vo dann bei rund 1 ms Signallänge ziemlich langsam drehen, sollte eigentlich sogar stillstehen, bei weniger dreht er in eine Richtung, bei einem längeren Signal dreht er in die andere Richtung.
Vorteil: Du brauchst für die Ansteuerung eines Ser vos nur einen Controllerpin.
Nachteil: nach meiner Erfahrung lebt die Elektronik nicht wirklich lange . . . . die ist wohl nach wirtschaftllichen Gesichtspunkten meist ziemlich knapp ausgelegt. Ausserdem ist man an die Stellgeschwindigkeit der Drehzahleinstellung von 50 Hz gebunden - das war bei mir für eine schnelle und gute Regelung viel zu langsam. Bei einer 8-Bit-P WM hast Du nur 127 Werte zum Steuern einer Richtung (langt aber doch wohl immer).

B) Elektronik ausbauen
und den Motor so betreiben, wie eben ein Gleichstrommotor betrieben wird. (Dass dies der Normalfall sei, halte ich eher für ein Gerücht.) Dabei werden übliche Motorbrücken-ICs eingesetzt, die mit 2 oder drei Pinnen je Motor vom Controller gesteuert werden.
Vorteil: Die P WM kann so schnell sein, wie Du willst - na ja, wie Du als richtig empfindest oder berechnest. 10, eher 20 kHz ist da nicht zu viel, siehe diesen Thread. (https://www.roboternetz.de/phpBB2/viewtopic.php?t=37410) Theoretisch kann man dann mit ein paar Kilohertz die Drehzahl nachstellen/regeln. Es wird die volle Bitbreite der P WM zum Stellen in eine Richtung ausgenutzt = doppelte Auflösung wie bei A).
Nachteil: Es werden pro Motor zwei, meist drei Pinne für die Drehzahlstellung benötigt.

Meine Lösung sieht aus wie im Bild unten (Mikroservo vom C für fünf Flocken): keine Elektronik, auch mal zwei Getriebestufen übersprungen (ein Rad ausgebaut) - und das gibt dann statt 1 Ups eine Drehzahl von 8 Ups. UND eine mikroskopisch kleine Drehzahlmessung mit Gabellichtschranke.

................http://oberallgeier.ob.funpic.de/GMot_enc4_1710.jpg