RFID-Sensor

Dieses Modul ist durch Schülerinnen und Schüler der Informatik-Kurses 9 (2018/2019) am Stiftischen Gymnasium erstellt worden. Vielen Dank für die Mühen!


Inhalt

  • Wofür braucht man den RFID-Sensor
  • Einrichten (Schaltung + Syntax)
  • Die einfache Physik
  • Unser Projekt

Wofür braucht man den RFID-Sensor

Der RFID-Sensor, das Set besteht aus einem RFID-Reader und einer Karte (siehe „unter der Haube“), kann in vielen Bereichen eingesetzt werden. Er wird verwendet um bestimmten Karten Zugang, oder eben keinen Zugang, zu gewähren.

Einrichten (Schaltung + Programmierung)

was wir benötigen:

Bibliothek einbinden:

Sketch -> Bibliothek einbinden -> Bibliotheken verwalten -> „MFRC522“ suchen -> Installieren

RFID-Reader anschließen

Rst -> 9                           3.3V -> 3.3V

SDA -> 10                      GND -> GND

Mosi -> 11

Miso -> 12

SCK -> 13

Programmierung
#include <SPI.h> //bindet Bibliothek ein
#include <MFRC522.h> //bindet Bibliothek ein
 
#define RST_PIN   9     // RST an Pin 9
#define SS_PIN    10    // SDA an Pin 10
 
MFRC522 mfrc522(SS_PIN, RST_PIN);   // Instanz (=konkretes Objekt) des MFRC522 erzeugen
 
void setup() { // Diese Funktion wird einmalig beim Start ausgeführt
  
  Serial.begin(9600);  // Serielle Schnittstelle öffnen
  SPI.begin();         // Initialisiere SPI Kommunikation
  mfrc522.PCD_Init();  // Initialisiere MFRC522 Lesemodul
}
 
void loop() { // Diese Funktion wird in Endlosschleife ausgeführt
  
 
 
  //Falls eine Karte erkannt wird ...
  if (mfrc522.PICC_IsNewCardPresent() && mfrc522.PICC_ReadCardSerial() ) {
    Serial.print("Gelesene UID:"); //Gibt "Gelesene UID: " aus
    for (byte i = 0; i < mfrc522.uid.size; i++) { //zählt i hoch
      // Abstand zwischen HEX-Zahlen und führende Null bei Byte < 16
     Serial.print(mfrc522.uid.uidByte[i] < 0x10 ? " 0" : " "); //Daraus folgt die Ausgabe (Byte-System) 
     Serial.print(mfrc522.uid.uidByte[i]); //Gibt Array aus
    } 
    Serial.println(); 
 
    // Gelesene Karte in Ruhemodus, um andere lesen zu können 
    mfrc522.PICC_HaltA();
    delay(1000);
  }
}

Quelle

RFID-Sensoren und die einfache Physik dahinter

Das RFID (engl. radio-frequency identification) Set besteht aus dem Rfid-Reader und dem Chip/der Karte.

Die Karte, bzw. der Chip sendet eine Radiofrequenz die der RFID-Reader lesen kann. Außerdem wird so die ID (Identität) der Karte ermittelt. Diese Funktion benötigt man um mit den Karten weiterarbeiten zu können, sofern man Aktionen nur mit einer bestimmten Karten-ID ausführen möchte.

Unser Projekt

Wir programmieren ein virtuelles Hotelmanagementsystem. Nach dem erkennen einer bestimmten RFID-Karte soll eine grüne LED leuchten. Wenn die Karte gerade ausgegeben wurde, leuchtet eine rote LED, um zu signalisieren, dass kein Schlüssel vorhanden ist und es wird, natürlich nur virtuell, ein neuer Schlüssel nachgelegt. Zu dem Realisieren dieser Aktion, wird ein vielleicht unbekanntes If-Statement verwenden, in dem eine Modulo Rechnung vorzufinden ist. Mathematische Erklärung

was wir benötigen

Bibliothek einbinden

Sketch -> Bibliothek einbinden -> Bibliotheken verwalten -> „MFRC522“ suchen -> Installieren

…wenn es nicht funktioniert

Tipps zum Beheben von physischen Fehlern:

  • LEDs drehen
  • Kabel überprüfen
  • Kabel in der richtigen Spalte
  • Widerstand in der richtigen Spalte

Tipps zum Beheben von Syntaxfehlern

  • Semikolon gesetzt (da wo eins benötigt wird)
  • Groß- und Kleinschreibung ist richtig

Kabelmanagement

RST -> 9                 3.3V -> 3.3V

SDA -> 10             GND -> GND

Mosi -> 11

