Servo-Steuerung einer Modellbahn-Weiche oder eines Signals mit Attiny84/85

NEU: Auch für Attiny84

Nachdem ich mit der Steuerung einer Bahnschranke bereits vor einiger Zeit in das Thema "Modellbahn" eingestiegen bin, habe ich mich diesmal mit der Steuerung einer Weiche (bzw. eines Signals) mittels eins Attiny45/85 und einem Servo beschäftigt. Entstanden dabei ist ein Testaufbau, wo durch Betätigung eines Tasters ein Servo zwischen zwei einstellbaren Endstellungen bewegt werden kann. Die Endstellungen können mittels Trimmer eingestellt werden und auch die Möglichkeit, dass die jeweils letzte angefahrene Endstellung gespeichert wird, habe ich vorgesehen.


Testaufbau:

Der Testaufbau besteht aus 2 Teilen: Der Steuerplatine, die im Nahbereich des Servo platziert wird und einer Bedienplatine, die im Bedienpult eingebaut wird und über ein vierpoliges Kabel mit der Steuerplatine verbunden ist. Die LEDs und der Taster auf der Bedienplatine sind mit den entsprechenden Bauelementen auf der Steuerplatine parallelgeschaltet.


Verwendete Bauteile:

Steuerplatine:

  • 1 Attiny45/85 / 8 MHz
  • 1 Analog-Servo
  • 2 Taster (Reset und Prog/Switch)
  • 2 Widerstände 220 Ohm
  • 1 Widerstand 10 kOhm
  • 1 LED rot 3 mm
  • 1 LED grün 3 mm
  • 1 Trimmpoti 10 kOhm
  • 1 Programmierstecker 4-pol
  • 1 Netzteil 5 VDC, 1A


Bedienplatine:

  • 1 Taster
  • 2 Widerstände 220 Ohm
  • 1 LED rot 5 mm
  • 1 LED grün 5 mm


Abbildung 5-1: Testaufbau der Servo-Steuerung einer Modellbahn-Weiche oder eines Signals


Die parallelgeschalteten LEDs mit ihren Vorwiderständen müssen so gewählt werden, dass der Strom der einzelnen Attiny-Ausgänge maximal 40 mA beträgt! Ansonsten sind wie bei der Schaltung der Bahnschranke die LEDs z.B. über Transistoren anzusteuern.

Wie auch bei der genannten Schaltung habe ich hier den Steuerausgang PB3 zum Servo (Pin 2) mit einem 10 kOhm Pullup-Widerstand versehen. Damit soll die ruckartige Bewegung des Servos um einen Winkel von ca. 5-10 Grad beim Einschalten verhindert werden. Dieser Sprung tritt bei meinen Servos immer auf, wenn ich den Servo an die Versorgungsspannung lege, unabhängig davon, ob ein PWM-Signal anliegt oder nicht.


Programm:

Funktionen:

  • Bedienung einer Weiche oder eines Signals mittels eines Tasters im Arbeitsmodus (Laufrichtungsänderung des Servos auch während des Servolaufs möglich)
  • Anzeigen der Weichen- bzw. Signalstellung über LEDs auf Basis des ausgegebenen PWM-Signals
  • Positionierung der Servo-Endstellungen im Programmiermodus mit einem Trimmpoti und Speicherung im EEPROM des Attiny  1)
  • Möglichkeit der Speicherung der jeweils letzten Servostellung im EEPROM des Attiny
  • Auf Zufallszahl basierende Verzögerung beim Anfahren der Startstellung nach Neuanlauf, wenn die Speicherung der letzten Servostellung deaktiviert ist  2)

  • Neu in Version 1.2: Möglichkeit, das Verhalten der LEDs während der Stellungsänderung des Servos vorzugeben

(Programmier- und Arbeitsmodus siehe unter Programmablauf weiter unten!)


1)  Beim Flashen des Attiny wird das EEPROM vollständig gelöscht und daher müssen die Endstellungen nach jedem Flashen neu eingestellt werden.

