bestimmter Sensor und/oder Hilfe gesucht

Hallo,

In meiner Familie wird eine große Modellbahn Spur G betrieben. In der Vorweihnachtszeit werden zwei Platten in einer Metallbauwerkstatt miteinander verbunden auf welchen dann mehrere Züge digital gesteuert Ihre Wege abfahren. Die Anlage ist inzwischen so groß das die digitale Steuerung an ihren Grenzen angekommen ist. Wir möchten gerne einen weiteren unabhängigen Kreis mit einem Zug aufbauen. Dieser Zug soll starten wenn ein Zug der Anlage einen bestimmten Streckenabschnitt passiert. Auf diesem Streckenabschnitt fahren aber auch andere Züge.

Ich möchte also einen Schalter auslösen wenn ein bestimmter Zug auf einem bestimmten Gleis fährt auf dem auch andere Züge fahren.

Ich bin auf der Suche nach einem Sensor der diesen Zug erkennt. Lichtschranken sind nicht möglich, Da ja auch anderes Züge fahren. Leuchtende Auslöser oder Empfänger sollten es auch nicht sein da es eine Anlage mit Dampfloks ist und alle möglichen Lichter zum Thema passen sollten. Ich habe unter anderem schon bei Rundenzählern für RC Rennen geschaut. Das erscheint mir aber zu komplex.

Hat jemand hier eine Idee wie ich das lösen könnte, wo ich Ich nach Ideen stöbern kann oder weiß einen entsprechenden Sensor/Auslöser?

Zu mir: Ich spiele jetzt schon einige Zeit mit Den Arduino Nano rum. Habe ein Einsteigerset durchgearbeitet und eine Bewässerungsanlage für eine Pflanzen entworfen. Ich hätte vorher keinerlei Kenntnisse von Programmieren oder Elektronik und muss mir knapper Zeit alles erst erarbeiten. Ich bin also noch ganz am Anfang.

Viele Grüße
Thilo

Hoplost:
Ich möchte also einen Schalter auslösen wenn ein bestimmter Zug auf einem bestimmten Gleis fährt auf dem auch andere Züge fahren.

Wenn dieser Zug einen kleinen Magneten hat, der einen Reedkontakt im Gleis betätugt, könnte diese Information ausgewertet werden. Im Prinzip wie die Einbruchkontakte an Fenstern.

Damit willkommen im Forum.

wenn du jetzt schon digital fährst (welches System), sollte dann nicht eine Erkennung des fahrenden Zuges bereits über den Lokdecoder möglich sein?
Ansonsten fallen mir noch NFC-Sticker/Transponder ein die man unter der Lok anbringen könnte und über ein NFC-Shield fahren lässt.

Die Züge haben zum auslösen vorhandener Reed- Kontakte alle Magneten untergeklebt. Es würden also alle Züge auslösen.
Ich selber fahre die Bahn nicht und habe bisher eher Häuser und so gemacht. Ich habe es immer so verstanden das die Züge über bestimmte Reed-Kontakte fahren und damit bestimmte Weichen/Signale auslösen. Digital werden über den Fahrstrom wohl die Züge angesprochen und deren Geschwindigkeit gesteuert.
Es ist das PIKO-system.
Ich bin eher angesprochen worden, ob es nicht möglich wäre mit dem Arduino den einzelnen Kreis anzusprechen. --- Aber eben nur wenn eine bestimmte Lock über ein bestimmtes Gleis fährt. ( Ansonsten ist für zwei Minuten in diesem Bereich der Anlage einfache keine Aktivität. So bewegt sich wenigstens der eine Zug.)

Bei meiner H0-Bahn benutze ich RFID-Tags um die Züge individuell erkenne zu können. Unter der Lok ist ein Transponder:

und im Gleis die Antenne:
.
Bei G hast Du ja noch deutlich mehr Platz, da sollte das auch möglich sein.

