RFID Weitbereichsleser RS485

Hallo,

habe aktuell folgendes Problem.

Ich nutze ein Arduino Mega 2560

Folgender Beispielcode:

/*
 Einfacher RFID Sketch fuer Itead Studio RDM6300 RFID-Leser
 Liest und zeigt RFID Chips/Tags Typ EM4100 125 kHz

 Rev. 0.2 2012-10-07
 fribbe fuer http://macherzin.net

Rev. 06.02.2014 Tonno
*/

const int startZeichen = 02; // Chip-Kennung beginnt mit 02
const int endeZeichen = 03; // ASCII CR bendet Code
const int kennungLaenge   = 10; // Laenge Chip-Code 10 ASCII-Zeichen
const int gesamtKennungLaenge = 12; // Code-Laenge + Start- und Ende-Bytes
boolean gelesen = 0;
char chip[kennungLaenge + 1];  // fuer den Code und abschliessende Null
int bytesGelesen = 0;

void setup()
{
  Serial.begin(9600); // initialisiere serielle Konsole
  Serial2.begin(9600); // initialisiere  seriellen Port
  Serial.println("RFID-Leser bereit ... ");
}

void loop()
{
  if (Serial2.available() >=  gesamtKennungLaenge) // wenn genug Zeichen eingegangen ...
  {
    if(Serial2.read() == startZeichen) // und das Startzeichen erkannt wurde ...
    {
      Serial.print("Start-Byte erkannt ... ");
      
      bytesGelesen = 0; // starten lesen, also Zaehler auf 0
      
      while(bytesGelesen < kennungLaenge)  // lese 10-stelligen Code
      {
        char zeichen = Serial2.read(); // lesen Zeichen
        Serial.print(zeichen); // zur Kontrolle 
        Serial.print(" ");
        
        if((zeichen == endeZeichen)) // suche nach Ende-Befehl
        {
         Serial.println("CR erkannt ...");
         break;
        }
        chip[bytesGelesen] = zeichen; // speicher Zeichen im Puffer
        bytesGelesen = bytesGelesen + 1; // ein Zeichen weiter
      }
      chip[bytesGelesen] = 0; // beende Zeichenkette
       
      Serial.print("RFID-Code ist: ");
      Serial.println(chip);
    }
  }  
}

Nachdem ich es geschafft habe mit solch einem RFID Modul: http://www.seeedstudio.com/depot/125Khz-RFID-module-UART-p-171.html erfolgreich RFID Tags auszulesen, wollte ich es nun mit folgender Antenne versuchen.

RFID Weitbereichsleser: http://www.conrad.de/ce/de/product/191527/TowiTek-RFID-Weitbereichsleser-TWT2015-Baustein-12-VDC

Da diese Antenne einmal Wiegand oder RS485 asugibt und ich das nicht ohne weiteres nutzen kann, habe ich mir ein Pegelumsetzer besorgt.

Pegelumsetzer: http://www.rss-systems.de/shop/mcu-tools/mcu-fertigmodule/ttl-rs232-rs485-usb-can/rs485-ttl-5v-dual-fm.php

Die Idee ist, dass dieser das RS485 Signal in ein RS232 Signal umsetzt - was ich dann an dem TX Pin abgreifen kann und in den RX Pin von meinem Mega führen kann.

Nur leider bekomme ich mit diesem Aufbau keine Auslesung der RFID Tags hin.

Hat jemand eine Idee woran es liegen könnte ?

grüße

hi,

ohne das jetzt genauer anzusehen: ACHTUNG !

RS232 bringt Deinen µC um. da sind 15V dran! da ist RS485 noch ungefährlicher. Du brauchst keinen 485 <> 232 - umsetzer, sondern einen MAX485 um 20Cent, um RS485 auf seriell umzusetzen.

gruß stefan

EDIT: ok, das ist kein RS232, was Du da hast, sondern TTL. das paßt.

EDIT2: falls das wichtig ist für Dich: der chip, der auf Deinem umsetzer drauf ist, frißt bis 50mA, während ein MAX485 nicht mal eins nimmt. also im dauereinsatz für privat....

noch ein gruß, noch ein stefan

Hi Stefan,

danke für die Antwort.

Ja ist TTL richtig - der Stromverbrauch spielt hier erstmal keine Rolle

Es geht erstmal darum mittels Arduino den Weitbereichsleser zu nutzen um die RFID Tags auszulesen

//EDIT: Ich habe das Signal welches vom RS485 → TTL Umsetzer ausgegeben wird mal mit einem Oszilloskop aufgenommen.
Bild ist im Anhang

