Einfacher, aber variabler Controller für Servomotore

Für meine Weichenantriebe bestand die Aufgabe, das PWM-Signal für den Servomotor zu erzeugen. Dafür sind zwar im Handel diverse Geräte erhältlich, aber man hat ja auch seinen Stolz...

Außerdem habe ich nicht beliebig viel Platz unter der Anlage für die teils doch recht großen Kästen. Daher war auch hier Selbstbau angesagt.

Folgende Anforderungen waren zu erfüllen:

  1. PWM-Ausgang 0,5..2,5ms bei ca. 50Hz
  2. Ansteuerung entweder über 2 Tasten (rechts/links) oder 1 Taste (wechseln)
  3. Merken der Stellung auch ohne Versorgungsspannung
  4. Rückmelden der Stellung
  5. Programmieren der Endstellungen mit Teach-In
  6. Optional: Bereitstellen eines Anschlusses für die Beleuchtung
  7. Möglichkeit des wahlweisen Konfigurierens für andere Anwendungen (z.B. Wasserkran)

Abgesehen vom Teach-In ist das ziemlich überschaubar: Einen PWM-Ausgang haben die meisten Mikrocontroller, ein integriertes EEPROM für die letzte angefahrene Stellung auch. Zwei Digitaleingänge werden für die Steuertasten programmiert, werden beide gleichzeitig betätigt, wird die gegenüberliegende Position angefahren. Und schließlich gibt ein Digitalausgang entweder 1 (rechts) oder 0 (links) als Rückmeldung aus. Auf Grund meiner Erfahrungen und der vorhandenen Infrastruktur wird hier ein Controller vom Typ PIC16F18313 von Microchip verwendet.

Fehlt nur noch das Anlernen des Stellweges. Um möglichst wenige Pins zu belegen, werden die bestehenden Steuereingänge so programmiert, dass sie zwischen kurzen und langen Tastendrücken unterscheiden können. Außerdem kommt eine zusätzliche Taste für das Teachen dazu. Damit ergibt sich dann folgendes Verhalten (kurz: < 1s, lang: > 3s):

Taste Zeit Effekt Rückmeldung
normal
rechts/links egal fahre auf rechte/linke Endposition blinkt, bis Position erreicht
Teach kurz/mittel fahre auf Mittelposition blinkt, bis Position erreicht
lang gehe in Lernmodus blinkt 2x
Lernmodus
rechts/links kurz ein Schritt nach rechts/links -
mittel fahre langsam auf rechte/linke Endposition blinkt, bis Position erreicht
lang neue Endposition speichern und Lernmodus verlassen blinkt 3x
Teach kurz/mittel fahre langsam auf Mittelposition -
lang Lernmodus verlassen ohne zu speichern blinkt 3x

Im Lernmodus stoppt außerdem ein kurzes Drücken einer Taste jede laufende Bewegung.

Das Programm selbst ist in Assembler geschrieben. Mit der Tastenentprellung, der Unterscheidung zwischen kurzen und langen Tastendrücken und der EEPROM-Nutzung ist es schon etwas anspruchsvoller. Außerdem besteht es zu einem großen Teil aus prozessorspezifischem Setup und ist daher wohl nicht allgemein nachvollziehbar.

Der hierzu erforderliche Schaltplan ist recht einfach: Außer dem Mikrocontroller wird nur noch ein Ausgangstreiber für den Servomotor und diverse Anschlussstecker benötigt. Oben wird der Servo und die Beleuchtung angesteckt, unten gehen drei Anschlüsse an die Taster und die Rückmeldung, darüber kann vorübergehend ein Tastenbaustein für das Teach-in angesteckt werden.

Die komplette Elektronik beinhaltet hiervon vier Kopien, zusätzlich getrennte Spannungsregler für die Prozessoren und die Motoren mit Beleuchtung, einen Stecker für das Programmieren und Entlausen des Mikrokontrollers auf Platz 1 und einen (optionalen) fünften Prozessor, mit dem die Helligkeit der Laternenbeleuchtung eingestellt werden kann.

Das Ganze wird auf einer kleinen Platine aufgebaut. Die Controller-ICs sitzen dabei in Stecksockeln, da nur der erste Platz an den Programmierer/Debugger angeschlossen ist. So kann jeweils der im ersten Sockel programmierte Baustein in den nächsten gesteckt werden, wobei auch Mischbestückungen (verschiedene Versionen oder Varianten) möglich sind.

Auf dem Foto ist die Beleuchtungsregelung (5. Controller) noch nicht vorhanden.
Programmierstecker (links) und Platz 3 und 4 sind nicht bestückt.

Ohne Änderungen an der Hardware wären folgende weiteren Varianten möglich:

  • Steuerung eines Servos z.B. für ein dreibegriffiges Signal, bei dem auch die mittlere Position genutzt, angelernt und gespeichert wird. Um dies mit den zwei herausgeführten Eingängen zu steuern, könnte man diese auf Dauerbetätigung abfragen - wenn keiner aktiv ist, wird die Mittelstellung angefahren
  • Analoge Steuerung z.B. für einen Wasserkran. Einer der Eingänge wird als Analogeingang programmiert und kann so die Stellung eines Potis einlesen, die dann direkt auf den Servo gegeben wird. Ein Anlernen wäre hier auch sinnvoll, um den Schwenkbereich zu begrenzen.