2)  Wenn die Speicherung der letzten Servostellung bei einer größeren Anzahl von Weichen oder Signalen deaktiviert ist, würden nach dem Einschalten der Stromversorgung einer Anlage alle Servos gleichzeitig in die Startstellung fahren. Damit es dabei zu keiner Überlastung der Stromversorgung kommt (pro Servo können je nach Type 100 mA oder mehr auftreten) fährt jeder Servo erst nach einer - mittels Zufallszahl ermittelten - Verzögerung in die Startstellung. Die Verzögerungszeit kann dabei bis zu 20 Sekunden betragen und wird durch abwechselndes Blinken der grünen und roten LEDs angezeigt.


Mit folgenden Vorgaben kann das Verhalten der Steuerung im Programm eingestellt werden:

  • Vorgabe der Verstellgeschwindigkeit des Servos:

//1 ... langsam -> 128 ... schnell
#define pwmDelta 8

  • Vorgabe, ob jeweils die letzte Servostellung gespeichert werden soll:

//0 ... nicht speichern
//1 ... speichern
#define pwmStore 1

  • NEU: Vorgabe, wie sich die LEDs während der Stellungsänderung des Servos verhalten

//0 ... Keine LED leuchtet
//1 ... LED der letzten Stellung leuchtet bis neue Stellung erreicht ist
//2 ... Beide LEDs blinzeln
#define ledBehavior 1

  • Vorgabe der Startstellung nach Reset oder bei Neustart, wenn das Speichern der letzten Servostellung deaktiviert ist:

//0 ... Stellung bei gruener LED
//1 ... Stellung bei roter LED
#define startStellung 0

  • Zur Begrenzung der möglichen Endstellungen des Servos können - abhängig vom eingesetzten Servo - die maximale und minimale Impulslänge des PWM Signals vorgegeben werden (Infos siehe dazu unter Servotest).

const int pwmTimeAbsolutMin = 800; //µs
const int pwmTimeAbsolutMax = 2200; //µs

  • Vorgabe der Speicherstelle im EEPROM (1 Byte), wo jeweils die letzte Endstellung gespeichert wird (siehe auch nachfolgende Info):

#define eepromLastPos 4

Info: Eine EEPROM-Speicherstelle kann laut Datenblatt des Attiny45/85 mindestens 100.000-mal neu beschrieben werden. Da immer nur die Endstellung bei einer Änderung neu gespeichert wird, sollte bei einer Modellbahn-Weiche oder bei einem Signal dieser Wert wohl nie erreicht werden. Sollte die EEPROM-Speicherstelle doch einmal defekt werden, kann man die Vorgabe von "eepromLastPos" von derzeit Speicherstelle 4 auf eine Speicherstelle größer 4 ändern. Die Speicherstellen 0 bis 3 enthalten die einstellbaren Servo-Endstellungen. Bei Verwendung eines Attiny45 stehen daher die Speicherstellen 5 bis 255 und beim Attiny85 die Speicherstellen 5 bis 511 zur Verfügung.


Programmablauf:

(In der nachfolgenden Beschreibung werden die jeweils parallelgeschalteten grünen und roten LEDs - der Einfachheit halber - in der Einzahl genannt)

Neuanlauf nach dem Flashen:

Jedes Mal beim Starten des Attiny nach dem Flashen, sind die im EEPROM des Attiny gespeicherten Endstellungen gelöscht und müssen neu programmiert werden. In diesem Fall geht die grüne LED in schnelles Dauerblinken über und es ist keine weitere Aktion möglich.

Programmiermodus:

Im nachfolgenden Ablaufdiagramm ist Programmierung der Servo-Endstellungen ersichtlich:

Abbildung 5-2: Ablaufdiagramm zum Programmieren der Servo-Endstellungen


(1) Um die Endstellungen des Servo programmieren zu können, ist der Attiny im Programmier-Modus zu starten. Dazu ist beim Neustart des Attiny der Prog/Switch-Taster gedrückt zu halten. Die grüne LED blinkt daraufhin 5-mal langsam.

