Go Down

Topic: I2C Bus Gleisbildstellwerk - Module (Read 2369 times) previous topic - next topic

Doc_Arduino

Hallo,

du hast hoffentlich eine eindeutige Kennung für die aktuelle Fahrtrichtung des Zuges.
Wenn Richtung aktuell A>B, dann gib nur Taster x frei, wenn Richtung B>A, dann gib nur Taster y frei ...
Bzw. frage nur Taster x oder y ab an der Stelle und ignoriere den anderen.
Skiziere dir einen Ablaufplan, verfeinere diesen immer wieder, am Ende steht der Code fast von alleine da.

So ein Vorhaben einer Modelleisenbahnsteuerung benötigt überreife Vorabüberlegungen. Man muss alle möglichen Zustände die es geben kann erfassen, jederzeit aktualisieren und abfragen können. Am Ende steht ein Programmgerüst was "nur noch" Zustände logisch verknüpft um daraus Entscheidungen zutreffen. Die vielen Entscheidungen sind dann "tausende" Funktionsaufrufe wie Weichen stellen, Signale stellen, Zug anfahren lassen oder stoppen usw. Im Grunde ist so eine Modelleisenbahnsteuerung eine Ellenlange Zustandssteuerung oder Endlosautomat mit tausenden Möglichkeiten. Hier muss von Anfang an eine glasklare Struktur vorhanden sein. Man darf sich nicht verleiten lassen mittendrin oder kurz vorm Ende "zu pfuschen" und damit die Struktur zu nichte macht. Das so als Hinweis.
Tschau
Doc Arduino '\0'

Messschieber auslesen: http://forum.arduino.cc/index.php?topic=273445
EA-DOGM Display - Demos: http://forum.arduino.cc/index.php?topic=378279

MicroBahner

#61
Apr 08, 2017, 03:37 pm Last Edit: Apr 08, 2017, 05:19 pm by MicroBahner
Mein jetziges Problem ist, mein Master mega 2560 hat zu wenig Eingänge. Meine Frage an Euch, kann ich einen zweiten Master mega 2560 an den I2C zuschalten. Da ich bei meinem Gleisbildstellwerk immer nur einen Taster drücke, würde ein Konflikt der zwei Master nicht vorkommen und wenn ja, was würde dann passieren?


Hallo BJS,
Ich habe auch ein ähnliches Stellpult gebaut, allerdings nicht als Gleisbildstellpult, sondern als Nachbildung eines Hebelstellwerks. Da braucht man in der Tat viele Eingänge und Ausgänge. Da Du eh schon mit I2C arbeitest, bietet sich da - wie schon von Hotsystems vorgeschlagen - I2C Expander an. Wenn Du die Schalter dann noch in einer Matrix anordnest, kannst Du ohne weiteres mit nur 2 PCF8574 bis zu 64 Schalter abfragen. Auch die Rückmelde-Leds lassen sich mit einem SAA1064 per I2C ansteuern. Da kommst du pro IC auf 32 Leds. Probleme mit IO's am Arduino gibt's dann nicht mehr und Du kommst mit einem Master aus.

Interrupts braucht man dazu auch nicht, das geht ganz klassisch wie in jeder SPS: Am Anfang des loop werden die Schalter eingelesen, und in entsprechenden Variablen(arrays) abgespeichert. Damit wird dann im Sketch gearbeitet und die Ergebnisse werden wieder in entsprechenden Variablen gespeichert.
Am Ende des loops werden die Ergebnisse dann per I2C an die Slaves übertragen und die Led's entsprechend geschaltet.
So werden in meinem Stellwerk alle Weichen, Fahrstraßen und Signale und noch Schranken und sonstiges  geschaltet.


Sobald Fahrstraßen ins Spiel kommen, kann die Sache aber beliebig komplex werden, und wie schon von Doc_Arduino angesprochen braucht's dann eine gute Planung.
Gruß, Franz-Peter

BJS-1952

Hallo

Melde mich mal wieder.

Mit meinem Gleisbildstellwerk schalte ich nur Weichen- und Fahr- Straßen in meinem BW (Betriebswerk), so dass es nicht übermäßig kompliziert wird und eine verhältnismäßige einfache Struktur sich ergibt.  
Mein Problem, dass ich in # 59 beschrieben habe, besteht immer noch.
Ich habe mir die Schaltung mit NAND und NOR Schaltglieder aufgebaut, das eigentlich einfach war und sie funktioniert.
Die Schaltung habe ich hier veröffentlicht und hoffe dass sie auch erscheint. Wenn nicht, bitte helft mir wie im # 35.
Meine Bitte an Euch, kann mir jemand die zugehörigen Zeilen schreiben, so dass ich sie verstehe und in meinen Sketch einbauen kann. Derjenige, der dies hinbekommt, kann sich als ein Genie bezeichnen. Ich habe bis jetzt noch niemand in meinem bekannten Kreis gefunden, der dies hinbekommen hat.