Aber auch die Lösung mit einem Magneten könnte funktionieren. Bei der Breite der G-Gleise müsste es doch möglich sein, für deinen speziellen Zug den Magnet und das Reedrelais so zu positionieren, dass es nur von diesem einen Zug ausgelöst wird.

Das ist interessant. Ich hätte da nur kurz zu gelesen, Da ich es so verstanden habe das diese Technik zu langsam ist um einen fahrenden Zug zu erkennen. Nutzt Du bestimmte Transponder und Antennen?

wie viele m/s fahren deine schnellsten Züge?

Kann das "PIKO-System" die Züge erkennen?

Die Geschwindigkeit haben wir nicht gemessen. Es gibt normal und halb normal. Ich schlage es mal nach.
Die Züge werden über den Fahrstrom angeschlossen. Ob sie eine Rückmeldung geben ist mir unbekannt.

Hoplost:
Da ich es so verstanden habe das diese Technik zu langsam ist um einen fahrenden Zug zu erkennen.

Da der Transponder keine Batterie hat, wird das Magnetfeld der Antenne genutzt. Wenn das Magnetfeld also lange genug den Transponder erreicht, funktioniert das. Eine längliche Antennenform könnte daher hilfreich sein.

Hi

Ein RFID-Tüföffner mit Code-Schloss und 10 Transponder als Schlüsselanhänger (125kHz) gibt's beim Freundlichen für um die 10€ - die Antenne hat einen Durchmesser von 8...10cm.
Hier hat der eingelernte Chip die Aufgabe, den Türöffner (natürlich an der Platine selber, mit etwas Gewalt von Außen erreichbar ...) zu betätigen.
Module für den Arduino und gleicher Frequenz gibt's auch für den Arduino - dort sind die Antennen aber wesentlich kleiner - kA, ob man diese Antennen untereinander einfach tauschen könnte oder gar eine Eigene unter das Gleis wickeln kann (und ... darf), um auf mehr 'Erkennungs-Gleislänge' zu kommen.
Von der Erkennungszeit ... direkt würde ich sagen, hätte bisher aber auch nur den Tag vor den Sensor gehalten ohne großartig auf die Latenz zu achten.

Es gibt verschiedene RFID-Frequenzen - ob bei höheren Frequenzen auch schneller gelesen werden kann - würde logisch klingen, dann gibt's Da aber auch wohl mehr mögliche Daten, Die man hinterlegen kann.

Kenne selber nur die 125kHz-Dinger, Die haben ausschließlich Ihre ID gespeichert.

MfG

Hoplost:
Das ist interessant. Ich hätte da nur kurz zu gelesen, Da ich es so verstanden habe das diese Technik zu langsam ist um einen fahrenden Zug zu erkennen. Nutzt Du bestimmte Transponder und Antennen?