Damit sollte sich ja was anfangen lassen. Allerdings bin ich absolut ratlos - weil selbst bei einer simplen Abfrage der Seriellen Schnittstelle nur wirr warr ausgegeben wird.

Hast du RX/TX vertauscht. RX vom Wandler an TX vom Arduino. TX vom Wandler an RX vom Arduino.

Die Leitungen müssen immer gekreuzt werden.

Gruß Der Dani

Also

TX vom Wandler habe ich an RX des Arduinos angeschlossen
den RX vom Wandler habe ich garnicht genutzt weil ich ja nur in eine Richtung gehen möchte

Muss ich denn im Software Code nichts beachten beim auslesen des umgewandelten RS485 Codes ?
Oder müsste es theoretisch mit genau dem gleichen Code funktionieren wie der vorherige Aufbau mit dem RFID Modul von Seedstudios ?

Bekomme im Serial Monitor Zeichenketten die im Grunde den gleichen Inhalt haben aber immer irgendwie anders verschoben sind z.B.

 þ ? þ  ø ~ `
þ  ø ~ `

Grüße

hi,

wenn Du die charcodes statt der zeichen anzeigen läßt, kommt auch keine klarheit in die sache?

weiß jetzt nicht, wie das in im serial monitor der IDE geht, aber in anderen monitoren wie zb HTerm kann man umschalten.

gruß stefan

Hi,

ich glaube fast nicht, da ich denke niemand Codiert seine Karten mit irgendwelchen Zeichen aus dem erweiterten ASCII Code.

Was ich auch einfach nicht verstehe ist, wie das RS485 Signal arbeitet, bzw. wie die Kartennummer von der Antenne Codiert wird und weitergeschickt wird.

In der Anleitung der Antenne von Conrad steht zwar ein kurzer Text drin, aber ich verstehe es nicht.

Ich dachte die Codierung wäre ähnlich dem der Seedstudio Antenne ...

hi, tonno,

ich glaube, Du mißverstehst da etwas. das erkennt man auch an Deinem ersten post, wo Du RS232 mit seriell gleichgesetzt hast. das kommt daher, weil im computerbereich RS232 praktisch mit “serieller schnittstelle” gleichgesetzt ist.

RS232 und RS485 beschreiben kein protokoll, nicht die art, wie daten logisch gesendet und empfangen werden.
es ist einfach eine art, wie signale elektrisch transportiert werden.

wenn ein gerät serielle datenübertragung nutzt, wird dort bestimmt, wie, also 7bit, 8bit, 9bit, stopbit usw. gesendet wird.

RS232 legt dann RX und TX auf eine leitung und diese wiederum auf zwei gleiche, eine die 0V oder 15V liefert, die andere genau entgegengesetzt 0V oder minus 15V, dadurch können im vergleich störungen minimiert und die leitungslängen vergrößert werden.

RS485 macht ähnliches im 5V-bereich.

wenn ein gerät seriell sendet und das über einen zb MAX485 leitet, kommt danach das übertragungskabel und danach wieder (umgekehrt) ein MAX485 und aus dem kommt das ursprüngliche serielle signal “raus”, das dann wieder über RX und TX in Deinen chip läuft.

die ganze RS485-geschichte hat also nichts mit der seriellen geschichte zu tun, sowenig wie es computer verändert, je nachdem, ob sie mit der bahn oder dem schiff kommen…

besser: je nachdem, ob Du Du den computer selbst aus kurzer distanz abholst, oder aus china kommen läßt. im zweiten fall brauchst Du zusätzliche hardware (ein containerschiff oder eben MAX485 bzw. konsorten).
gruß stefan

Wie hat denn der Eisebär laufen gelernt? Hatte es auch versucht, ging aber irgendwie nicht. Vielleicht bringst du es mir ja mal bei :D

Zu den komischen Ausgaben am Serial Monitor, welchen Sketch hast du beim RS485? Welche übertragungsrate hast du da eingestellt? Hatte ähnliches Phänomen, weiß aber nicht mehr woran es lag, denke aber an der übertragungsrate.

hi, skorpi

das hochgeladene animierte gif wird in der größe verändert, um in 300 X 300 pixel zu passen. vielleicht lags daran, daß es nicht ging bei Dir. ein solches gif kann nicht einfach resized werden, ohne seine "beweglichkeit" einzubüßen.

am besten gleich eins nehmen, das 300x300 hat wie meines. muß man sich halt basteln...