Noch eine Frage zum Schluss? Wie bekommt man die Fußnote z.B.  „ I2C = weniger ist mehr: weniger Kabel, mehr Probleme „ hin.

Danke im Voraus

Grüße BJS



Was machen Bits am liebsten? - Bus fahren

HotSystems

Noch eine Frage zum Schluss? Wie bekommt man die Fußnote z.B.  „ I2C = weniger ist mehr: weniger Kabel, mehr Probleme „ hin.
Gut, gell ? ;)

Du klickst (oben rechts) auf Profile, dann unten Forum settings auf Edit, dann wieder auf Settings und Forum Profile.

Danach gibst du deine Signatur ein.
I2C = weniger ist mehr: weniger Kabel, mehr Probleme. 8)

ElEspanol

#64
Apr 20, 2017, 09:44 am Last Edit: Apr 20, 2017, 09:45 am by ElEspanol
Die Wertetabelle in dem pdf kann so nicht stimmen. Da sind für gleiche Eingangswerte I I verschiedene Ausgangswerte angegeben. Zeile 2 und 4

BJS-1952




Die Wertetabelle ist etwas unglücklich abgebildet.

Nachfolgend habe ich nochmal versucht zu erklären, wie die Schaltung funktioniert.

Beim betätigen von z.B. Taster A wird an den NAND Gliedern von Ausgang Q1 und Q2 jeweils an einem Eingang ein HIGH gesetzt. Beim betätigen von Taster A und gleichzeitig Taster B wird an dem zweiten Eingang vom NAND Glied von Ausgang Q2 ein HIGH gesetzt. Der Ausgang des NAND Glied schaltet von HIGH in LOW und das Signal kann weiter verarbeitet werden.

Ich hoffe dass jemand etwas damit anfangen kann und mir weiterhelfen kann.

Gruß BJS
Was machen Bits am liebsten? - Bus fahren

agmue

#66
Apr 20, 2017, 06:22 pm Last Edit: Apr 20, 2017, 06:24 pm by agmue
Ich hoffe dass jemand etwas damit anfangen kann und mir weiterhelfen kann.
Da bin ich mir nicht sicher, aber ich mache einen Versuch:
  • Wenn A (t1) oder B (t2) gedrückt wird, gehen Q1 und Q2 HIGH.
  • Wenn A nach B gedrückt wird, geht Q1 LOW.
  • Wenn B nach A gedrückt wird, geht Q2 LOW.

Code: [Select]
const byte t1Pin = 2, t2Pin = 3, Q1pin = 12, Q2pin = 13;
bool t1alt, t1akt, t2alt, t2akt, Q1, Q2;

void setup() {
  Serial.begin(9600);
  Serial.println("Test");
  pinMode(t1Pin, INPUT_PULLUP);
  pinMode(t2Pin, INPUT_PULLUP);
  pinMode(Q1pin, OUTPUT);
  pinMode(Q2pin, OUTPUT);
  t1akt = digitalRead(t1Pin);
  t2akt = digitalRead(t2Pin);
  t1alt = t1akt;
  t2alt = t2akt;
}
void loop() {
  t1alt = t1akt;
  t2alt = t2akt;
  t1akt = digitalRead(t1Pin);
  t2akt = digitalRead(t2Pin);
  if ((!t1alt && t1akt) || (!t2alt && t2akt)) {
    delay(100);  // Entprellen
    Q1 = LOW;
    Q2 = LOW;
  }
  if (!t1alt && t1akt && t2alt && t2akt) {
    delay(30);  // Entprellen
    Q1 = HIGH;
  }
  if (!t2alt && t2akt && t1alt && t1akt) {
    delay(30);  // Entprellen
    Q2 = HIGH;
  }
  digitalWrite(Q1pin, !Q1);
  digitalWrite(Q2pin, !Q2);
}

Beim betätigen von Taster A und gleichzeitig Taster B ...
"Gleichzeitig" gibt es praktisch nicht, nur innerhalb einer Zeitspanne geht.

BJS-1952

Hallo agmue,

danke für deine Bemühungen.

Bei deinem Sketch wechseln die Ausgänge bei einmal betätigen der Taster A oder B.

Ich versuche nochmals die Schaltung zu erklären.

