Servo - INTERENE Software

Hallo zusammen,

ich habe mal ne etwas allgemeinere Frage zu Servos.

Ich bastle an verschiedenen Modellen, die Teilweise noch alte Servos haben.
Was verstehe ich unter „alten“ Servos? Das sind Servos, die die Regelung der Position nicht selber intern regeln, über ein PWM Signal, sondern lediglich die 3 Adern des Pots und 2 des Motors haben. Die Regelung erfolgt in meinen Fall über die Platine. Auf der auch alles andere, wie Regler, Empfänger usw usw… zusammen gelötet sind. Das Modell habe ich noch aus meiner Kindheit, also irgendwas 1990 bis 95. Von dem her kann da noch nicht allzu viel Softwareseitig erledigt worden sein.
Klar könnt ich einfach nen neuen Servo reinbasteln. Aber, ich habe mir eigene linear Servos gebaut, da der Markt in dem Bereich wirklich wenig hergibt und ich genau sowas in meinem Modell benötigt habe. Wer mag, möge sich gerne ein Bild von meinen bisherigen Bastleien machen:

Als Positionsrückmeldung dienen umgebaute einfache Linear Fader (die Dinger, die jeder auf dem HIFI Bereich kennt.
Es gibt genau einen Hersteller (Firgelli) der Linear Servos mit halbwegs langen Wegen anbietet. Diese sind dann aber von der Baugröße im Verhältnis zum Weg sehr groß.
Soweit so gut, jetzt habe ich weit ausgeholt, und komme auf meine eigentliche Frage zurück:

Ich habe nun auf meinem Arduino für die „Servos“ einen Code geschrieben, den ich hier gerne bei Interesse poste, aber der nicht wirklich optimal ist. Was mache ich, in Worten ausgedrückt:
Wenn Fehler (gemessene Spannung – vorgegebene Position) größer/kleiner als ein bestimmter Wert, fahre rauf/runter. Klappt soweit auch ganz gut. Aber das Gelbe vom Ei ist es nicht.

Weil:

  • Mach ich mein Fehlerintervall zu klein zuckelt das Ding hin und her, mach ich es zu groß ist es nicht sehr genau. (Wenn ich den Servo kurz vor erreichen seiner Soll Position abbremse, wird’s schon etwas besser) (Meine Servos haben ne H Brücke vorgeschaltet.)

  • Zusätzlich „hält“ ein Servo von der Stange die Position bei Last. Das haut mit meinem Ansatz natürlich nicht hin. Der wird geschoben, bis er außerhalb des Fehlers ist, und dann erst fährt er wieder an die vorgegebene Position zurück. Das ist eigentlich der noch interessantere Part...

Daher meine Fragen:

  • Weiß jemand, wie so ein Servo Code intern in etwa aussehen könnte? PID Regler etc.? Die PWM Signalverarbeitung am Servo Eingang ist jetzt mal zweitrangig. Auf dem Chip im Servo hock ja vermutlich ein AD Wandler für den Pot, eine H-Brücke, und irgendeine Regelung, die Hardware oder Softwaremäßig aufgebaut sein muss. Aber Infos dazu habe ich fast nix gefunden.

  • Wie haben die das dann vor rund 25 Jahren gemacht, ein allzu komplexer Mico Controller wird’s da kaum gewesen sein? Nur so am Rande… (Die Platine, die da verbaut war, ist echt Retro! :smiley:

Will das Thema mal umfassender verstehen, und freue mich, falls da jemand von Euch tiefere Kenntnisse hat.

Vielen Dank und Gruß Michl

Ein Zweipunkt-Regler zuckt immer. Da kannst du machen was du willst. Die sind für Heizungen geeignet, aber nicht um etwas genau zu positionieren. Dafür brauchst du einen PI oder PID Regler.

Ja, das man das mit nem PI oder PID Regler lösen muss, dachte ich mir schon, siehe in meinem Post. Die Frage ist, gibts sowas schon, oder hat sowas schon mal jemand gemacht?

Muss ja das Rad nicht neu erfinden... :slight_smile:

Es gibt eine PID Library:
http://playground.arduino.cc/Code/PIDLibrary

Die Regelparameter darfst du aber selbst herausfinden

PID Regler sind aber auch ganz leicht selbst zu programmieren. Das ist nicht kompliziert

Es gibt auch ein Projekt wo sie mittels eines ATmega die Servoelektronik ersetzen und so den Servo zu einem digitalen Servo machen. Digital heißt in diesem Fall nicht digitale Verarbeitung und Ansteuerung des Motors mit einem PPM signal sondern auch digitales Interface. Soweit ich verstanden habe versteht die neuste Version auch ein normales Servo PPM Signal.

http://openservo.com/

Grüße Uwe

Die Servo Regelung erfolgt vermutlich über einen Komparator, der das auf Analog umgesetzte PWM Signal mit der Spannung des Poti vergleicht. Diese Differenz kann dann zur Motorsteuerung verwendet werden, wobei das Abbremsen mit abnehmender Differenz automatisch erfolgt.

Wie man das konkret mit einer PWM H-Bridge zum Laufen kriegt, kann ich nicht sagen. Vermutlich wurde der Motor früher analog gesteuert, der Arduino müßte also die Position messen und die Differenz in passende PWM Werte umrechnen - wobei die Motorkennline (Spannung bis der Motor sich überhaupt bewegt) irgendwie eingebaut werden muß. Bei einem PID Regler ginge das über den zusätzlichen D (Anstupsen) und I (am Laufen halten) Anteil.

Guten Morgen zusammen, und danke für die vielen Antworten. Hatte jetzt lange keine Zeit für mein Hobby…

Die Site OpenServo ist wirklich klasse, aber das ist nichts, was man mal so neben zu machen kann. Das wird viel Arbeit.

@DrDiettrich.

Ja, das mit ner H- Bridge ist der einfachste Teil, das läuft.

Wann der Motor anläuft, lässt sich ja einfach ausprobieren. Leider ist genau der Teil, den Du beschreibst, auf der Page openservo nicht zu sehen. http://openservo.com/MathModel

Was ich gar nicht brauche ist die PWM Thematik der Ansteuerung, der Code soll ja auch auf dem Arduino laufen.

Somit bleibt die Messung des Pots, wo stehe ich, der Vergleich, wo will ich hin. Und mit Hilfe eines PID´s, wie komme ich da möglichst Smooth hin.

Aber bis dahin habe ich ein einfache Lösung:

Man kann die ICs, die in den Servos sind auch einfach kaufen (ein paar Cent) und sich somit seinen eigen basteln. Ebenfalls gibt es solche Modelle fertig. Z.B. von CTI -> Thor Servo Elektronik. Da ist ein IC + HBridge + Spannungsversorgung dabei.

Hier kann man halt die Geschwindigkeit des Servos nur bedingt beeinflussen.

2 Lösungen habe ich bisher. Zum einen kann man über einen Transistor die Spannung reduzieren. Oder man lässt den Arduino die neue Servo Position in kleinen Schritten ansteuern. Also z.B. ich will von 90 auf 180 Grad. Ändere ich den Wert um 90 Grad flizt er max Geschwindigkeit da hin. Lasse ich in aber in jedem Schleifendurchlauf nur um ein paar Grad fahren, läuft er je nach Winkelschritt schneller oder Langsamer.

Sobald ich weiter bin mit dem eigenen Code, werde ich das natürlich ausführlich hier posten, und hoffe, dass es anderen auch mal hilft.

Gruß Michl