zurueck.gif
Leuchtturmfeuer 3.0


Leuchtturm_roter_sand.jpg
Leuchhtturm  Roter Sand.
Quelle: Wikipedia, Autor: Markus Jastroch

In der Elektorausgabe Jan./Feb. 2019 erschien mein Artikel Leuchtturmfeuer 2.0. Der Artikel basierte auf einen älteren Artikel aus dem Jahr 2010 mit analogen Komponenten. In meinen Artikel beschrieb ich eine Schaltung mit einem ATTiny45, 3 Potis und einer LED als Leuchtfeuer. Mit den drei Potis legte ich das Verhältnis von An- Abschwellen und Blitzen, die Dauer der Leuchtsequenz und die Anzahl der Blitze innerhalb der Leuchtsequenz fest. Dabei setzte ich voraus, dass die Leuchtdauer und die Pausen dazwischen immer gleich lang sind und stets 1 Sekunde dauern. Nur die große Pause am Ende der Sequenz ist einstellbar. So könnte eine Kennung z.B. wie folgt aussehen: 1 S ON, 1 S OFF, 1 S ON, 1 S OFF, 1 S ON, 15 S OFF = 20 Sekunden. Nun zeigte mir eine Leseranfrage dass es Leuchttürme gibt die man damit nicht einstellen kann. So hat der Leuchtturm "Gedser Fyr" folgende Sequenz: 2,5 S ON, 2,5 S OFF, 2,5 S ON, 7,5 S OFF = 15 Sekunden. Alle zeitlichen Vorgänge in dem Programm basierten aber auf einer Interrupt-Routine die alle 10 mS = 1/100 S aufgerufen wurde. Das steuerte die 100 Lichtwerte, die das Drehfeuer simulieren, aber auch sämtliche anderen zeitlichen Abläufe, wie z.B. die OFF- Zeiten. Das bedeutet das nur ganzzahlige Sekundenwerte möglich sind, da sowohl der Wert 1/100 Sekunde als auch die 100 Lichtwerte fest liegen. 2,5 Sekunden sind also nicht darstellbar und daher konnte der Leuchtturm "Gedser Fyr" nicht simuliert werden.

Ich nahm dies zum Anlass eine neue Version zu schreiben, die auf Basis einer 1/1000 Sekunde arbeitet. Es ist die hier beschriebene Version 3.0. Auch hier simuliert eine LED die Laterne eines Leuchtturms. In der Version 3.0 sind bis zu 20 ON/OFF Phasen mit je max. 30 Sekunden möglich, die der Anwender selbst einstellt. Längere Zeiten sind möglich indem man mehre gleichartige Phasen festlegt. (z.B. 45 Sekunden OFF = 30 Sekunden OFF + 15 Sekunden OFF). Wie mich ein befreundeter Segler wissen ließ, sind das Werte die in der Praxis nie erreicht werden. Die minimale Zeit beträgt 100*0,001 Sekunden = 0,1 Sekunde für eine Phase. Jede Phase kann unterschiedlich lang sein. Die Kurvenform kann zwischen ON/OFF, Blitzfeuer und Funkelfeuer gewählt werden. Dabei kann für jede Phase festgelegt werden, ob sie eine ON- Phase oder eine OFF- Phase werden soll. Da ich den ATTiny 45 unbedingt beibehalten wollte, kann die Einstellung, mangels Anschlusspins, nicht mehr über Potis vorgenommen werden, wie beim Leuchtturmfeuer 2.0, sondern erfolgt über eine COM- Schnittstelle und einer Terminalemulation auf dem angeschlossenen PC.


monitor.jpg
Z. B. das kostenfreie Tera Term. Anbei ein Screenshot. D.h. man benötigt zum Einstellen der Parameter einen Schnittstellenwandler von USB auf serielle COM– Schnittstelle, z.B. einen Arduino Uno R3 oder einen Kompatiblen mit einem ATMega 328 im DIL- Gehäuse, den man entfernen kann. (siehe hierzu auch den Artikel „Tipps und Tricks“ aus Elektor Mai/Juni 2018, S, 72 und 73.) Die kompatiblen Arduinos gibt es mittlerweile für unter 10,- Euro, bei Amazon.

