ARDUINO Zugerkennung
Identifikation mittels RFID und Bahnsteigsanzeige, ein Prinzip-Beispiel
RFID = R
adio-Frequency-IDentification

Es gibt die unterschiedlichsten Verfahren, wie Zugerkennungen auf einer Modellbahnanlage realisiert werden können:
Systeme wie Infrarot (IR), Barcode, oder Transponder (RFID). Letzteres wird hier unser Thema sein.
Auf die auf dem Markt angebotenen Systeme und Hersteller möchte ich hier nicht eingehen. Vielmehr soll es Ziel sein, ein eigenes, preisgünstiges, individuelles, leicht einbaubares System (auch in einer bereits bestehenden Anlage integrierbar) zu entwickeln.
Im ersten Schritt ein "autarkes" System. Mit geeigneten kleinen Displays kann damit eine automatische Zuganzeige an Bahnsteigen (H0) gebaut werden, oder es dient als Anzeige in einem Gleisbildstellwerk.
Im zweiten Schritt, das ist momentan noch Zukunftsmusik, werde ich mir überlegen, wie ein solches System mit dem Train Controller (TC) verbunden werden kann.

Die nachfolgend dargestellte Schaltung beschreibt Aufbau und Programm. Mittels 2 Transponder (auch Tags genannt) können 2 Züge (Loks) erkannt werden und jeweils eine entsprechende Anzeige auf einem Display sowie auf dem Bildschirm eines PCs ausgegeben werden. Dies stellt noch keine Beschreibung dar, wie dies in einer Modellbahnanlage aufzubauen ist (Hinweise dazu später); vielmehr soll Schaltungsaufbau und Programmierung mit einem Arduino beschrieben werden.

Erforderliche Bauteile:

ARDUINO MEGA
Steckbrett (Breadboard)
einige Kabelverbinder und Steckbrücken
(einfacher Schaltdraht ist auch geeignet)

RFID Modul mit zwei Tags

beispielsweise über amazon zu beziehen
Stand: Juni 2016
SSD1306 128x32 SPI OLED Display


beispielsweise über amazon zu beziehen
Stand: Juni 2016
+ wenige Bauteile:

Der Schaltungsaufbau:



Hier wirde noch zusätzlich ein ARDUINO-MEGA-Shield auf den ARDUINO MEGA aufgesteckt. Nicht erforderlich, aber praktisch, wenn man den Schaltungsaufbau nicht abbauen möchte, den MEGA aber anderweitig verwenden möchte, dann das Shild einfach vom MEGA trennen.

 

Bedienung:
Tags (1;2) vor die RFID-Antenne halten: entsprechende Anzeige erfolgt automatisch
Manuelle Bedienung: Taster A, erste Anzeige erfolgt. Taste B, zweite Anzeige erfolgt. Taster A und B gleichzeitig drücken und die Anzeige wird gelöscht


Der Sketch (Das Programm) für ARDUINO MEGA(!):

// HJB-Zugerkennung_RFID_Zuganzeige_OLED128x32SPI_MEGA   Juni 2016
// ARDUINO MEGA COM 13
// HJB-Zuganzeige_OLED128x32SPI
// Zuganzeige (Bahnsteigsanzeige)
// Taster Digital I/O Monitor mit OLED-Display
// nach Programmstart bitte den Serial-Monitor zur Anzeige auf dem PC starten!

// =================================================================
// _________________________________________________________________
// DEFINITIONEN OLED-Display
#include <SPI.h>
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
// If using software SPI (the default case):
#define OLED_MOSI   9
#define OLED_CLK   10
#define OLED_DC    11
#define OLED_CS    12
#define OLED_RESET 13
Adafruit_SSD1306 display(OLED_MOSI, OLED_CLK, OLED_DC, OLED_RESET, OLED_CS);
/* Uncomment this block to use hardware SPI
#define OLED_DC     6
#define OLED_CS     7
#define OLED_RESET  8
Adafruit_SSD1306 display(OLED_DC, OLED_RESET, OLED_CS);
*/

