Go Down

Topic: Projektvorstellung: Digitales Servo. (Read 1 time) previous topic - next topic

guntherb

Blödes Projekt, oder?
Schliesslich kann man die überall kaufen!

Vieleicht zum Hintergrund:
ich hatte mir ja einen Grillregler gebaut, der die Temperatur im Grill konstant hält, in dem er die Lüftungsklappen mittels Servo auf und zu macht. (hier im Grillforum dokumentiert: http://forum.mybbq.net/viewtopic.php?f=35&t=36986)

Das funktioniert auch soweit ganz gut, bis auf einen Schönheitsfehler: (analoge) Servos haben eine brutale Temperaturdrift!
von -10°C bis 10°C verschiebt sich der Nullpunkt um ca. 25°. Da ich nun auch im Winter grille passiert foglendes: ich lerne die Nullstellung an. Dann kommt die Sonne raus, bzw. das Servo wird durch etwas Strahlungswärme des Grills erwärmt, und schon geht die Lüftungsklappe nicht mehr zu, wenn das Servo auf "null" fährt.

Nun habe ich mir beim  Chinesen billige Servos MG996R bestellt, die mit "digital" beworben wurden. Ich dachte, diese hätten die Temperaturdrift nicht mehr.  Denkste! die waren genauso schlimm. Und nach dem Öffnen war auch klar warum: die hatten den gleichen analogen Servo-IC drin wie die billig-Servos von Conrad.

Da echte digitale Servos Geld kosten und ich schon lange mal was mit ATtinys machen wollte, war bald klar: ich baue mir ein microprozessorgesteuertes Servo!  (ein analoges mit kaputter Elektronik hatte ich noch).

Der Gedanke war: wenn ich das Poti im Servo mit 5V und GND versorge und die Spannung über den AD-Einlese, dann muß ich eine Temperaturunabhängiges Lagesignal erhalten. Messungen mit Tiefgekühlten und Erwärmten Servos bestätigten das.
Als Motorantrieb wollte ich eine fertigen integrierte H-Brücke, weil ich mit dem Timing der Einzelfets nicht herumschlagen wollte, und ich ja auch keinen Platz für viele Komponenten hatte.
Meine Wahl fiel auf den BD6211, einen 5V 1A H-Brücketreiber im SO8 Gehäuse. Dazu einen ATtiny85 (auch im SO8), einen Widerstand, 3 Kondensatoren. Der Schaltplan ist recht übersichtlich.

Zuerst auf Lochraster und Breadboard aufgebaut, den ATtiny nach der Anleitung von http://highlowtech.org/?p=1695 programmiert, konnte ich die einzelnen Funktionen entwickeln und Testen.

Als besonders schwierig stellte sich heraus, den Regler, der den Servo in die richtige Lage bringt, einzustellen. Ich dachte zuerst, der PID-Regler kann das perfekt, aber es stellte sich heraus, dass es doch recht dynamisches System mit hoher Trägheit ist. Eigentlich ein Widerspruch. Am besten lief der Servo, mit einem reinen P-Regler. Dann allerdings kam er nicht exakt auf die gewünschte Stelle.
(ich hatte mir extra in Prozessing ein Programm geschrieben, dass mir Servo-Reaktion grafisch darstellte). Aber sobald ich einen I-Anteil dazupackte, hatte ich heftige Überschwinger. Die Lösung war dann ein P-Regler, bei dem der P-Anteil dynamisch an die Abweichung angepasst wurde.

Andererseits: in meiner Anwendung habe ich ja nicht das Problem, dass ich besonders schnelle Reaktionen brauche. Im Gegenteil, wenn das Servo die Lüftungschieber wild hin und her bewegt, macht das unnötigen Lärm.
Also bin ich zurüch auf einen einfachen P-REgler, dem ich dann noch einen sehr kleinen I-Anteil draufpacke, der auch nur im Kleinsignalbereich wirkt. So fährt das Servo zunächst in die Nähe der gewünschten Position, um dann langsam vom I-Anteil an die genaue Wunschposition hingezogen zu werden.

Als nächstes störte mich das noch immer recht ruckartige Verhalten bei Sollwertsprüngen. Ich hätte gerne ein eher sanftes Anfahren der nächsten Position. Dazu entwickelte ich die Funktion "ServoWegstrecke_sanft()".
Die wandelt einen Sollwertsprung um in eine S-förmige Wegkurve. Der Servomotor beschleunigt zunächste sanft, um dann aber der Mitte des Weges wieder langsamer zu werden und schliesslich genauso sanft in die Zielposition zu gleiten.

Nachdem ich sicher war, dass alles funktioniert, konnte ich mir mein Platinchen basteln. (mittels Toner Transfer Methode von Thomas Pfeifer). Die passiven Componenten kamen als bedrahtetet Version auf die Unterseiten.  Bei löten merkte ich, das ich mir vorher besser eine SMD-Spitze gekauft hätte. :-(

Bei Test drehte der Motor sofort in die Endstellung. Mist!
Es stellte sich heraus, dass ich den Motor im Testaufbau wohl verpolt angeschlossen hatte. Also nochmal Kabel an die Pins anlöten, (Lötpads hatte ich glücklicherweise vorgesehen) den Regler invertieren, und siehe da, es läuft!

Und, nein, keine Fragen an die Gemeinde. Es läuft, ich bin  zufrieden.
Es muß aber erst noch den Praxistest bestehen. Aber diese Woche habe ich keine Zeit mehr.
Möge sich der eine oder andere vielleicht inspiriert fühlen!
Grüße
Gunther

Doc_Arduino

Hallo Gunther,

sehr schönes Projekt. Es lebe die Automatisierung. Finde es Klasse wie Du das immer so machst.
Echt coole Sache!   :)

Tschau
Doc Arduino '\0'

Messschieber auslesen: http://forum.arduino.cc/index.php?topic=273445
EA-DOGM Display - Demos: http://forum.arduino.cc/index.php?topic=378279

Klaus_ww

Sehr cool sogar - und bei sowas freue ich mich immer, das ich wieder was lernen kann.

Dolle Sache, danke!
Freizeit-Programmierer mit moderatem Ehrgeiz besseren Code zu schreiben.

sschultewolter

Die Platine sieht jetzt nicht so prinkelnd aus, was haste damit angestellt :D Aber ansonsten finde ich die Idee und Ausführung lobenswert ;) Karma+1
Orginal Atmel AVRISP mkII zu verkaufen. Anfrage per PN ;)

Go Up