(2) Nach Beendigung des Blinkens kann mit dem Trimmer die Servostellung eingestellt werden, die der grünen LED entspricht (z.B. Weiche in Geradeaus-Stellung). Ist der Servo in der richtigen Stellung, muss die Übernahme der Stellung mit der Prog/Switch-Taste quittiert werden und die grüne LED blinkt zur Bestätigung dabei 2-mal schnell. Danach beginnt die rote LED 5-mal langsam zu blinken.

(3) Nun kann mit dem Trimmer die Servostellung eingestellt werden, die der roten LED entspricht  (z.B. Weiche in Abzweig-Stellung). Wiederrum muss die Übernahme der Stellung mit der Prog/Switch-Taste quittiert werden, die rote LED blinkt dabei 2-mal schnell und die Servo-Endstellungen werden im EEPROM des Attiny gespeichert.

(4) Der Programmiermodus ist damit beendet und der Attiny befindet sich nun im Arbeitsmodus. Um neuerlich in den Programmiermodus zu kommen, ist wiederum ein Neustart des Attiny bei gedrücktem Prog/Switch-Taster erforderlich.

Arbeitsmodus:

In Abhängigkeit der Programmvorgaben "Letzte Stellung speichern" und "Startstellung" (siehe oben unter "Vorgaben") verbleibt der Servo nach Beendigung des Programmiermodus oder beim Neustart des Attiny in der aktuellen Endstellung stehen (beim Neustart leuchten die LEDs zur Funktionskontrolle für 1 Sekunde auf) oder fährt - wie bereits unter "Programm-Funktionen" beschrieben - nach einer auf einer Zufallszahl basierten Verzögerungszeit in die vorgegebene Startstellung. Während der Verzögerungszeit blinken die rote und grüne LED abwechselnd.

Da im zweiten Fall die Steuerung ja nicht weiß, wo der Servo gerade steht, gibt die Steuerung zuerst ein PWM-Signal aus, das genau der Mitte zwischen den Endstellungen entspricht. Der Servo fährt dann sprunghaft in diese Mittelstellung und dann entsprechend der eingestellten Verstellgeschwindigkeit zur vorgegebenen Startstellung. Dieses sprunghafte Fahren in die Mittelstellung ist nicht zu verwechseln mit der bereits unter "Testaufbau" beschriebenen ruckartigen Bewegung, die beim Einschalten des Servos auftritt und für deren Unterdrückung der 10 kOhm Pullup-Widerstand eingebaut ist.

Wurde also bereits einmal eine Endstellung angefahren und ist die Vorgabe "Letzte Stellung speichern" auf ein, so bewegt sich der Servo nach dem Neustart nicht, sondern verbleibt in dieser letzten Stellung.

Bei jedem Drücken des Prog/Switch- oder des Switch-Tasters fährt der Servo jeweils in die andere Endstellung. Wird der Taster während des Fahrens ein weiteres Mal gedrückt, kehrt der Servo sofort wieder in die ursprüngliche Endstellung zurück. Die jeweilige Endstellung wird durch die entsprechende LED angezeigt. Während der Servo sich bewegt, kann - je nach Vorgabe - die letzte LED leuchten, bis die neue Stellung erreicht ist, können beide LEDs dunkel sein oder können die LEDs wechselweise sehr schnell blinken (= blinzeln).


Verwendete Libraries:

sleep und EEPROM: Die verwendeten Libraries sind Bestandteil der Arduino-IDE und müssen deshalb nicht installiert werden


Hier nun das Programm für Attiny45/85

NEU: Version 1.2

Leider kann ich hier keine "ino"-Files hochladen, daher zum Verwenden des Programms ".txt" aus dem Dateinamen entfernen und in einem neuen Verzeichnis mit dem Namen "Weichen-_und_Signalsteuerung_V1.2" speichern.

Weichen-_und_Signalsteuerung_V1.2.ino.txt


Zur Servo-Steuerung einer Modellbahn-Weiche oder eines Signals mit Attiny84

Zurück zum Servotest Attiny