<<
2011-11-01
^^
Übersicht
>>
2012-09-16

2012-08-23 Mikrocontroller, Steuerung und Licht


Dieses Teil habe ich mit meinem selbstgebauten 3D Drucker ausgedruckt.


Hier sieht man, wie es angeschlossen wurde. Die Kontrollgeräte (siehe weiter unten) werden in das Teil eingesteckt. Die Platine arbeitet als Switch ähnlich wie in einem Computernetzwerk. An dieser Stelle muss ich wohl etwas weiter ausholen. Die Elektronik meiner Modellbahn basiert nicht nur auf NMRA-DCC. Dieses wird nur für die Steuerung der Lokomotiven verwendet. Jegliche sonstigen Funktionen, wie das Ansteuern der Weichen, der Beleuchtung oder der mobilen Bediengeräte habe ich selbst gemacht.

Da ich nicht einen einzigen Mastercomputer bauen wollte, der alles kontrolliert, sondern gerne dezentral über die Jahre weitere kleine Einheiten hinzufügen möchte, musste ein Bussystem oder eine sonstige Netzwerkstruktur die einzelnen Computereinheiten miteinander verbinden.

Hierfür werden gerne Bussysteme eingesetzt wie z.B. RS-485. Bei Bussystemen kommt es aber zu Problemen, wenn Verbraucher im laufenden Betrieb ein- und ausgesteckt werden können. Zwar kann softwareseitig durch entsprechende Protokolle eine fehlerfreie Übertragung garantiert werden, aber im Moment des Ein- bzw. Aussteckens findet dennoch eine Störung statt und keine Daten können übertragen werden. Desweiteren habe ich schlechte Erfahrungen mit der Fehlersuche in Bussystemen mit einigen Teilnehmern gemacht (BNC 10 Mbit Ethernet, auch bekannt als Cheapernet)

Ausserdem gibt es (lösbare) Probleme mit dem gleichzeitigen Senden verschiedener Teilnehmer auf einem Bus. Hauptsächlich wollte ich aber wohl etwas eigenes machen. Achso und ich mag nicht die vielen Kabel. Mein System soll auf einem Draht kommunizierten.

Also mein Kommunikationssystem funktioniert so: Jeder Teilnehmer hat drei Anschlüsse zur Kommunikation mit anderen. Einer führt zum Master, und zwei zu Slaves. Das Gesamtnetzwerk ist daher ein Binärbaum. Jeder Teilnehmer kann nur zum globalen Master senden, und nur der Master kann zu einem beliebigen Teilnehmer senden. Die gesendeten Pakete haben Adressen. Adresse 0 bedeutet zum Master. Ansonsten wird jeweils ein Bit von der Adresse abgezogen, welches darüber entscheidet, ob der rechte oder linke Slave das Paket erhalten soll. Das geht so lange bis ein Paket beim globalen Master angekommen ist, oder es den entsprechenden Slave (keine weiteren Adressbits mehr übrig) erreicht hat.

Wenn der Master mit einem Slave kommuniziert und weitere Slaves dazwischen liegen, so fungieren die dazwischenliegenden Slaves nur als Weiterleitung.

Die Kommunikation arbeitet in Ebenen wie folgt:

1) Bitlayer. Der Bitlayer kann Bits übertragen. Er arbeitet Interruptgesteuert. Die Bits werden gepuffert.

2) Bytelayer. Der Bytelayer wird im Hauptprogramm aufgerufen. Er analysiert die gespeicherten Bits und setzt sie zu Blöcken zusammen. Die Kommunikation ist ganz üblich mit Start- und Stoppbits. Dazwischen 8 Datenbits. Eine Sonderfunktion ist, wenn das Stopbit invertiert ist. Das auf diese Weise gesendete Byte ist das letzte in einem Block. Der empfangene Block wird dann an die nächste Ebene weitergeleitet. Der Bytelayer puffert also halbempfangene Blöcke, da er sie nur weiterleitet, wenn sie komplett sind.

3) Anti Corrupt Layer: Eine CRC-32 Prüfsumme wird dem Block hinzugefügt, bzw. geprüft, ob ein Block mit korrekter Summe empfangen wurde. Wenn alles ok ist, wird der Block weitergeleitet, ansonsten einfach gelöscht.