Ich nutze 125kHz Transponder und einen Antenne von Towitek ( gab's beim Conrad ). Das Ganze arbeitet bei mir jetzt schon seit 9 Jahren problemlos. Inzwischen dürfte es da andere HW ( Antennen ) geben, das Prinzip ist aber das Gleiche.
Was die Geschwindigkeit angeht ist H0 natürlich absolut gesehen deutlich langsamer als G. Da müsste man einfach mal ein paar Versuche machen. So teuer ist das Zeug ja mitllerweile nicht mehr.

Wenn es aber wirklich nur um einen Zug geht, würde ich doch mal versuchen, ob man da nicht einen Magnet so anbringen kann, dass er sich mit den Magneten der anderen Züge nicht in die Quere kommt.

Hallo,
Vielen Dank.
Ich werde mich mal in die RFID einlesen. Scheint mir interessanter als der Magnetschalter und lässt Raum für weitere Ideen.
Gruß Thill

Hi

Hoplost:
Ich werde mich mal in die RFID einlesen. Scheint mir interessanter als der Magnetschalter und lässt Raum für weitere Ideen.

Na super … wieder Einer angefixt :slight_smile:
Dann möchte ich Dir viele kurzweilige Stunden beim ‘Spielen’ wünschen und nur wenige wohl langweiligere Stunden beim Debuggen :slight_smile:

MfG

Haha!
Dankeschön!

RFID hat aber trotzdem einen Nachteil, die Reichweite zwischen Sender/Empfänger und Tag.
Da musst du für deine Spur G Eisenbahn, schon eine gute Antenne kaufen.
Die üblichen 1cm Entfernung dürften da nicht ausreichen. :wink:

Diese packt max. 60cm Reichweite. sowas würde ich empfehlen. Zur not selbst bauen wenn sie zu teuer ist.

Haha,
Dankeschön. Das ist für Platzierung in den Gleisen etwas groß.

Ich habe mich etwas in die 125khz-Tematk eingelesen und jetzt auch ein rdm6300-Modul hier zum testen.
Ich habe auch das hier im Forum gefunden

Im vierten Beitrag ist ein Demo-Sketch von “jurs”.
Ich habe diesen hier nur leicht modifiziert um mein jetziges Problem darzustellen.

// RFID demo sketch by "jurs" for Arduino Forum Deutsch

// start text character
#define STX 2
// end text character
#define ETX 3

// buffer to hold the last code read from Serial
char rfidBufferLastRead[13];

boolean readRFID() 
{
  if (!Serial.available()) return(false); // nothing available to read
  char rfidBuffer[13];
  char c=0;
  int i=0;
  memset(rfidBuffer,0,sizeof(rfidBuffer)); // clear receive buffer
  delay(50); // wait for code to appear in the Serial input buffer
  while (Serial.available()&& c!=STX) // watch out for start of text character
    c=Serial.read();
  while (Serial.available()&& i<12 && c!=ETX) // watch out for end of text character
  {
    c=Serial.read();
    rfidBuffer[i] = c;
    i++;
  }
  if (i!=12) return(false); // less than 12 characters read from Serial
  if (Serial.available()) c=Serial.read();
  if (c!=ETX) return(false);
  strncpy(rfidBufferLastRead,rfidBuffer,sizeof(rfidBuffer)); // copy into global variable rfidBufferLastRead
  return(true); // if we reach this line, we have read 12 digits from Serial
}


void setup()
{
  Serial.begin(9600);
  Serial.println("waiting for RFID...");
}

void loop()
{
  if (readRFID())
  {
    if (strcmp(rfidBufferLastRead,"6C00679D1F89")==0)
        {
        Serial.println("lok 1");
        delay(3000);      //Hier eine zusätzliche Wartezeit
        }
    else if (strcmp(rfidBufferLastRead,"123456789012")==0)
      Serial.println("Hello Bill!");
    else if (strcmp(rfidBufferLastRead,"800C4C028042")==0)
      Serial.println("Hello Bob!");
    else 
    {
      Serial.print("Fuck off! ");  
      Serial.println(rfidBufferLastRead);
    }  
  }
}

Im loop-Bereich wird mein rfid-Tag erkannt und ich habe ein relay von 3 Sekunden eingefügt.
Wenn ich das Programm starte und Tag rund ein bis zwei Sekunden an die Antenne halte wird dieser erkannt. Der Text erscheint im Seriellen Monitor und nach drei Sekunden eben noch einmal … und noch einmal … und noch einmal. Bis das sieben oder acht mal erschienen ist. Das dauert so knapp 20 Sekunden.

Wenn ich statt des delay ein Relais ansteuerte, das zum Beispiel für eine Minute einen Stromfluss unterbrechen soll, wird das auch mehrmals ausgelöst.

Ich möchte gerne das Relais nur einmal auslösen und erst wenn der Tag wieder im Eingangsbereich ist ein weiteres mal.
Ich hoffe ich habe mich verständlich ausgedrückt.

Hoplost:
... Wenn ich statt des delay ein Relais ansteuerte ...

Was ist in diesem Zusammenhang ein Delay, wenn es kein Relais mit Tippfehler ist?!

Gruß

Gregor

Hallo Gregor,
Das war, von mir, schlecht dargestellt.

In dem geposteten Beispielcode nutze ich den delay-Befehl um es anschaulich darzustellen.

Auf meiner Modellbahn soll bei erkennen des richtigen rfid-Tag, also der richtigen Lok, nach einer Verzögerung die Stromzufuhr, für rund eine Minute, unterbrochen werden um ein Pendelbetrieb für eine andere Lok auszulösen. Im Beispielcode sähe das dann ungefähr so aus.

// RFID demo sketch by "jurs" for Arduino Forum Deutsch

// start text character
#define STX 2
// end text character
#define ETX 3

int relaisPin = 5;

// buffer to hold the last code read from Serial
char rfidBufferLastRead[13];

boolean readRFID()
{
  if (!Serial.available()) return(false); // nothing available to read
  char rfidBuffer[13];
  char c=0;
  int i=0;
  memset(rfidBuffer,0,sizeof(rfidBuffer)); // clear receive buffer
  delay(50); // wait for code to appear in the Serial input buffer
  while (Serial.available()&& c!=STX) // watch out for start of text character
    c=Serial.read();
  while (Serial.available()&& i<12 && c!=ETX) // watch out for end of text character
  {
    c=Serial.read();
    rfidBuffer[i] = c;
    i++;
  }
  if (i!=12) return(false); // less than 12 characters read from Serial
  if (Serial.available()) c=Serial.read();
  if (c!=ETX) return(false);
  strncpy(rfidBufferLastRead,rfidBuffer,sizeof(rfidBuffer)); // copy into global variable rfidBufferLastRead
  return(true); // if we reach this line, we have read 12 digits from Serial
}


void setup()
{
  Serial.begin(9600);
  Serial.println("waiting for RFID...");
}

void loop()
{
  if (readRFID())
  {
    if (strcmp(rfidBufferLastRead,"6C00679D1F89")==0)
        {
        Serial.println("lok 1");
        delay(3000);      //Hier eine zusätzliche Wartezeit bis das Relais auslöst
        digitalWrite(relaisPin, HIGH); // Relais am Pin 5 auslösen
        delay(60000); // eine Minute warten
        digitalWrite(relaisPin, LOW);
        }
    else if (strcmp(rfidBufferLastRead,"123456789012")==0)
      Serial.println("Hello Bill!");
    else if (strcmp(rfidBufferLastRead,"800C4C028042")==0)
      Serial.println("Hello Bob!");
    else
    {
      Serial.print("Fuck off! "); 
      Serial.println(rfidBufferLastRead);
    } 
  }
}

Auch hier wird das Relais aber mehrmals angesprochen.
→ Ich halte den Tag an in den Empfangsbereich. Ein bis Zwei Sekunden
→ Der Tag wird, in dieser Zeit, mehrmals erkannt – z.B. acht mal.
→ das Relais wird acht mal hintereinander ausgelöst.

Ich möchte einen RFID-Tag-Aufkleber unter die Lok kleben und die Antenne ins Gleisbett legen. Die Lok überfährt dann die Antenne und der Tag wird erkannt und löst das Relais aus.
Ich kann nicht steuern, wie oft der Tag erkannt wird, möchte das Relais bei einer Überfahrt aber nur einmal auslösen.

Ich hoffe das war verständlicher
Gruß
Thilo

Ich habe den Eindruck, Du möchtest eine Schrittkette (= finite state machine = endlicher Automat) programmieren.

Hallo,

Das müsste ich erst einmal googeln :).
Da bin ich unsicher.
Eigentlich möchte ich nur erreichen das bei erkennen der lok das Relais nur einmal ausgelöst wird. Der Arduino scheint sich aber irgendwie zu merken wie oft er den Rfid-Tag hintereinander erkannt hat. So oft läuft er dann schön sein Programm ab.

Evtl. Besteht ja die Möglichkeit den Arduino nach auslösen des Relais auszuschalten und gleich wieder ein.

Gruß Thilo