Schaltplan und Aufbau

190126aa-001s.jpg 190127aa-001b.jpg


190127aa-002a.JPG
Zurück zu den Einstellungen. Um sie durchführen zu können, muss der Pin 7 vor dem Einschalten/Reset auf Masse gelegt werden. Ist der Controller hochgefahren dann können Sie die Masseverbindung wieder trennen. Sobald Sie die Einstellungen der Parameter vorgenommen haben, werden die Parameter ins EEPROM des ATTiny dauerhaft gespeichert und von dort mit jeden Neueinschalten oder Reset geladen. (Vorher die Masse von Pin 7 entfernen, sonst programmiert man neu). Damit können nun diverse Seezeichen nachgebildet werden und natürlich auch das Gedser Fyr.

Oben der Schaltplan und ein Bild des Schaltungsaufbaus, beim Einstellen des AVRs. Darunter ein Bild wie Sie den Chip dann in einem Modell nutzen. Um Einstellungen vorzunehmen brauchen Sie also nicht richtig programmieren, sondern nur über eine Terminalemulation ein paar Einstellungen vornehmen. Der ATTiny45 fragt Sie und Sie geben die gewünschten Werte ein und bestätigen mit Return.
Sie können natürlich auch einen anderen Schnittstellenwandler nutzen. Wichtig ist nur, dass der COM- Ausgang TTL- Pegel hat und nicht wie bei der RS232- Schnittstelle +12V/-12V. Das würde den ATTiny töten.

Die Software
Das Programm wurde mit dem BASCOM- AVR geschrieben. Es unterteilt sich in folgende Teile:
die Initialisierung
das Hauptprogramm
das Unterprogramm UP_Kurvenform
das Unterprogramm UP_Erfassen
das Unterprogramm UP_Eingabe
das Unterprogramm Hole_ein_Zeichen
das Unterprogramm Zeitbasis1

Im einzelnen:
Nach der Dimensionierung der Variablen und Konfiguration von Schnittstellen, Timern und Ports folgt das Hauptprogramm, in dem zunächst abgefragt wird ob der Taster S2 gedrückt ist. In diesen Fall geht das Programm in die Erfassung der Leuchtturmparameter über die serielle Schnittstelle. Dies geschieht in dem Unterprogramm UP_Erfassen, das seinerseits das Unterprogramm UP_Eingabe und dieses das Unterprogramm Hole_ein_Zeichen benötigt. Anderenfalls werden die Leuchtturmparameter aus dem EEPROM eingelesen. Die Leuchtturmparameter sind die Variablen Kurvenform, Anzahl, Phase() und LEDAn.

Die Kurvenform legt die Art fest in der der Leuchtturm leuchtet. Das kann ein ON/OFF Betrieb, ein An- und Abschwellen der Leuchtintensität mit einem Aufblitzen in der Mitte oder ein Funkeln der LED sein.


Die Variable Anzahl legt die gesamte Anzahl der Ein- und Ausschaltphasen fest. Also wie viele ON und OFF- Zustände des Leuchtturms es insgesamt gibt.


In dem Variablenfeld Phase() wird die Dauer der jeweiligen An- Ausschaltphasen festgelegt. Außerdem steckt in dem Variablenfeld Phase() der Zustand der LED, als AN oder AUS. Ist die Variable Phase() kleiner oder gleich 30000 (30 Sekunden) dann ist die LED aus. Ist Variable Phase() größer als 30000 ist die LED an. Das heißt: zu der eigentlichen Dauer der Phase wird der Wert 30000 addiert, wenn die LED an sein soll. Diese Kodierung wurde gewählt um Speicherplatz zu sparen, der ja beim ATTiny45 recht knapp bemessen ist.


Nun folgt ein Sprung in das Unterprogramm UP_Kurvenform.

