Arbeitsblatt 6

Aufgabe 2-4

Da ich nicht über die Hardware für Aufgabe 1 verfüge, kann ich diese nicht lösen. Der Leser der Aufgabe 2 funktioniert auch mit anderen NFC-Karten und auch mit meinem Smartphone. Hier ist intererssant, dass die Uid des Smartphones bei jedem Kontakt ändert, damit der User nicht so einfach getrackt werden kann.

Versuchsaufbau


Der Summer steht stellvertretend für z.B. ein Türschloss.

Code

rfid.ino
#include <SPI.h>
#include <MFRC522.h>
#define RST_PIN 9 // SPI Reset Pin
#define SS_PIN 10 // SPI Slave Select Pin
int piezoPin = 2;
byte knownUid[10];
 
MFRC522 mfrc522(SS_PIN, RST_PIN);
void setup() {
  Serial.begin(9600);
  SPI.begin();
  mfrc522.PCD_Init();
  }
void loop() { 
  // Wenn gültiger Tag
  if (mfrc522.PICC_IsNewCardPresent() && mfrc522.PICC_ReadCardSerial() ) {
     // Prüfen, ob der Tag der uns bekannten known Uid matcht
     int auth = memcmp(knownUid, mfrc522.uid.uidByte, sizeof(knownUid));
     // Falls uns noch keine Uid bekannt
     if (knownUid[0] == NULL) {
      // den aktuellen Tag als knownTag speichern
      memcpy(knownUid, mfrc522.uid.uidByte, sizeof(knownUid));
      Serial.print("First run - registered ");
      printUid(mfrc522.uid.size, mfrc522.uid.uidByte);
      Serial.println(" as known Tag!");
     }
     // Wenn der aktuelle Tag mit dem knownTag (aufs Bit genau) matcht
     else if (auth == 0) {
      // den Benutzer willkommen heissen. Hier erweitern um z.B. Relais-Status zu ändern etc...
      Serial.print("Welcome back,");
      printUid(mfrc522.uid.size, mfrc522.uid.uidByte);
      Serial.println("!");
      playSound(true);
     }
 
     // ist knownUid nicht leer und Tag matcht nicht mit knownUid
     else {
      // Zugriff verweigern
      Serial.print("Access denied for");
      printUid(mfrc522.uid.size, mfrc522.uid.uidByte);
      Serial.println(", UID unknown!");
      playSound(false);
     }
    // Versetzt die gelesene Karte in einen Ruhemodus, um nach anderen Karten suchen zu können.
    mfrc522.PICC_HaltA();
    delay(1000);
    }
}
 
// playSound gibt den angegebenen Sound aus:
// false => 3x Beep
// true => 2x Beep, Tonhöhe aufsteigend.
void playSound(bool authOK) {
  if (authOK == true) {
      tone(piezoPin, 1500, 250);
      delay(250);
      tone(piezoPin, 500, 250);
      delay(250);
  }
  else {
      tone(piezoPin, 3000, 250);
      delay(250);
      tone(piezoPin, 3000, 250);
      delay(250);
      tone(piezoPin, 3000, 250);
      delay(250);
  }
 
}
// Uid-Print gemäss Skript.
void printUid (int uidsize, byte* uidByte) {
    for (byte i = 0; i < uidsize; i++) {
      // Abstand zwischen HEX-Zahlen und führende Null bei Byte < 16
      Serial.print(uidByte[i] < 0x10 ? " 0" : " ");
      Serial.print(uidByte[i], HEX);
      }
}

Ergebnisse

Video mit Arduino in Action: https://youtu.be/AjKPzNbfm4A

Lessons learned

Der Versuchsaufbau darf sich nicht in der Nähe von Induktionsfeldern befinden. In meinem Fall musste ich Distanz zu meinem Mauspad halten, welches via Induktion den Akku der Maus lädt. Ist der Aufbau zu nahe, kann der Arduino nicht korrekt mit dem RFID-Sensor kommunizieren