gruß stefan

Hi und danke für die Antwort

Wenn ich die Übertragung richtig verstehe werden also 5 Bytes rausgeschickt wovon jedes mit einem Startbit und einem Stopbit geschickt wird.

Also habe ich insgesamt 50Bit - von denen nur 40Bit die Kodierung meiner Karte wiederspiegeln.

Die Frage ist nun - wenn ich es schaffe den gesamten Datenstrom also die 50Bit abzufangen mittels serieller Schnittstelle.

Wie kann ich nach Start und Stopbit suchen ?

Ich kann ja nicht einfach nach Bit 0 suchen und davon ausgehen, das ist der Anfang. Die Null könnte ja auch irgendwo in dem Byte stehen welcher Daten übertragt ... Ich hoffe meine Erklärung ist nachvollziehbar

Vielleicht kann mir hier jemand helfen ?

Grüße

hi,

das sind dinge, die dich nicht kümmern müssen. laut beschreibung sendet das ding mit 9600, 8N1. das muß am arduino bei Serial.begin eingestellt werden. 8N1 ist standard beim arduino, also schreibst Du nur Serial.begin(9600). oder eben ausführlich Serial.begin(9600, SERIAL_8N1). kommt auf's gleiche raus.

hast Du es sicher am RS485-ausgang angeschlossen und nicht dem für wiegand? das würde ganz anders aussehen:

http://www.produktinfo.conrad.com/datenblaetter/750000-774999/754030-an-01-de-Teil1_Codeschloss_Transp_IP66_AP.pdf ab seite 54.

wieso glaust Du, daß die daten im ASCII-code gesendet werden? also zb. eine 54, damit Du im monitor eine 7 siehst. also wenn ich eine 7 schicken wollte, würde ich es auch tun und nicht auf ASCII umrechnen und am anderen ende im arduino wieder zurück...

gruß stefan

Hallo Stefan,

Verstehe also die Geschichte mit dem Start und Stop Bit interessieren mich nicht.

Vielleicht sollte ich den serial.read also in ein int Speichern statt einem Char oder?

Aber ich muss doch auch fünf bytes jeweils in sich geschlossen auslesen oder?

Wie mache ich das, dass ich auch wirklich jedes Byte komplett abfange und abspeichere?

GRÜßE

hi, tonno,

hab' mir grad Deinen code ganz oben angesehen. Liege ich richtig damit, daß der eigentlich für einen anderen reader gedacht ist?

wenn ja: ich nehme an, daß nicht standardisiert ist, wie so ein reader seine daten schickt (länge, startzeichen, endezeichen, und nicht verwechseln, das hat nicht mit startbit oder stopbit zu tun).

aber nachdem Du ja einen mega hast, würd' ich vorschlagen, den sketch aus den beispielen zu testen, der bei einem mega einfach alles, was bei einem serialport reinkommt, bei einem anderen wieder rausschickt. ist irgendwo bei examples > communication und im titel kommt "for mega" vor, wenn ich mich recht erinnere. da hängst Du dann den reader an Serial1 und der sketch schickt es über Serial über's USB-kabel an Deinen rechner weiter.

eigentlich sollte dann bei jedem lesevorgang das gleiche am serial-monitor zu sehen sein. falls es nicht klartext ist, also zahlen oder was auch immer da kommen soll, nimm einen anderen monitor wie HTerm

http://www.heise.de/download/hterm.html

und stell die ausgabe von ascii auf decimal um. da siehst Du dann, welche werte der reader wirklich schickt.

gruß stefan

hi,

das kommt davon, wenn man "so mal" in einen thread reinrutscht. man liest alles erst später...

Deinem code im ersten post kann man entnehmen, daß so gelesen wird:

er wartet, bis 12 byte da sind prüfen, ob das erste byte eine 02 ist (keine ASCII-zahl "2", die Du im klartext auf dem serial monitor sehen könntest) wenn ja, liest er 11 byte ein, also 10 für die kennung und dann das endezeichen, eine 03.

dann schickt er die kennung weg. das heißt, daß in jedem byte ein zeichen enthalten ist.

Dein großer reader macht das anders:

Die 40Bit der Transponderkennung werden in 5 unmittelbar aufeinander folgenden Bytes ohne zusätzliche Quersummeninformation gesendet.

1 byte hat 8 bit. mit 4 bit kann man zahlen von 0 bis 15 darstellen. wenn man also nur 0 bis 9 braucht, kann man 10 zahlen mit 5 byte senden.

beispiel:

5 ist 0101 8 ist 1000

wenn ich das aneinanderhänge, also 01011000, ist das 88.

Dein sketch oben erwartet für eine 58 das: 00000101 00001000

Dein großer reader sendet für eine 58 das: 01011000

der informationsgehalt ist der gleiche, es werden halt nur die 4 nullen am anfang weggelassen und bytes gespart.

ein startbyte oder endebyte sendet das ding offensichtlich nicht, also kann Dein sketch oben nicht funktionieren. mach es also so wie oben berschrieben mit dem beispielsketch und sieh Dir das ergebnis an.

gruß stefan

Vielen lieben Dank für die wirklich nette Hilfe.

Aktuell habe ich die Antenne, bzw. den großen Reader nicht zur Hand. Allerdings kann ich Montag / Dienstag wieder damit experimentieren.

Ich werde dann zunächst erstmal den Probesketch testen, welchen du mir beschrieben hast - habe den Sketch mal hier. Ich denke du meinst diesen hier:

/*
  Mega multple serial test

 Receives from the main serial port, sends to the others. 
 Receives from serial port 1, sends to the main serial (Serial 0).

 This example works only on the Arduino Mega

 The circuit: 
 * Any serial device attached to Serial port 1
 * Serial monitor open on Serial port 0:

 created 30 Dec. 2008
 modified 20 May 2012
 by Tom Igoe & Jed Roach

 This example code is in the public domain.

 */


void setup() {
  // initialize both serial ports:
  Serial.begin(9600);
  Serial1.begin(9600);
}

void loop() {
  // read from port 1, send to port 0:
  if (Serial1.available()) {
    int inByte = Serial1.read();
    Serial.write(inByte); 
  }
  
  // read from port 0, send to port 1:
  if (Serial.available()) {
    int inByte = Serial.read();
    Serial1.write(inByte); 
  }
}

Allerdings hätte ich noch eine Anmerkung / Frage zu der Erklärung bezüglich des großen Readers:

Du gehst nun davon aus, wenn ich es richtig verstehe, dass in jedem Byte (8bit) zwei Zahlen verschickt werden ? Also die erste Zahl mit den ersten 4bits die zweite Zahl mit den letzen 4bits.

Allerdings lässt sich dies doch aus der Information welche im Datenblatt des Readers steht nicht entnehmen oder ?

Die 40Bit der Transponderkennung werden in 5 unmittelbar aufeinander folgenden Bytes ohne zusätzliche Quersummeninformation gesendet.

Ich bekomme lediglich die Information wie verschickt wird

Die Transponderkennung muss ja auch nicht zwingend 10 Zahlen lang sein. Demnach könnte auch ein komplettes Byte eine Zahl wiederspiegeln oder ?

Ich denke diesen Sachverhalt gilt es nun rauszufinden....

Wie gesagt, den Testsketch lasse ich am mitte nächster Woche laufen und dann melde ich mich mit dem Ergebnis !

Grüße

//EDIT: Noch eine Anmerkung:

Falls es klappen sollte und ich wirklich die Bytes korrekt erhalte - laut Aussage dieses Artikels hier http://www.mikrocontroller.net/articles/UART wird zunächst das LSB geschickt.

Muss ich mich hier ebenfalls nicht darum kümmern, oder muss ich nun wirklich softwaretechnisch das ganze in die richtige Reihenfolge abändern ? Falls ja, gibt es für Arduino einen Befehl der mir umschreibt ?

hi,

ja, da hast Du vollkommen recht. es ist ja auch nur eine frage der darstellung. laut beispiel im datenblatt:

(b0 ................ b19) (b20 ................ b39) Beispiel: 0101 1101 0001 1010 0010 0001 0100 0110 0011 1100

dafür konnte man schreiben:

5 13 1 10 2 1 4 6 3 12

oder auch:

93 26 33 70 60

man könnte es als 5-byte-wert nehmen, dann wär's:

399870346812

wie gesagt, frage der darstellung. es ist immer die gleiche information drin. für Dich wird es am einfachsten sein, die gelesenen 5 werte mit 93 26 33 70 60 zu vergleichen.

ist bei einem solchen RFID-tag angegeben, welchen code er hat?

gruß stefan

zu Deinem edit:

es ist egal, Du vergleichst einfach fünf empfangene bytes mit dem soll. wenn ja, gut, wenn nein, bleibt draußen…

gruß stefan

Ja auf den RFID Tags steht die Zahl drauf als Dezimal Zahl.

und wieviele stellen hat die?