#define NUMFLAKES 10
#define XPOS 0
#define YPOS 1
#define DELTAY 2
// Define Taster
int A = 7; // definiert I/O-Eingang 2 als Ganzzahl f
uer die Variable A
int B = 8; // definiert I/O-Eingang 3 als Ganzzahl f
uer die Variable B
int TaA; // Variable zum Speichern des Eingangssignals als Ganzzahl (Taste A)
int TaB; // Variable zum Speichern des Eingangssignals als Ganzzahl (Taste B)
// Define Start
int Start;
// _________________________________________________________________
// DEFINITIONEN RFID
#include <SPI.h>
#include <MFRC522.h>
#define SS_PIN 53
#define RST_PIN 5
MFRC522 mfrc522(SS_PIN, RST_PIN);
//==================================================================
// SETUP-ROUTINE (wird nur einmal beim Programmstart durchlaufen)
// _________________________________________________________________
// OLED-Display
void setup()
{
// für OLED-Display
Serial.begin(9600);
  // by default, we'll generate the high voltage from the 3.3v line internally! (neat!)
display.begin(SSD1306_SWITCHCAPVCC);
  // init done
  // Show image buffer on the display hardware.
  // Since the buffer is intialized with an Adafruit splashscreen
  // internally, this will display the splashscreen.
  //display.display(); // schreibt "adafruit"
  //delay(2000);
  // Clear the buffer.
  display.clearDisplay();
// für Taster
    pinMode(A, INPUT); // definiert den Pin f
uer Taste A als Eingang
    pinMode(B, INPUT); // definiert den Pin f
uer Taste B als Eingang
    Serial.begin(9600); // definiert die serielle Schnittstelle mit der Baudrate 9600
// Anfangsvariable für Start setzen
Start=0;   
// _________________________________________________________________
// RFID
Serial.begin(9600);
SPI.begin();
mfrc522.PCD_Init();
pinMode (2, OUTPUT);

pinMode (3, OUTPUT);
// _________________________________________________________________
}
//=================================================================
// HAUPTPROGRAMM (Programmablauf in einer Endlosschleife)
// _________________________________________________________________
// RFID
// Schleifen-Start
void loop()
{
// für Taster
    TaA=digitalRead(A); //
Uebergibt den gemessenen Wert am Digitaleingang 2 der Variablen TaA
    TaB=digitalRead(B); //
Uebergibt den gemessenen Wert am Digitaleingang 3 der Variablen TaB
    if(Start==0)
  {  
        Serial.write(27);
        Serial.println("[01;40H");
        Serial.println("            ");
        Serial.print("            ");
        display.setTextSize(1);
        display.setTextColor(WHITE);
        display.setCursor(0,0);
        display.println("Gleis 2           ");
        // display.setTextColor(BLACK, WHITE); // 'inverted' text
       display.println("------------------");
       display.setTextSize(2);
       display.setTextColor(WHITE);
       display.setTextColor(BLACK, WHITE); // 'inverted' text
       display.println("         ");
       display.display();
       delay(500);
      
display.clearDisplay();
  }
  // Ende 1-maliger Durchlauf beim Start, setzt Display in den Anfangszustand
     Start=1;
     if(TaA==1 & TaB==0)
    {
      Serial.write(27);
     
Serial.println("[01;40H");
      Serial.print("Gleis 2"); // Text auf Monitor, wenn Ta A gedr
ueckt ist
      Serial.println("  P23");
      Serial.print("Pasing");
      // OLED-Display
      display.setTextSize(1);
      display.setTextColor(WHITE);
      display.setCursor(0,0);
      display.println("Gleis 2       P 23");
      // display.setTextColor(BLACK, WHITE); // 'inverted' text
      display.println("------------------");
      display.setTextSize(2);
      display.setTextColor(WHITE);
      display.setTextColor(BLACK, WHITE); // 'inverted' text
      display.println(" Pasing  ");
      display.display();
      delay(500);
      display.clearDisplay();
    }
    if(TaA==0 & TaB==1)
   
{
      Serial.write(27);
      Serial.println("[01;40H");
      Serial.print("Gleis 2"); // Text auf Monitor, wenn Ta A gedr
ueckt ist
      Serial.println("  D64");
      Serial.print("Hamburg");
      display.setTextSize(1);
      display.setTextColor(WHITE);
      display.setCursor(0,0);
      display.println("Gleis 2       D 64");
     // display.setTextColor(BLACK, WHITE); // 'inverted' text
     display.println("------------------");
     display.setTextSize(2);
     display.setTextColor(WHITE);
     display.setTextColor(BLACK, WHITE); // 'inverted' text
     display.println(" Hamburg ");
     display.display();
     delay(500);
     display.clearDisplay();
    }
    if(TaA==1 & TaB==1) // löscht Anzeige auf dem Monitor
    {
      Serial.write(27);
      Serial.println("[01;40H");
      Serial.println("            ");
      Serial.print("            ");
      display.setTextSize(1);
      display.setTextColor(WHITE);
      display.setCursor(0,0);
      display.println("Gleis 2           ");
     // display.setTextColor(BLACK, WHITE); // 'inverted' text
     display.println("------------------");
     display.setTextSize(2);
     display.setTextColor(WHITE);
     display.setTextColor(BLACK, WHITE); // 'inverted' text
     display.println("         ");
     display.display();
     delay(500);
    
display.clearDisplay();
    }
    delay(500); // verz
oegert, bis ein neuer Wert angezeigt werden kann
    Serial.print('\r');
// Schleifen-Ende und R
uecksprung zum Schleifen-Start
// _________________________________________________________________
// RFID
if ( ! mfrc522.PICC_IsNewCardPresent())
{
return;
}
if ( ! mfrc522.PICC_ReadCardSerial())
{
return;
}
long code=0;
for (byte i = 0; i < mfrc522.uid.size; i++)
{
code=((code+mfrc522.uid.uidByte[i])*10);
}
Serial.print("Die Kartennummer lautet:");
Serial.print(code);
Serial.print('\r'); // an den Zeilenanfang
if (code==1841530)
{
digitalWrite (2, HIGH);
delay (2000);
digitalWrite (2, LOW);
}
 if (code==1734830)
{
digitalWrite (3, HIGH);

delay (2000);
digitalWrite (3, LOW);
}
// _________________________________________________________________
}
 


