RFID mit Conrad TOWITEK Antenne

Ich habe mir dieses Modul bei Conrad bestellt:

Das würde ich jetzt gerne an meinen Arduino anschließen um damit ein Relais zu schalten oder mir den RFID Schlüssel auf einem Display anzeigen lassen.

Hat das schonmal jemand gemacht?
Serielle Komunikation ist noch absolutes Neuland für mich.
Laut Anleitung funktioniert das Teil so:

Die Polarität des seriellen Datensignals mit TTL-Pegeln ist gegenüber den
am PC üblichen RS-232 Pegeln invertiert. Um die Daten der RFIDAntenne
an eine RS-232 Schnittstelle des PC zu senden ist ein
invertierender Pegelwandler wie z.B. der Baustein MAX232 erforderlich
Die serielle Datenausgabe erfolgt mit einer Bitrate von 9600 Bits pro
Sekunde (104NS pro Bit).
Jedes Byte beginnt mit einem Startbit (Lo-Pegel).
Es folgen 8 Datenbits, wobei das niederwertigste Bit (LSB) zuerst
gesendet wird. Logisch '1' wird durch Hi-Pegel, logisch '0' mit Lo-Pegel
bertragen.
Jedes Byte endet mit einem Stopbit (Hi-Pegel).
Es werden insgesamt 5 Bytes übertragen
Verbleibt der Transponder im Lesefeld der Antenne, werden die IDDaten
etwa 5 mal pro Sekunde in Folge widerholt ausgegeben

Hat das schon jemand so umgesetzt?
Die Forensuche war bei Towitek leider nicht wirklich ergiebig.

Anschliessen nach Datenblatt (siehe Conrad). Datenleitung auf RX, GND auf GND, Versorgungsleitung auf 5V.

Dann einfach "Serial.begin(9600);" und so weiter. Das byte-weise Einlesen von der Schnittstelle ist in der Befehlsreferenz und in den Beispielprogrammen (bei der Software mitgeliefert) beschrieben.

Hat es funktioniert? Ich will mir das auch kaufen und das gleiche probieren.

Guss,

Dennis

Leider nicht, bin an

Das byte-weise Einlesen von der Schnittstelle ist in der Befehlsreferenz und in den Beispielprogrammen (bei der Software mitgeliefert) beschrieben.

gescheitert.

Starte gerade einen neuen Versuch

Ich hab's gekauft und es hat super einfach funktioniert. Einfach mit der beigelegten baud rate etc zuhoeren und alles kommt an

Dennis

Soweit bin ich:

...
// Variablen Kommunikation
int i = 0; //Schleife Bytezähler
byte rfid[5] = {}; //Daten von Towitek

// Kommunikation
  while (Serial.available() > 0) {  //Einkommende Bytes lesen
    rfid[i] = Serial.read();
    i++;  
    delay (3);
  
    for(int i=0;i<5;++i){
      Serial.println(rfid[i], BYTE);
      }
    }
 
   for (int i=0; i<=5; i++) {
     rfid[i] = NULL;
     }

Das sollte mir die gelesenen Daten auf der Seriellen Schnittstelle ausgeben und das Array gleich wieder ablöschen.
Klappt aber überhaupt nicht.

Zielsetzung ist ein Array, in dem der aktuell gelesene Tag steht, bis kurz nachdem keine Daten mehr vom Reader kommen.
Das möchte ich dann vergleichen und dementsprechend einen Ausgang schalten

Hallo SaschaW

Du kannst nicht die gleiche Variable für den Array-Index in der While-Schleife und gleichzeitig für die for Schleife nehmen.

Die For-Schleife zum seriellen verschiken der Daten muß außerhalb der While -Schleife sein!!! ( vor der Löschschleife).

Grüße Uwe

Danke für die Hilfe uwefed.
Irgendwie tu ich mich da noch recht schwer mit meinem Arduino.

So schauts aktuell aus:

// RFID auslesen
  byte i = 0;             // Schleifenzähler Printausgabe
  byte val = 0;           // Zwischenspeicher gelesene Bytes
  byte byteArray[5];      // Gewandelte eingelesene Bytes in Array
  byte bytesGelesen = 0;  // Schleifenzähler eingelesene Bytes

  if(Serial.available() > 0) {                    // Wenn Daten vorhanden (sind immer 5 Byte)
      while (bytesGelesen < 5) {                  // 5 Byte je Tag werden empfangen
          val = Serial.read();                    // erstes Byte in val einlesen
          if (bytesGelesen & 1 == 1) {            // Alle zwei hex-digits,
            byteArray[bytesGelesen >> 1] = (val); // eingelesenes Byte in Array ablegen
            } 
          bytesGelesen++;   // Zähler für nächstes Byte aufaddieren
      }                     // hier sollten alle tagBytes im Array passend abgelegt sein 
      bytesGelesen = 0;     // Zähler rücksetzen

  }
      // Zum Testen ob Array mit RFID tag übereinstimmt - Ausgabe Array auf serieller Schnittstelle
      
  delay (500);
  for (i=0; i<5; i++) {
    Serial.print(byteArray[i]);  
    }