Die Ausgänge Q1 und Q2 sind auf HIGH Level. Beim Betätigen von Taster A oder Taster B wird an den NAND Gliedern von Ausgang Q1 und Q2 jeweils an einem Eingang ein HIGH gesetzt. Beim loslassen des Tasters geht der HIGH Level auf LOW und bei keinen der Ausgänge passiert etwas. Beim betätigen von Taster A und danach Taster B wird zuerst je an einen der Eingängen der NAND Glieder von Ausgang Q1 und Q2 ein HIGH gesetzt und dann beim zweiten Eingang vom NAND Glied von Ausgang Q2 ein HIGH gesetzt. Der Ausgang des NAND Glied schaltet von HIGH in LOW und das Signal kann weiter verarbeitet werden. Beim loslassen der Taster gehen beide Ausgänge wieder in HIGH Level.

Die Schaltung kann man mit der Booleschen Algebra lösen. Ich habe vor 23 Jahren einen Abendkurs darüber besucht, leider reichen meine Kenntnisse nicht mehr aus, um die Schaltung damit umzusetzen.

Bitte lass dich nicht entmutigen und mach weiter.

Danke 
Gruß BJS
Was machen Bits am liebsten? - Bus fahren

ElEspanol

Dann korrigiere mal die Tabelle mit den Tastern.

Was soll den nun passieren, wenn beide Tasten gedrückt sind? 1 0 oder 0 1 ?

BJS-1952


Was soll den nun passieren, wenn beide Tasten gedrückt sind? 1 0 oder 0 1 ?

[/quote]

wenn zuerst Taster A und danach Taster B gedrückt werden I 0
wenn zuerst Taster B und danach Taster A gedrückt werden 0 I
Was machen Bits am liebsten? - Bus fahren

Doc_Arduino

#70
Apr 21, 2017, 03:57 pm Last Edit: Apr 21, 2017, 04:25 pm by Doc_Arduino
Hallo,

die Wahrheitstabelle #65 ist fehlerhaft.

Laut meiner Logik sollte man auf diese Wahrheitstabelle kommen. Am Ende wird der Tasterzustand immer komplett negiert.
Code: [Select]
B A   | Q1 Q2
---------------------------
0 0   | 1 1
0 1   | 0 1
1 0   | 1 0
1 1   | 0 0


Tschau
Doc Arduino '\0'

Messschieber auslesen: http://forum.arduino.cc/index.php?topic=273445
EA-DOGM Display - Demos: http://forum.arduino.cc/index.php?topic=378279

agmue

Sind die Taster wirklich Öffner?
Ich habe die als Schließer angesehen :smiley-confuse:

Doc_Arduino

Ich habe die als Schließer angesehen :smiley-confuse:
sorry, ist egal, spielt bei der Wahrheitstabelle keine Rolle, man muss eh immer alles betrachten. War eine dumme Frage von mir. Habs oben korrigiert und ergänzt.
Tschau
Doc Arduino '\0'

Messschieber auslesen: http://forum.arduino.cc/index.php?topic=273445
EA-DOGM Display - Demos: http://forum.arduino.cc/index.php?topic=378279

BJS-1952

Hallo

Danke für Euer reges Interesse.

Muss bei der Wahrheitstabelle nicht auch der Zwischenzustand mit berücksichtigt werden?
 
Beim betätigen von einem Taster  werden bei jeden der beiden Ausgangs NAND ein Eingang auf HIGH gesetzt. Muss dies nicht auch mit in die Wahrheitstabelle aufgenommen werden?
Meine Kenntnisse sind leider zu gering, um zu behaupten dass meine Wahrheitstabelle richtig ist. Sollte mehr als Denkanstoß dienen.

Gruß BJS
Was machen Bits am liebsten? - Bus fahren

Doc_Arduino

#74
Apr 21, 2017, 07:15 pm Last Edit: Apr 21, 2017, 07:17 pm by Doc_Arduino
Hallo,

ich weiß noch nicht was du mit Zwischenstand genau meinst. Du hast keinerlei Verriegelung in der Schaltung worauf irgendein Taster Vorrang hätte.

Quote
Beim betätigen von einem Taster  werden bei jeden der beiden Ausgangs NAND ein Eingang auf HIGH gesetzt.
Für diese spezielle Frage wäre es gut zu wissen ob deine Taster wirklich Öffner oder doch vielleicht Schließer sind?
Ich gehe mal davon aus das es Öffner sind, laut der Beschreibung und Plan. Dann stimmt das.
Wenn A gedrückt (0) ist Q1 auf jeden Fall (1). Egal was an B los ist.
Wenn B gedrückt (0) ist Q2 auf jeden Fall (1). Egal was an A los ist.

Merke.
Sobald am NOR auch nur ein Eingang (1) sieht, dann ist der Ausgang auf jeden Fall (0).
Sobald am NAND auch nur ein Eingang (0) sieht, dann ist der Ausgang auf jeden Fall (1).


Tschau
Doc Arduino '\0'

Messschieber auslesen: http://forum.arduino.cc/index.php?topic=273445
EA-DOGM Display - Demos: http://forum.arduino.cc/index.php?topic=378279

Go Up