COM hängt von Ihrer Installation ab (muss nicht 13 sein!)



Beachte, dass der Monitor in der Arduino IDE kein vollwertiges ANSI/VT100 Terminal ist; die Anzeige wird damit auf dem Bildschirm nicht wunschgemäß dargestellt!
Siehe Informationen unter:
Grundlagen.| Grundlagen der Programmierung































MFRC522.h Library ist zu Importieren (siehe Download)


















































Die Anzahl von Leerzeichen hängen davon ab
aus wie vielen Buchstaben der längste Anzeigetext besteht!
Hier als Beispiel "Hamburg".



















"Gleis2"  kann individuell geändert werden
" P23"    kann individuell geändert werden
"Pasing" kann individuell geändert werden










"Pasing" kann individuell geändert werden














"Gleis 2       D 64" kann individuell geändert werden





" Hamburg " kann individuell geändert werden













"Gleis 2           " kann individuell geändert werden



























Sie werden nicht die gleichen 2 Tags besitzen, wie sie bei diesem
Sketch verfügbar waren, daher lassen Sie das Programm beim
ersten Mal
laufen, halten Ihre Tags vor die Antenne und
merken sich die jeweils angezeigten CODE!
Diesen Code müssen Sie dann
<=  hier in die Zeile if(code==CODE) eintragen [Code 1.Tag]
statt 1841530



<= hier in die Zeile if(code==CODE) eintragen [Code 2.Tag]
statt 1734830

danach den Sketch neu speichern und ARDUINO neu starten!



 

Obiger Sketch ist leicht für mehr als 2 Tags (also Züge oder Loks) erweiterbar, sowie die Hardware, wenn man möchte, zur manuellen Bedienung mit weiteren Eingängen für Taster, zu erweitern.

Für diese Schaltung ist nicht zwingend ein ARDUINO MEGA erforderlich, ein ARDUINO UNO tut es auch.
Dazu muss allerdings der Aufbau und der Sketch angepasst werden, siehe Hinweise weiter unten!

Hier soll lediglich das Prinzip mittels einer Testschaltung vermittelt werden.

Das in dieser Schaltung verwendete RFID-MODUL und auch die Tags sind nicht zum Einbau in eine H0-Anlage geeignet:
RFID-Sender/Empfäger ist nicht von der Antenne trennbar und die Tags sind zu groß zum Einbau.

Weiter führende Hinweise folgen am Ende dieses Artikels.
 

Pin-Belegung und Anschlüsse des RFID-Moduls an ARDUINO-MEGA und ARDUINO-UNO:

Pin-Nr. RFID-RC522
Pin-Belegung
Anschlüsse für
ARDUINO MEGA
Anschlüsse für
ARDUINO UNO
1 SDA 53 10
2 SCK 52 13
3 MOSI 51 11
4 MISO 50 12
5 IRQ unbelegt unbelegt
6 GND GND GND
7 RST 5 9
8 3,3V 3,3V 3,3V
Verwendet man einen ARDUINO-UNO, so muss außer der Pin-Belegung der Hardware auch der Sketch entsprechend angepasst werden!

 

Im Download enthalten:
1. HJB-Zugerkennung_RFID_MEGA (ARDUINO-Sketch)
2. fritzing, mit Steckplatine (Aufbau) und Code (Sketch)
3. rfid-master, beinhaltet Library MFRC522.h, Beispiele, und Doku
inklusive der entsprechenden Ordner
DOWNLOAD Es wird empfohlen in den Arbeitsordner des ARDUINOs zu entpacken.
Danach ist zuerst die Library einzubinden

 

VIDEO

Wenn alles korrekt durchgeführt wurde, sollte das Ergebnis wie im VIDEO gezeigt aussehen.


Weiter führende Hinweise zum Thema RFID

Möchte man mittels RFID-Zugerkennung eine Modellbahnanlage ausstatten, so sind RFID-Sende-/Empfangsantennen im Gleisbett zu positionieren und zwar so, dass ein unter der Lok (Zug, oder Wagon) angebrachter Tag einen äußerst geringen Abstand beim Überfahren zur Sende-/Empfangsantenne hat. Aus diesem Grund wird man (insbesondere bei H0, oder kleiner) Sende-/Empfangsantennen getrennt von der RFID-Elektronik verbauen müssen. Es sind also RFID-Module zu beschaffen, die eine Trennung der Elektronik zur Sende-/Empfangsantenne gestatten. Sende-/Empfangsantennen kann man sich sehr leicht passend für sein Gleisbett herstellt; ein Hinweis dazu finden Sie im unten stehenden Kasten. Auch im Internet sind genügend Informationen dazu zu finden.
DIMO Heft 1-2015, Seite 64 RFID-Antenen bauen für die Modellbahn http://www.vgbahn.de/dimo.php4
Teil 2 bis 4 in den Heften 2-2015 bis 4-2015 nicht zwingend für unser Thema hier erforderlich  
     
     

 

 

zurück zu ARDUINO