Problemchen mit RFID Reader

Hallo zusammen,

ich hätte da mal wieder ein kleines Problemchen…
Nach einiger Suche habe ich ein Sketch gefunden das meinen Wünschen recht nahe kommt, bekomme beim Test aber ein Problem mit der Ausgabe am Serial Monitor.

Anstatt der richtigen Tag-ID wird immer nur folgende Meldung ausgegeben:
RFID reader starting up
Tag read: FFFFFFFFFF
Checksum: FF – passed.
Tag not authorized

Mein Reader ist ein ID-20LA

Die Verkabelung ist richtig, Baudrate auch. Ich habe bereits ein anderes Script laufen gehabt das prima funktioniert. Die Tag-ID meiner Tags kenne ich auch :wink:

Durch google habe ich gefunden das es angeblich an der IDE Version liegen soll mit einem Woraround aber das blicke ich gerade nicht… Wäre prima wenn mir hier jemand helfen könnte!
Hier der “Lösungsvorschlag” mit dem ich nicht klar komme:
Lösung

Hier der Code den ich aktuell laufen habe:

* Copyright Jonathan Oxer <jon@oxer.com.au>
 * http://www.practicalarduino.com/projects/medium/rfid-access-control
 */
// Set up the serial connection to the RFID reader module. In order to
// keep the Arduino TX and RX pins free for communication with a host,
// the sketch uses the SoftwareSerial library to implement serial
// communications on other pins.
#include <SoftwareSerial.h>

// The RFID module's TX pin needs to be connected to the Arduino. Module
// RX doesn't need to be connected to anything since we won't send
// commands to it, but SoftwareSerial requires us to define a pin for
// TX anyway so you can either connect module RX to Arduino TX or just
// leave them disconnected.

// If you have built the circuit exactly as described in Practical
// Arduino, use pins D2 / D3:
#define rxPin 2
#define txPin 3
// If you are using the Freetronics RFID Lock Shield, use pins D4 / D5:
/* #define rxPin 4 */
/* #define txPin 5 */

// Create a software serial object for the connection to the RFID module
SoftwareSerial rfid = SoftwareSerial( rxPin, txPin );

// Set up outputs for the strike plate and status LEDs.
// If you have built the circuit exactly as described in Practical
// Arduino, use pins D12 and D13:
#define strikePlate 12
#define ledPin 13
// If you are using the Freetronics RFID Lock Shield, use pins D6 / D7:
/* #define strikePlate 6 */
/* #define ledPin 7 */

// Specify how long the strike plate should be held open.
#define unlockSeconds 2

// The tag database consists of two parts. The first part is an array of
// tag values with each tag taking up 5 bytes. The second is a list of
// names with one name for each tag (ie: group of 5 bytes).
char* allowedTags[] = {
  "0104F5B523",         // Tag 1
  "04146E8BDD",         // Tag 2
  "0413BBBF23",         // Tag 3
};

// List of names to associate with the matching tag IDs
char* tagName[] = {
  "Jonathan Oxer",      // Tag 1
  "Hugh Blemings",      // Tag 2
  "Dexter D Dog",       // Tag 3
};

// Check the number of tags defined
int numberOfTags = sizeof(allowedTags)/sizeof(allowedTags[0]);

int incomingByte = 0;    // To store incoming serial data

/**
 * Setup
 */
void setup() {
  pinMode(ledPin, OUTPUT);
  digitalWrite(ledPin, LOW);
  pinMode(strikePlate, OUTPUT);
  digitalWrite(strikePlate, LOW);

  Serial.begin(38400);   // Serial port for connection to host
  rfid.begin(9600);      // Serial port for connection to RFID module

  Serial.println("RFID reader starting up");
}

/**
 * Loop
 */
void loop() {
  byte i         = 0;
  byte val       = 0;
  byte checksum  = 0;
  byte bytesRead = 0;
  byte tempByte  = 0;
  byte tagBytes[6];    // "Unique" tags are only 5 bytes but we need an extra byte for the checksum
  char tagValue[10];

  // Read from the RFID module. Because this connection uses SoftwareSerial
  // there is no equivalent to the Serial.available() function, so at this
  // point the program blocks while waiting for a value from the module
  if((val = rfid.read()) == 2) {        // Check for header
    bytesRead = 0;
    while (bytesRead < 12) {            // Read 10 digit code + 2 digit checksum
      val = rfid.read();

      // Append the first 10 bytes (0 to 9) to the raw tag value
      if (bytesRead < 10)
      {
        tagValue[bytesRead] = val;
      }

      // Check if this is a header or stop byte before the 10 digit reading is complete
      if((val == 0x0D)||(val == 0x0A)||(val == 0x03)||(val == 0x02)) {
        break;                          // Stop reading
      }

      // Ascii/Hex conversion:
      if ((val >= '0') && (val <= '9')) {
        val = val - '0';
      }
      else if ((val >= 'A') && (val <= 'F')) {
        val = 10 + val - 'A';
      }

      // Every two hex-digits, add a byte to the code:
      if (bytesRead & 1 == 1) {
        // Make space for this hex-digit by shifting the previous digit 4 bits to the left
        tagBytes[bytesRead >> 1] = (val | (tempByte << 4));

        if (bytesRead >> 1 != 5) {                // If we're at the checksum byte,
          checksum ^= tagBytes[bytesRead >> 1];   // Calculate the checksum... (XOR)
        };
      } else {
        tempByte = val;                           // Store the first hex digit first
      };

      bytesRead++;                                // Ready to read next digit
    }

    // Send the result to the host connected via USB
    if (bytesRead == 12) {                        // 12 digit read is complete
      tagValue[10] = '\0';                        // Null-terminate the string

      Serial.print("Tag read: ");
      for (i=0; i<5; i++) {
        // Add a leading 0 to pad out values below 16
        if (tagBytes[i] < 16) {
          Serial.print("0");
        }
        Serial.print(tagBytes[i], HEX);
      }
      Serial.println();

      Serial.print("Checksum: ");
      Serial.print(tagBytes[5], HEX);
      Serial.println(tagBytes[5] == checksum ? " -- passed." : " -- error.");

      // Show the raw tag value
      //Serial.print("VALUE: ");
      //Serial.println(tagValue);

      // Search the tag database for this particular tag
      int tagId = findTag( tagValue );

      // Only fire the strike plate if this tag was found in the database
      if( tagId > 0 )
      {
        Serial.print("Authorized tag ID ");
        Serial.print(tagId);
        Serial.print(": unlocking for ");
        Serial.println(tagName[tagId - 1]);   // Get the name for this tag from the database
        unlock();                             // Fire the strike plate to open the lock
      } else {
        Serial.println("Tag not authorized");
      }
      Serial.println();     // Blank separator line in output
    }

    bytesRead = 0;
  }
}