Aber auch das macht noch nit was ich will ;(

Hallo SaschaW
Ich verstehe nicht diese bitweise Und-Verknüpfung in if (bytesGelesen & 1 == 1) {
und das bitweise verschieben in byteArray[bytesGelesen >> 1] = (val); nicht.
Ist beides nicht notwendig.
Außerdem fehlt die setup() und loop() - Funktionen.

das funktioniert:

long incomingByte;   
char Data[6];
int i;
unsigned long Tempo;

void setup()
{
  Serial.begin(9600);
}

void loop(){
 
   do {
     if (Serial.available()) {       
       Data[i] = Serial.read();
       i++;
       }     
     if(i<1)Tempo = millis(); 
     } while (i<5&&(millis()-Tempo) < 500);  // liest 5 bytes ein oder wartet 0,5 Sekunden  
   Data[i] = 0;    // end-null für String dazugeben
   incomingByte = atof(Data);   // konvertierung String in Zahl
   
   Serial.print(incomingByte);  // Ausgabe als Zahl
   
   for (i=0; i<5; i++) {
    Serial.print(Data[i]);  // Ausgabe als Char.  
    } 
   i=0;
}

Grüße Uwe

1000 Dank, das klappt.
Ich hatte nur einen Teil des Programms gepostet - Bewegungsmelder und LED Dimmen passte nicht so ganz zur Frage.
Das bisherige Programm habe ich mir zusammengegoogelt und durch trial & error "verbrochen".

Der RFID Leser schickt HEX Werte, das scheint mit atof nicht so ganz zu funktionieren - als Zahlenwert kommt immer 30.
Wozu wird "Data = 0; // end-null für String dazugeben" benötigt?
Aber was ich wollte hab ich ja - jetzt stellt sich mir die nächste Aufgabe
( Den Inhalt von char Data[6]; mit z.B.:
char Karte_1[5] = {0x19, 0x00, 0xDA, 0x41, 0xF8}; zu vergleichen)
Irgendwie sind die Abende zu kurz und eigentlich sollte das auch nur eine Haustürbeleuchtung werden :slight_smile:

Hallo SaschaW
Ein String wird mit dem Wert "0" als Ende abgeschlossen; das muß so sein damit atof funktioniert.
HEX ist nur eine Visualisierung des Wertes. Intern wird sowieso binär gerechent. Eine 8 Bit-Zahl kann als Hex mit 2 Stellen dar.
Das mit dem atof brauchst Du nur wenn du eine Mehrstellige Zahl überträgst; zB 1234 kommt als ashii 1, 2 ,3, 4 an und nicht als eine Zahl.
Wenn Du die einzelnen werte brauchst dann nimm einfach das String.

Zum vergleichen brauchst Du Stringoperationen. Dafür gibt es Bibiotheken.

Ansonsten einfach Elementweise vergleichen:
zB char Karte_1[5] = {0x19, 0x00, 0xDA, 0x41, 0xF8}; mit den empfangenen Daten vergleichen:
if ( (Karte_1[0]==data[0])&&(Karte_1[1]==data[1])&&....) {...} funktioniert, ist aber umständlich.
schau mal http://www.arduino.cc/cgi-bin/yabb2/YaBB.pl?num=1257119498

Grüße Uwe

hallo.

hab mir auch diese antenne bestellt um etwas mit rfid zu experiementieren. hab mir nun mal deine code (uwe) auf den arduino geladen, aber im serial monitor kommt nur buchstaben gulasch an. “àÛ 0 à Û 0 àÛ”
woran kann das liegen.

nehem ich den code

#include <SoftwareSerial.h>

#define rxPin 2
#define txPin 3
#define ledPin 13



SoftwareSerial mySerial =  SoftwareSerial(rxPin, txPin);

long incomingByte;  
int Data[5];
int i=0;
int ii;




void setup()  {
  // define pin modes for tx, rx, led pins:
  pinMode(rxPin, INPUT);
  pinMode(txPin, OUTPUT);
 

  // set the data rate for the SoftwareSerial port
  mySerial.begin(9600);
  Serial.begin(9600);
Serial.print("lesen bereit");
Serial.println();


}

void loop() {

   do  
   {
    
        Data[i] = mySerial.read();
      
          i++;
       }   while (i<5);  
 Serial.println();




   for (ii=0; ii<5; ii++) {
    Serial.print(Data[ii]);   
    }
  
 i=0;
   Serial.println();
   Serial.print("ready");
   delay(600);

}

dann kommt da ne zahl ruas. “4101682745”

und bei nem anderen rfid tag kommt “122421914916”

kann das stimmen oder wo liegt mein fehler?

danke schonmal

gruß tobi