Arduino RFID Zugangssystem

Praktisches Projekt aus meiner Umschulung zum Fachinformatiker Systemintegration

Was ist Arduino?

Arduino ist eine quelloffene Elektronikplattform, die aus einfach zu bedienender Hardware und Software besteht. Arduino-Boards können Eingaben wie Licht von einem Sensor, Finger auf einem Knopf oder Nachrichten lesen und in Ausgaben wie Motoraktivierung, LED-Ansteuerung oder Online-Veröffentlichungen umwandeln.

Die Plattform wurde am Ivrea Interaction Design Institute entwickelt, um schnelles Prototyping für Studenten ohne Elektronik- und Programmierkenntnisse zu ermöglichen. Heute gibt es Arduino-Boards für IoT-Anwendungen, Wearables, 3D-Druck und eingebettete Systeme.

Projekt: RFID Zugangskontrolle

Dieses Projekt demonstriert ein sicheres Türöffnungssystem mit RFID-Technologie. Ein autorisierter RFID-Tag entriegelt eine Tür (Servomotor), während nicht autorisierte Tags abgewiesen werden. Die LED-Anzeige zeigt Erfolg oder Fehlschlag an.

Das System kombiniert Hardware-Kenntnisse (Verkabelung, Breadboard) mit Software-Programmierung und simuliert reale Anwendungen wie Gebäudesicherheit oder Zutrittskontrolle.

Inhaltsverzeichnis

Benötigte Bauteile

Tinkercad Simulation

In Tinkercad wird das System virtuell aufgebaut und getestet. Der RFID-Reader erkennt Tags, vergleicht IDs und steuert Servo/LED. Simulation erlaubt fehlerfreies Testen vor Realbau.

Tinkercad Projekt öffnen

Realprojekt Aufbau

Verkabelung: MFRC522 an Arduino-Pins (SS=10, RST=9, SPI), LED an Pin 8, Servo an Pin 6. Breadboard für sichere Verbindungen. USB-Stromversorgung.

Schritt-für-Schritt: Bibliotheken installieren (MFRC522), Code hochladen, Tags scannen und autorisieren.

Arduino Programmcode

#include <SPI.h>
#include <MFRC522.h>

/*
 * Author: MIUZEI
 * IDE V1.6.9
 * Email:support@miuzeipro.com 
 * Function:Write and read card for RC522  
 * Tips:Open serial port monitor.
 * LED1 blinking and LED2 off   ->    Detecting card
 * LED1 blinking and LED2 on    ->    Waiting for write card
 * LED1 and LED2 blinking       ->    Reading card is finished
 */
#include 
#include 
const int LED1 = 3;
const int LED2 = 4;
boolean flag = false;    //Write card flag
RFID rfid(10,9);         //D10-Card Reader pin MOSI ,D9 Card Reader pin RST
//The fourth byte is card's serial number and the five byte is card's Check byte
unsigned char serNum[5];
// Write data
unsigned char writeDate[16] ={'W', 'e', 'l', 'c', 'o', 'm', 'e', 'T', 'o', 'S', 'm', 'r', 'a', 'z', 'a', 0};
//A password original sector, 16 sectors, each sector password 6Byte
unsigned char sectorKeyA[16][16] = {
        {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF},
        {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF},
        {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF},};
//A password new sector, 16 sectors, each sector password 6Byte
unsigned char sectorNewKeyA[16][16] = {
        {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF},
        {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xff,0x07,0x80,0x69, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF},
        {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xff,0x07,0x80,0x69, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF},};

void setup()
{
  Serial.begin(9600);
  SPI.begin();
  rfid.init();
  pinMode(LED1,OUTPUT);
  pinMode(LED2,OUTPUT);
  attachInterrupt(0, WriteCardInterrupt, RISING);   //Open external interrupt 0
}

void loop()
{ 
  unsigned char i,tmp;
  unsigned char status;
  unsigned char str[MAX_LEN];
  unsigned char RC_size;
  unsigned char blockAddr;          //Selecting operation block`s address 0~63
  //Detecting card
  rfid.isCard();
  //Reading the card serial number
  if (rfid.readCardSerial())
  {
    Serial.print("The card's number is  : ");
    Serial.print(rfid.serNum[0],HEX);
    Serial.print(rfid.serNum[1],HEX);
    Serial.print(rfid.serNum[2],HEX);
    Serial.print(rfid.serNum[3],HEX);
    Serial.print(rfid.serNum[4],HEX);
    Serial.println(" ");
  }
   //Select card and return memory size(note:Card is locked to prevent multiple read and write
   rfid.selectTag(rfid.serNum);
 
    // write data to card 
        blockAddr = 7;                //data block 7
        if(flag==true)
        { 
          if (rfid.auth(PICC_AUTHENT1A, blockAddr, sectorKeyA[blockAddr/4], rfid.serNum) == MI_OK)  //authenticate
          {
            //Write data
            status = rfid.write(blockAddr, sectorNewKeyA[blockAddr/4]);
            Serial.print("Set the new card password, and can modify the data of the Sector: ");
            Serial.println(blockAddr/4,DEC);
            //Write data
            blockAddr = blockAddr - 3 ; //data block 4
            status = rfid.write(blockAddr, writeDate);
            if(status == MI_OK)
            {
              Serial.println("Write card OK!");
              digitalWrite(LED2,LOW);   //LED lamp for writing card
              delay(1000);
              flag=false;    //Reset interrupt status
            }else{
              Serial.println("Write card Error!");
            }
          }
        }
    //Read card
    blockAddr = 7;                //data block 7
    status = rfid.auth(PICC_AUTHENT1A, blockAddr, sectorNewKeyA[blockAddr/4], rfid.serNum);
    if (status == MI_OK)  //authenticate
    {
      //Read Data
      blockAddr = blockAddr - 3 ; //data block 4
      if( rfid.read(blockAddr, str) == MI_OK)  
      {
        Serial.print("Read from the card ,the data is : ");
        Serial.println((char *)str);
        for(int j=0;j<2;j++)    // LED status for reading card
        {
        digitalWrite(LED1,HIGH);
        digitalWrite(LED2,HIGH);
        delay(500);
        digitalWrite(LED1,LOW);
        digitalWrite(LED2,LOW);
        delay(500);
        }
      }
    }
  rfid.halt();
  flashled();       // LED status for detecting card
}
void WriteCardInterrupt() //Interrupt function
{ 
  digitalWrite(LED2,HIGH);
  flag = true;
}
void flashled()
{
  digitalWrite(LED1,LOW);
  delay(200);
  digitalWrite(LED1,HIGH);
  delay(200);
  Serial.println("Detecting card........");
}

  mfrc522.PICC_HaltA();
  mfrc522.PCD_StopCrypto1();
}

Code liest RFID-UID, vergleicht mit autorisierter ID, aktiviert LED bei Erfolg.

Funktionstest & Verifikation

Erfolgreiche Tag-Erkennung blinkt LED grün (2s), Fehlschlag rot. Serial Monitor zeigt UID und Status. 100% Funktionsrate bei korrekter Verkabelung.

Arduino-RFID Aufbau während des Funktionstests mit grün leuchtender LED

Video-Demo: Arduino erkennt autorisierten Tag → LED ON → Zugang freigegeben.

▶ Video ansehen (MEGA-Link)

Quellen & Literatur

Zurück zu Projekten GitHub Repository