Man kann ein "token passing" System/Ring draus bauen.
Download Modellbahnverwaltung
Modellbahnverwaltung kostenlos und ohne Werbung hier downloaden
Man kann ein "token passing" System/Ring draus bauen.
Für eingleisige Eisenbahnstrecken, immer noch verwendet in Indien, kannte ich das schon, nicht jedoch für Datenkommunikation.
Wieder was gelernt ![]()
Fein, dann passt das ja sogar Thematisch bestens zusammen.
Das fehlerbehaftete Ethernet hat Token Ring völlig verdrängt.
Billig ist besser. So ist das Leben.
Und was ein "token" eigentlich ist, ist so schwer zu beantworten, dass google bei der Übersetzung (engl->deutsch) als deutsch den Begriff "Token" anbietet.
"Chip" wie bei der Markierung von Tieren oder dem 'Besetzen' von Einkaufswagen. Oder gleich "Marke" im Sinne von Markieren. Bei dem Ring wird dieser "frei" oder "besetzt" markiert.
Genau so ist das.
Muß ja nicht nur in eine Richtung gehen. Die Datenpackete können ja nachdem sie alle client-Arduinos durchgelaufen sind wieder zum Server-Arduino zurückkommen.
Einfach alle Arduinos so zusammenschalten daß immer ein TX mit dem RX des nächsten verbunden ist.
Muß ja nicht nur in eine Richtung gehen.
Geht es in dem Fall aber. Der Sketch des DIY-Decoders ist ja ( bis auf die Konfigurationsdatei) fertig, und damit steht auch das serielle Protokoll schon. Auslesen von CV's ist bei Lichtisgnalen nicht vorgesehen/sinnvoll.
Der Mega im Stellpult schickt einfach ein Datenpaket mit der Adress- und Statusinfo parallel an alle Decoder (Nano's), und der adressierte Decoder reagiert und schaltet das Signal. Das ist alles.
Grundsätzlich vorgesehen ist das für DCC, aber man kann es parallel auch über seriell ansteuern. Und das will @hotec hier nutzen.
Einen neuen Sketch muss er 'nur' für den Mega im Stellpult erstellen.
Die Decoder unter der Platte müssen nur durch eine Konfigurationsdatei für ihre Aufgabe vorbereitet werden. Sowas sieht dann z.B. so aus ( Lesen der Dokumentation erleichtert das Verständnis - speziell bei den Bitfeldern
):
/* Universeller DCC - Zubehördecoder
**************************************************************************************************
* Beispieldatei für L i c h t h a u p t s i g n a l e
* Die Pins sind für den Arduino Nano ausgelegt.
* Signal 1: Einfaches Hauptsignal ( Hp0/Hp1 ) (Adresse=10
* Signal 2: 3-begriffig ( Hp0/Hp1/Hp2 ) Dieses Signal belegt 2 Adressen ( 11,12 )
* Am gleichen Mast befindet sich ein Vorsignal, das bei Hp0 dunkelgeschaltet wird.
* Signal 3: 4-begriffiges Hauptsignal (Hp00/Hp1/Hp2/Sh1) Das Signal belegt 2 Adressen (13,14)
* Signal 4: 3-begriffiges Vorsignal ( V0/Vr1/Vr2 ) Das Signal belegt 2 Adressen (15,16)
* Dieses Signal befindet sich am Mast von Signal 2 und arbeitet als Vorsignal für Signal 3
* Alle Signale schalten HIGH aktiv ( Kathode der Leds mit Gnd verbunden )
* Dies kann ( signalspezifisch ) durch setzen von Bit7 im Parameter FMode umgedreht werden ( LOW aktiv )
* Der Decoder arbeitet fest im INIMODE ( keine CV-Programmierung ). Die Betriebsmode-Auswahl über einen analogen
* Eingang (betrModeP) ist inaktiv
**************************************************************************************************
*/
// vom Anwender änderbare Parameter um den Zubehördecoder an die verwendete HW anzupassen
#define IFC_SERIAL Serial // Ist der define aktiv, können Kommandos auch über die serielle Schnittstelle abgesetzt werden
#define SERIAL_BAUD 115200
// Beispiel für Variante mit Licht-Ausfahrsignal mit Vorsignal, mit Betriebsmode Led an Pin 13 (interne Led)
//----------------------------------------------------------------
// Hardwareabhängige Konstante ( nicht per CV änderbar)
//----------------------------------------------------------------
// Eingänge analog: ( Bei Nano und Mini - Versionen kann hier auch A7 und A6 verwendet werden, um mehr
// digital nutzbare Ports freizubekommen.
// beim UNO sind A7+A6 nicht vorhanden! )
#define FIXMODE INIMODE // Ist dieses define aktiv, wird der Betriebsmode fest gesetzt, betrModeP wird dann
// nicht gelesen und ignoriert. Mögliche Werte:
// NORMALMODE, POMMODE, INIMODE, ADDRMODE
const byte betrModeP = NC; // Analogeingang zur Bestimmung des Betriebsmodus. Wird nur beim
// Programmstart eingelesen!
const byte resModeP = NC; // Rücksetzen CV-Werte + Mittelstellung Servos
// Eingänge digital (die Ports A0-A5 lassen sich auch digital verwenden): ---------
// Drehencoder zur Servojustierung ...........
#define ENCODER_DOUBLE // Eigenschaften des Drehencoders (Impulse per Raststellung)
//#define ENCODER_AKTIV // Wird diese Zeile auskommentiert, wird der Encoder nicht verwendet.
// Die Encoder-Ports werden dann ignoriert, und können anderweitig
// verwendet werden.
const byte encode1P = NC; // Eingang Drehencoder zur Justierung.
const byte encode2P = NC;
// ............................................
//-------------------------------------------------------------------------------------------------------
// Betriebswerte ( per CV änderbar ) Diese Daten werden nur im Initiierungsmodus in die CV's geschrieben.
// Der Initiierungsmodus lässt sich per Mode-Eingang aktivieren oder er ist automatisch aktiv, wenn keine
// sinnvollen Werte im CV47 stehen.
//-------------------------------------------------------------------------------------------------------
#define EXTENDED_CV // CV-Werte ab V7.0 ( 10 CV per Adresse )
const int DccAddr = 10; // DCC-Decoderadresse
const byte iniMode = 0x50 | AUTOADDR /*| ROCOADDR*/; // default-Betriebsmodus ( CV47 )
const int PomAddr = 50; // Adresse für die Pom-Programmierung ( CV48/49 )
#define NOACK // Diese Zeile aktivieren, wenn keine HW zum CV auslesen vorhanden ist
// ( kein Ack-Pin ) Der in Interfac.h definierte Pin wird dann zwar als OUTPUT
// gesetzt, kann aber für beliebige Funktionen in der Tabelle unten genutzt werden
// Ausgänge: mit NC gekennzeichnete Ausgänge werden keinem Pin zugeordnet. Damit können Pins gespart werden,
// z.B. wenn bei einem Servo kein Polarisierungsrelais benötigt wird
const byte modePin = NC; // Anzeige Betriebszustand (Normal/Programmierung) (Led)
#define MAX_LEDS 16 // default ist 16. Kann auf die tatsächlich benutzte Zahl reduziert werden, um RAM zu sparen.
// Pro Softled werden 19 Byte benötigt
// 1.Signal | 2.Signal | 3.Signal | Vorsignal |
const byte iniTyp[] = { FSIGNAL2, FSIGNAL2, FSIGNAL0, FSIGNAL2, FSIGNAL0, FVORSIG , FSIGNAL0 };
const byte out1Pins[] = { A2, 3, NC, 7, 10, 12, 15 };
const byte out2Pins[] = { A3, 5, NC, 8, 11, 13, NC };
const byte out3Pins[] = { NC, 6, NC, 9, NC, 14, NC };
// Farben der Leds: out1 = ROT ROT - GELB ROT re GELB u GRÜN o
// Farben der Leds: out2 = GRÜN GELB - WEISS GRÜN GRÜN u -
// Farben der Leds: out3 = - GRÜN - ROT li - GELB o -
const byte iniCVx[10][sizeof(iniTyp)] = {
/* iniFmode (CV120,130,..*/ {B00000000,B00000000, 0,B01000000, 0, 0b000000, 0 },
/* iniPar1 (CV121,131,..*/ { 0b000001, 0b000001, 0b000110, 0b001100, 0b000110, 0b000101, 0b000101 },
/* iniPar2 (CV122,132,..*/ { 0b000010, 0b000100, 0b000000, 0b010000, 0b010001, 0b001010, 0b001001 },
/* iniPar3 (CV123,133,..*/ { 0, 6, 0, 0, 0, 13, 0 },
/* iniPar4 (CV124,134,..*/ { 0b000000, 0b000001, 0b000000, 0, 0b000101, 0, 0b000000 },
/* iniPar5 (CV125,135,..*/ { 0, 0, 0, 0, 0, 0, 0 },
/* iniPar6 (CV126,136,..*/ { 0, 0, 0, 0, 0, 0, 0 },
/* iniPar7 (CV127,137,..*/ { 0, 0, 0, 0, 0, 0, 0 },
/* iniPar8 (CV128,138,..*/ { 0, 0, 0, 0, 0, 0, 0 },
/* iniState (CV129,139,..*/ { 0, 0, 0, 0, 0, 0, 0 }}; // Status-Werte
//------------------------------------------------------------------------------------
Am Sketch selbst sind keine Änderungen notwendig, der ist universell ausgelegt.
Wenn @hotec Nanos verwendet, mus er nur sicherstellen, dass er die serielle Verbindung zum Stellpult für's flashen unterbrechen kann. Andererseits können dann die 'Datenpakete' nach dem flashen für's testen der Konfiguration auch einfach im seriellen Monitor eingegeben werden - sind einfache ASCII-Befehle.
Grundsätzlich vorgesehen ist das für DCC, aber man kann es parallel auch über seriell ansteuern.
Meinst du damit ne Parallelschaltung? Also alle RX an den Nanos verbinden, und dann mit dem TX am Mega verbinden?
Brauche ich dann die TXse an den Nanos und den RX am Mega überhaupt?
Ja so ist das
https://www.youtube.com/watch?v=tQRkxHaOBnI
Meinst du damit ne Parallelschaltung? Also alle RX an den Nanos verbinden, und dann mit dem TX am Mega verbinden?
In dem Fall meinte ich, dass man den DIY-Decoder sowohl über DCC, als auch über seriell ansteuern kann. Wenn Du die seriell Ansteuerung aktivierst, wird dadurch der DCC-Empfang nicht abgeschaltet. Es sind dann beide Schnittstellen 'parallel' aktiv. Deshalb kannst Du den Pin2 auch nicht für Led's verwenden, da dort das DCC-Signal erwartet wird. Wenn da nichts kommt, liegt der DCC-Empfang halt brach und bleibt ungenutzt.
Unabhängig davon ist deine 2. Aussage aber auch richtig: Alle Nano-RX werden mit dem TX vom Mega verbunden. Wobei hier gegebenenfalls noch zu beachten ist, wieviele Nano's Du anschließt. Der RX des Nano ist ja auch intern über einen 1K Widerstand mit dem on Board USB-seriell Wandler verbunden. Diese Widerstände belasten den TX Ausgang des Mega. Bei zu vielen Nanos musst Du da evtl. einen einfachen Buffer-Baustein ( z.B. 74HC241 ) zwischenschalten.
Brauche ich dann die TXse an den Nanos und den RX am Mega überhaupt?
Für die Ansteuerung deiner Lichtsignale nicht.
Ja so ist das
https://www.youtube.com/watch?v=tQRkxHaOBnI
Das hat mit der von @hotec gewählten Lösung nichts zu tun.
Wenn man da so genau hinschaut: Andere Mütter haben durchaus schöne Töchter ![]()
Und das ist durchaus eine Wertige Arbeit
Und seine Web Seite Chapeau!
Modellbahnverwaltung kostenlos und ohne Werbung hier downloaden
Und seine Web Seite Chapeau!
Da bekommt man ja Augenkrebs.
Gruß Tommy
Da bekommt man ja Augenkrebs.
Kein Problem solang es Augenärzte gibt.
Ich sehe nur einen der sich viel Arbeit gemacht hat und diese auch freiwillig ohne zu mosern anderen zur Verfügung stellt.
Kann er ja gern und ich finde so etwas gut, aber ich muss die optische Aufmachung seines Webauftritts deshalb nicht Chapeau finden (also ich ziehe für die Aufmachung nicht meinen Hut, sondern klicke weg).
Gruß Tommy
Kann schon sein, wenn die Verpackung höher wertig ist als der Inhalt.
Webauftritts deshalb nicht Chapeau finden
Möchtest Du mir jetzt sagen was und wie ich zu denken habe?
Nö, aber umgekehrt auch nicht.
Gruß Tommy
Guten Abend zusammen,
ich habe ein wenig an der Simulation weitergebastelt.
Die Tastermatrix funktioniert jetzt wie gewollt.
Nun möchte ich 2 Taster gleichzeitig auswerten. Hier stoße ich schon auf ein Problem, wie realisiere ich das?
Der folgende Versuch missglückte:
key wird ausgelesen, key2 aber nicht.
Schalter habe ich nur deswegen eingesetzt, um in der Simulation 2 gleichzeitig drücken zu können.
Der Test, jeden Schalter einzeln zu drücken funktioniert ohne Probleme.
Schönen Abend
edit:
Das hier ist die URL zu dem Projekt:
Könnt ihr darauf zugreifen?