Forum: Mikrocontroller und Digitale Elektronik RFID Weitbereichsleser RS485 Arduino


von Hans P. (hans205)


Lesenswert?

Hallo,

habe aktuell folgendes Problem.

Ich nutze ein Arduino Mega 2560

Folgender Beispielcode:
1
/*
2
 Einfacher RFID Sketch fuer Itead Studio RDM6300 RFID-Leser
3
 Liest und zeigt RFID Chips/Tags Typ EM4100 125 kHz
4
 
5
 Rev. 0.2 2012-10-07
6
 fribbe fuer http://macherzin.net
7
8
Rev. 06.02.2014 Tonno
9
*/
10
11
const int startZeichen = 02; // Chip-Kennung beginnt mit 02
12
const int endeZeichen = 03; // ASCII CR bendet Code
13
const int kennungLaenge   = 10; // Laenge Chip-Code 10 ASCII-Zeichen
14
const int gesamtKennungLaenge = 12; // Code-Laenge + Start- und Ende-Bytes
15
boolean gelesen = 0;
16
char chip[kennungLaenge + 1]; // fuer den Code und abschliessende Null
17
int bytesGelesen = 0;
18
19
void setup()
20
{
21
  Serial.begin(9600); // initialisiere serielle Konsole
22
  Serial2.begin(9600); // initialisiere  seriellen Port
23
  Serial.println("RFID-Leser bereit ... ");
24
}
25
26
void loop()
27
{
28
  if (Serial2.available() >=  gesamtKennungLaenge) // wenn genug Zeichen eingegangen ...
29
  {
30
    if(Serial2.read() == startZeichen) // und das Startzeichen erkannt wurde ...
31
    {
32
      Serial.print("Start-Byte erkannt ... ");
33
      
34
      bytesGelesen = 0; // starten lesen, also Zaehler auf 0
35
      
36
      while(bytesGelesen < kennungLaenge)  // lese 10-stelligen Code
37
      {
38
        char zeichen = Serial2.read(); // lesen Zeichen
39
        Serial.print(zeichen); // zur Kontrolle 
40
        Serial.print(" ");
41
        
42
        if((zeichen == endeZeichen)) // suche nach Ende-Befehl
43
        {
44
         Serial.println("CR erkannt ...");
45
         break;
46
        }
47
        chip[bytesGelesen] = zeichen; // speicher Zeichen im Puffer
48
        bytesGelesen = bytesGelesen + 1; // ein Zeichen weiter
49
      }
50
      chip[bytesGelesen] = 0; // beende Zeichenkette
51
       
52
      Serial.print("RFID-Code ist: ");
53
      Serial.println(chip);
54
    }
55
  }  
56
}

Nachdem ich es geschafft habe mit solch einem RFID Modul: 
http://www.seeedstudio.com/depot/125Khz-RFID-module-UART-p-171.html]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]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]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

von Achim K. (aks)


Lesenswert?

Zu dem RS485 Wandler habe ich leider kaum Doku gesehen.
Bei RS485 sendet immer maximal 1 Gerät; in Deinem Fall wohl die Antenne.
Daher muss Dein RS485 Adapter auf Empfangen stehen. Wie dazu der Jumper 
zu setzen ist, habe ich nicht gefunden. Ebenso unsicher wäre ich mir 
beim der PIN Bezeichnung TX/RX beim Adapter. Da stellt sich immer die 
Frage, welche Richtung gemeint ist (in den Adapter rein oder raus). Kann 
sein das TX zum Senden und RX zum Empfangen (RS485 seitig) ist.

von Hans P. (hans205)


Lesenswert?

Hallo,

Danke für die Antwort.

Also der RS485/TTL Umsetzer hat zwei Eingänge A und B fuer das RS485 
Signal.
Und die von dir bereits erwähnten TX und RX.

Ich habe es jetzt mal so gehandhabt TX des Umsetzers mit dem RX Eingang 
des Arduinos zu verbinden.

Wenn ich die Serielle Schnittstelle Abfrage bekomme ich allerdings nur 
Quatsch und irgendwelche Zeichen aus dem erweiterten ASCII Code.

Allerdings denke ich dies liegt hiermit zusammen, da ich noch nicht 
genau verstehe wie das Signal denn überhaupt ankommt und wie ich es 
aufbereiten soll.

Wenn ich das Datenblatt der Weitbereichsantenne richtig verstehe, werden 
die 40Bit der Transponderkarten jeweils in fünf aufeinanderfolgen Bytes 
seriell verschickt.

Allerdings begreife ich noch nicht wie genau hier Start und Stop Bit 
gefunden werden sollen, sowie ob mit jedem der fünf Bytes Start und Stop 
Bit gesendet wird ?

Vielleicht kann mich jemand aufklären und hier weiter helfen.


Grüße

von Weingut P. (weinbauer)


Lesenswert?

also, bei der Übertragung via RS485 sind Start-Stop-Bit bei jedem Byte 
drinnen. Das Manual sagt:

Die Datenrate beträgt 9600 bps (104μS pro Bit). Es
werden 8 Datenbits
mit einem Startbit und einem Stopbit gesendet (8N1)


Wenn ich die Serielle Schnittstelle Abfrage bekomme ich allerdings nur
Quatsch und irgendwelche Zeichen aus dem erweiterten ASCII Code. ...

das kann schon sein, es wird beim Empfang eben die 40 Bit jeweils als 5 
Byte dargestellt, das können alle möglichen Zeichen sein.

PS: RS485 mag Terminierung und ggf. Pullup und Pulldown, kommt drauf an.

von Hans P. (hans205)


Lesenswert?

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

von Route_66 (Gast)


Lesenswert?

Hans Peter schrieb:
> Wie kann ich nach Start und Stopbit suchen ?

Hallo!
Das macht doch die interne UART für Dich.
Ist Dein Signal nach den vielen Pegelumsetzern eventuell invertiert?

von Hans P. (hans205)


Lesenswert?

Also verstehe ich es richtig, dass der Arduino selbst Start und Stop Bit 
erkennen müsste, sodass ich nur noch die fünf einzelnen Bytes 
voneinander trennen muss?

Sprich ich selbst muss in der Software nicht mehr nach Start und Stopbit 
suchen?

Aber dann stellt sich mir trotzdem noch die Frage, ich habe dann einen 
Eingang von fünf aufeinander folgenden Bytes.

SSoftwaretechnisch muss ich diese nun aber noch richtig verarbeiten oder 
nicht?

Grüße

von Route_66 (Gast)


Lesenswert?

Hans Peter schrieb:
> Also verstehe ich es richtig, dass der Arduino selbst Start und Stop Bit
> erkennen müsste, sodass ich nur noch die fünf einzelnen Bytes
> voneinander trennen muss?

Du hast überhaupt NICHTS verstanden!
Lies das Datenblatt oder den Artikel zum UART.

von Hans P. (hans205)


Lesenswert?

Warum muss immer solch eine unfreundliche Umgangsart hier herrschen.

Es ist nunmal das erste Mal für mich wo ich mit den ganzen Dingen in 
Berührung komme.

Wenn jeder alles verstehen würde bräuchte man kein Forum.

Auf der anderen Seite, wenn dir klar ist was ich nicht verstanden habe, 
kannst du mir doch auch helfen es zu verstehen.

Werde mir mal den Artikel zu UART durchlesen. Allerdings kann man nicht 
davon ausgehen, dass jeder nur weil er das Datenblatt oder einen Artikel 
liest alles richtig versteht.

Trotzdem danke bis hierhin.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.