/**
 * Fire the relay to activate the strike plate for the configured
 * number of seconds.
 */
void unlock() {
  digitalWrite(ledPin, HIGH);
  digitalWrite(strikePlate, HIGH);
  delay(unlockSeconds * 1000);
  digitalWrite(strikePlate, LOW);
  digitalWrite(ledPin, LOW);
}

/**
 * Search for a specific tag in the database
 */
int findTag( char tagValue[10] ) {
  for (int thisCard = 0; thisCard < numberOfTags; thisCard++) {
    // Check if the tag value matches this row in the tag database
    if(strcmp(tagValue, allowedTags[thisCard]) == 0)
    {
      // The row in the database starts at 0, so add 1 to the result so
      // that the card ID starts from 1 instead (0 represents "no match")
      return(thisCard + 1);
    }
  }
  // If we don't find the tag return a tag ID of 0 to show there was no match
  return(0);
}

Danke euch!

Dann sag uns doch mal, welche IDE-Version du einsetzt.
Die Info mit der IDE gilt ja nur für die V1.0.2.

Ich vermute, der verwendete Sketch arbeitet nicht mit deinem RFID-Reader zusammen.

Schon mal AltSoftwareSerial statt SoftwareSerial probiert?

Hallo zusammen,

danke für die Beiträge!

@HotSystems, ich nutze die IDE 1.0.5 der Sketch war von jemandem geschrieben der den gleichen Reader bzw. etwas kleineren ID-12 einsetzt, hier der Link dazu: Link

@DrDiettrich, werde ich gleich probieren, danke! - Das ergibt jede menge Fehler wenn ich SoftwareSerial in AltSoftwareSerial ändere...

Welche Fehler sind das. Bitte hier posten.

Du mußt natürlich auch die andere Lib installieren, ehe du sie aufrufen kannst. :wink:
Es gibt AltSoftSerial und NewSoftSerial und weiß der Fuchs, was noch. Man muß immer mit "Nebenwirkungen" rechnen, wie z.B., das eine SoftSerial nicht mit I2C zusammen will, oder was auch immer. Und wenn, dann eine andere SoftSerial testen.

Hallo ihr lieben,

ja ich hatte schon nach einer "AltSoftSerial" Lib gesucht aber online nicht gefunden...
Da ich heute zu viel Zeit hatte bin ich über ein anderes RFID Sketch gestolpert das ich ausprobiert habe.
Dieses funktioniert mit meinem Reader prima und ich nähere mich Schritt für Schritt meinem gewünschten Ziel an.

Aktuell kann ich damit 3 "zugelassene" Tag Gruppen identifizieren und je nach Gruppe den oder die entsprechenden Ausgänge auf high schalten.
Darüber freue ich mich schon sehr.

Auch habe ich es hin bekommen, bei erkannter zugelassener Karte zusätzlich noch einen INPUT abzufragen und je nach passendem HIGH/LOW den Ausgang zu schalten.

Jetzt muss ich noch etwas Hirnschmalz investieren wie ich weiter mache.

Hintergrund ist eine RFID basierte "kindertaugliche" Zugangskontrolle mit verschiedenen Rechten ala: Türöffner darf mit der richtigen Karte bedient werden, aber nur wenn der Alarm LOW ist.
Das funktioniert so weit prima.

Mein nächster Punkt ist, vor der Tür sind zwei Taster am RFID Reader, einer für die Alarmanlage und einer für den Türöffner.

Mein aktuelles Problem ist ein... eher designtechnisches :wink:

Je nach Karte und erkanntem Zustand der Alarmanlage leuchtet die LED von Taster1 und oder Taster2 auf, das mache ich mit der if-Abfrage und nachfolgendem "digitalwrite".
Ich möchte aber gerne als "Fehlermeldung" bei scharfer Alarmanlage die gleiche LED die sonst leuchtet blinken lassen...

Wie kann ich also bei fehlerhafter if Abfrage die LED 5sec blinken lassen?

Link zu AltSoftSerial steht in der Reference zu SoftwareSerial.

http://www.pjrc.com/teensy/td_libs_AltSoftSerial.html

bzw.