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:
- Arduino + Steckplatine (breadboard)
- Verbindungskabel
- RFID-Set
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);
}
}
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
- Arduino + Steckplatine (breadboard)
- Verbindungskabel
- RFID-Set
- 1 rote LED
- 1 blaue LED
- 2 Widerstände
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
}
}