4) Tokenlayer: Ein Token wird permanent hin- und hergesendet. Nur für den Fall, dass echte Daten zu senden sind, werden statt dem Token echte Daten gesendet. Der Master retransmittet nach einem Timeout, falls keine Antwort kam. Dieser Layer behebt also das Problem, dass es sich um eine Halbduplexverbindung (also gemeinsame Sende- und Empfangsleitung) handelt.

5) Reliable Layer. Ein Sequencecounter wird angehängt und für jedes gesendete Paket wird auf Bestätigung gewartet, bzw. beim Empfangen eine gesendet.

6) Address Layer. Pakete erhalten Addressen und dieser Layer kümmert sich um die Weiterleitung an Master, left oder right slave bzw. Liefert an den aktuellen Kontroller aus, falls er der Empfänger ist.

Jede Schicht hat also nur eine kleine Aufgabe, welche leicht zu programmieren und leicht zu prüfen ist. Durch den klaren Aufbau hat das System von Anfang an reibungsfrei funktioniert ohne dass je Bugs aufgetreten sind. Man kann problemlos Verbindungen kappen und wieder einstecken, nichts geht verloren und keine falschen Daten werden empfangen.

Alles ist in der Sprache C programmiert. Als Mikrocontroller verwende ich den Atmel Atmega 8. Er wird mittels Quarz auf 16 MHz getaktet. Ich programmiere unter Linux und verwende die GNU Toolchain. Jedes Board hat einen ISP 6 Pin Programmierheader wodurch ich die Chips mit einem einfachen USB Programmer sehr schnell programmieren kann. Neugekaufte Chips initialisiere ich einmalig auf einem STK-500 Board (Fuses programmieren).

In meinem Netzwerk befindet sich wie oben beschrieben ein Mastercontroller. Dieser kommuniziert via RS-232 mit dem EasyDCC Modellbahnsteuergerät. Es werden Fahrbefehle gesendet. Wenn also an einem Bediengerät ein Fahrbefehl ausgelöst wird, in dem man z.B. den Fahrtdreher dreht, so wird dieser Befehl über die Netzwerkkette bis zum Master und von dort in das EasyDCC gesendet.

Desweiteren gibt es ein Weichensteuerboard, einen Lichtcontroller, und einen reinen Switch mit vier statt den normalen zwei Slaves, dort wo das 3D Drucker Teil angebaut ist. Am Foto (siehe oben) des Switch sieht man, dass die Ansteuerung aus 4 Drähten besteht. Masse, 5V, global Reset und die Netzwerkverbindung zum darüberliegenden Controller.

Hier das neue Bedienteil. Ein weiteres Foto davon. Die numerische Tastatur verwendet die identischen Befehle wie am Mastercomputer in der Schublade.


Gesendete Befehle werden am Mastercomputer auch angezeigt.

Hier die Weichenplatine Sie wurde ausgebaut, um den Quarz zu tauschen von 4 auf 16 Mhz und um die ISP Schnittstelle hinzuzufügen.


Diese Platine ist teilweise nicht sehr gut geroutet. Ich habe damals das Ziel verfolgt, so eng wie möglich zu packen. Dies wurde durch viele Kabel erkauft. Heute würde ich es mit weniger Kabeln und mehr Platz machen.

Programmieren bei Tag. Am Notebook vorne rechts ist das USB Kabel angeschlossen, welches zum Programmer und dann zu einem meiner Controller geht. Und ohne Licht.


Hier meine Beleuchtungsplatine Ein besseres Foto davon. Es wird das Charlieplexing verfahren angewendet. 10 Leitungen ergeben 10*10-10 also 90 anschließbare LEDs.


Gut zu sehen ist die Busverkabelung. Es werden einfach alle 10 Pins überall hindurchgeschleift. Ich habe eine Tabelle, in die ich eintrage, welche Pinkombinationen schon mit Leuchten belegt sind.

Hier ein paar Schnappschüsse von bereits beleuchteten Häusern. Jedes Haus hat 4 Lampen und jede davon ist getrennt ansteuerbar!


Dieser Beladeschuppen hat zwei Lampen, die von oben auf die Schienen leuchten. Kupferlackdraht und mini-LEDs machen es möglich. Aber man bekommt schon wackelige Finger von dem kleinen Fummelzeug. Achso die leuchtenden Fenster kommen von den zwei Lampen im inneren des Schuppens. Ich sagte ja jedes Haus hat 4 LEDs!



<<
2011-11-01
^^
Übersicht
>>
2012-09-16