Miso -> 12

SCK -> 13

Die Schaltung sieht folgendermaßen aus:

Quelltext

#include <SPI.h>       //Bindet die SPI-Bibliothek ein
#include <MFRC522.h>    //Bindet die MRFC522-Bibliothek ein
#define RST_PIN   9     // RST an Pin 9
#define SS_PIN    10    // SDA an Pin 10
 
MFRC522 mfrc522(SS_PIN, RST_PIN); // Instanz (=konkretes Objekt) des MFRC522 erzeugen
int keyavailable = 0;
const int ledPinGruen = 6;
const int ledPinRot = 3;

byte kartenID[] = {240, 207, 43, 168};      //Array für Abfrage von der RFID-Karte, die aktzeptiert wird 


void signalAccessGranted() {                //Funktion für Karte akzeptiert
  if (keyavailable % 2 == 0){               //Falls die Variable keyavailable durch 2 geteilt 0 ergibt, dann
   digitalWrite(ledPinGruen, HIGH);         //Lampe an
   delay(3000);                             //Lampe für drei Sekunden anlassen
   digitalWrite(ledPinGruen, LOW);          //Lampe aus
   Serial.println("Schlüssel ausgegeben!"); //Gibt aus: Schlüssel ausgegeben!
   keyavailable = keyavailable +1;          //Variable hochzählen
   }else{                                   //Falls die Variable keyavailable durch 2 geteilt nicht 0 ergibt, dann
      digitalWrite(ledPinRot, HIGH);        //Lampe an
      delay(3000);                          //Lampe für drei Sekunden anlassen
      digitalWrite(ledPinRot, LOW);         //Lampe aus
      Serial.println("Schlüssel nicht vorhanden!"); //Gibt aus: Schlüssel nicht vorhanden!
      keyavailable = keyavailable +1;       //Variable hochzählen
    }  
}
bool acceptedRFID( byte uid[4]) {           //Funktion für die Überprüfung der RFID-Karten
return
 (mfrc522.uid.uidByte[0] == kartenID[0]) && //Gleicht den ersten Block der ID ab
 (mfrc522.uid.uidByte[1] == kartenID[1]) && //Gleicht den zweiten Block der ID ab
 (mfrc522.uid.uidByte[2] == kartenID[2]) && //Gleicht den dritten Block der ID ab
 (mfrc522.uid.uidByte[3] == kartenID[3]);   //Gleicht den vierten Block der ID ab
}

void resetUID(){                            // Reset UID-Array
   mfrc522.uid.uidByte[0]=0;                //Erster ID-Block wird auf Null gesetzt
   mfrc522.uid.uidByte[1]=0;                //Zweiter ID-Block wird auf Null gesetzt
   mfrc522.uid.uidByte[2]=0;                //Dritter ID-Block wird auf Null gesetzt
   mfrc522.uid.uidByte[3]=0;                //Vierter ID-Block wird auf Null gesetzt
}

void setup() {                              // Diese Funktion wird einmalig beim Start ausgeführt
  Serial.begin(9600);                       // Serielle Schnittstelle öffnen
  SPI.begin();                              // Initialisiere SPI Kommunikation
  mfrc522.PCD_Init();                       // Initialisiere MFRC522 Lesemodul
  pinMode(ledPinGruen,OUTPUT);              // Setzt gründe LED auf output
  pinMode(ledPinRot,OUTPUT);                // Setzt rote LED auf output
}

void loop() {                                                            // Information: PICC = kontaktlose Chipkarte
if (mfrc522.PICC_IsNewCardPresent() && mfrc522.PICC_ReadCardSerial() ) { //Falls eine neue Karte(gilt auch für eine alte Karte, nach kurzem wegnehmen vom Sensor) erkannt wird-> 
 Serial.print("Gelesene UID:");                                          //Gibt aus: Gelesene UID: 
   for (byte i = 0; i < mfrc522.uid.size; i++) {                         // Zählschleife (for-Schleife)
     Serial.print(mfrc522.uid.uidByte[i] < 0x10 ? " 0" : " ");           //Daraus folgt die Ausgabe (Byte-System)
     Serial.print(mfrc522.uid.uidByte[i]);                               //Gibt Array aus
   } 
 Serial.println();

   mfrc522.PICC_HaltA();                    //Wartet, bevor die nächste Karte gescannt wird 
}
  
 if (acceptedRFID(mfrc522.uid.uidByte)) {  //Abfrage: mfrc522.uid.uidByte = Parameter
     signalAccessGranted();                //Führt diese Funktion aus
     resetUID();                           //Führt diese Funktion aus
     }
 }