Hier wird die gewählte Kurvenform der Arten ON/OFF, Blitzfeuer und Funkelfeuer festgelegt und in das Variablenfeld Form() gespeichert. Dabei entspricht ein Element des Feldes jeweils 1/100 der Gesamtdauer der Phase. In der Ausphase werden später die Werte von Form() ignoriert und die LED wird ausgeschaltet.

Nachdem das Programm aus dem Unterprogramm UP_Kurvenform zurückgekehrt ist, kommt nun die eigentliche Steuerung des Leuchtturms
 In einer Endlos Do- Loop- Schleife durchläuft eine For- Next- Schleife die einzelnen Phasen und dekodiert sie. Ist der Wert von Phase() > 30000 wird die Variable LEDan auf den Wert 1 gesetzt und von dem Zeitwert von Phase() werden 30000 abgezogen. Das Ergebnis wird in die Variable MaxZeit gespeichert. Andernfalls wird LEDAn auf Null gesetzt und der Variablen MaxZeit wird der Wert von Phae() direkt zugeordnet. Aus der Variablen Maxzeit wird die Zeit für das Abarbeiten eines Feldes der Feld variablen Phase() errechnet und der Variablen PWMEinheit zugeordnet. Damit haben wir sowohl die Gesamtdauer einer Phase und die Zeit die ein Element aktiv sein muss als auch den Zustand der LED während der Dauer dieser Phase.

Nun wird mit der Variablen Zeitmessung_ein die Zeitsteuerung scharf gemacht. Diese läuft in der Interruptroutine Zeitbasis1 ab, die hardwaremäßig alle 1/1000 Sekunde aufgerufen wird. In ihr passiert nur dann etwas wenn die vorgenannte Variable Zeitmessung_ein auf 1 steht, sonst wird die Interruptroutine wieder verlassen. Steht Zeitmessung_ein jedoch auf 1, dann wird eine PWM- Steuerung der LED aktiviert. Dies geschieht nicht bei jedem Aufruf der Interruptroutine, sondern nur dann wenn der Wert der Variablen PWMEinheit erreicht oder überschritten ist. Sprich: wenn die Zeit für eine Einheit der Feld variablen Form() abgelaufen ist. Dann wird die Nummer des abzuarbeitenden Elements erhöht. Die Werte von Form() bestimmen den PWM- Wert und setzen so die aktuelle Helligkeit der LED. Dabei wird berücksichtigt ob die LED an oder aus sein soll. Ist sie aus dann wird der PWM- Wert auf Null gesetzt, Andernfalls wird die LED auf den Wert von Form() gesetzt. Ist eine Phase komplett abgearbeitet wird die Variable Zeitmessung_ein wieder auf Null gesetzt. Die Interruptroutine schaltet sich dann sozusagen selbst ab.

Das Hauptprogramm überwacht den Zustand der Variablen Zeitmessung_ein in einer Do- Loop- Schleife, die erst dann verlassen wird wenn die Interruptroutine die Variable Zeitmessung_ein wieder auf Null gesetzt hat. Ist die For- Next- Schleife abgearbeitet beginnt in der Do- Loop- Schleife ein neuer Durchlauf des Programms.


Fuses
Hier die Fuses auf die der ATTiny45 eingestellt sein muss.
EXTENDED: 0xFF, HIGH: 0xDF, LOW: 0xE2
Eigentlich ist es der Grundzustand, des ATTiny45. Da Kontrolle bekanntlich besser ist als Vertrauen, empfehle ich Ihnen trotzdem einen Blick in die Fuses zu werfen. Insbesondere dann, wenn der ATTiny schon einmal benutzt wurde oder die Schaltung ein ungewöhnliches Verhalten an den Tag legt. Wenn zum Beispiel die serielle Übertragung nicht klappen will oder das Zeitverhalten der Leuchttürme nicht stimmt.


Bild  Leuchhtturm  Roter Sand. Quelle: Wikipedia, Autor: Markus Jastroch

[1] Download

.zurueck.gif