Dann versuche ich mal das Projekt zu umreißen.
Wir arbeiten an einer realistischen Stellwerk Simulation. Die vier Hauptbestandteile sind das Stellpult, die Modellbahn, der Simulationsrechner und ein Tastenpult der Zugaufsicht (das heißt bestimmt anders, aber ich bin nicht mit der Materie vertraut).
Modelbahn, Stellpult, Tastenpult und Rechner kommunizieren pausenlos über eine COM-Verbindung (und mehrere µC) mit einander über Gleisfreimeldungen, Weichenstellungen, Tastendrücke, usw... Die Schnittstellen sind momentan nur simuliert vorhanden, aber sollten in der nächsten Woche fertig gestellt werden.
Das Stellpult sendet mittels USB-Tastatur-Treiber Signale an den Rechner, je nachdem welcher der 60 Taster gedrückt wird (funktioniert). Auf dem Stellpult sind 110 Lämpchen (eventuell kommen noch mehr dazu) die Anzeigen welche Weiche gestellt ist, welches Gleis frei ist, welches Signal geschaltet ist, usw...
Ein µC hört im ganzen Netzwerk nur zu und filtert alle Datentelegramme heraus die für ihn uninteressant ist.
Empfängt er ein Telegramm, werden bestimmte Lampen auf dem Pult geschaltet. Da die Lampen 24V benötigen, wird noch ein Treiber davor gelötet (funktioniert).
Das Telegramm enthält 2 hex Ziffern mit deren Hilfe wir jede mögliche Kombination der 8Bit senden können. Ein FF (255 oder 1111 1111) würde alle 8 Pins an Port A auf high setzen eine 00 auf low.
Insgesamt haben wir 36 verschiedene Signaltafeln, die über 8Bit Codes verändert werden können. Eine Signaltafel kann aus 7 Lampen bestehen, aber auch nur aus 2. Je nachdem was es für eine Signaltafel ist. Allerdings muss jeder einzelne Lampe jederzeit unabhängig geschaltet werden. Ein zusammenschieben, dass mehrere Signaltafeln an einem Port liegen, hat nicht funktioniert.
Am Telegramm können wir leider nichts ändern, sodass wir davon abgekommen sind, eine Lampe an einen Pin zu hängen.
Mit einem Arduino UNO können wir über I2C 16 verschiedene Signaltafeln ansteuern, was auch wunderbar mit LEDs funktioniert. Mit drei Arduino UNOs wären es 48, damit hätten wir sogar noch ein wenig Puffer.
Code für die Ausgabe der hex-Zahlen:
void ausgabe(byte dec, byte hex){ // Beginn Ausgabe Funktion
byte adresse, seite;
adresse = (dec / 2) + 32; // Adresse Baustein
seite = (dec % 2) + 18; // Adresse Port
Wire.beginTransmission(adresse); // Übergabe Adresse Baustein
Wire.write(seite); // Übergabe Adresse Port
Wire.write(hex); // Übergabe Wert
Wire.endTransmission(); } // Ende Verbindung Baustein