Restricted access to devices via contactless card with the NodeMCU and the RC522 module

In this multi-part series, we dedicate ourselves to the possibilities of access restriction to devices or systems with contactless cards of the MiFare series using the relatively far-faded RFID RC522 module.

In the first part of this series, we take a look at what components we need, what our hardware base looks like and how to program a first card application. In this application, a relay is turned on and off by an authorized card defined in the program code. A multicolored LED indicates whether the card is authorized (was) to switch the relay or not. Potential-free consumers can be switched through the relay. The following shall apply:

WARNING!! During the switching of loads over 30 volts or 230 volts mains voltage, there is a danger of life due to an electrical shock. Please pay attention to a suitable insulation and to the standard protection regulations and operating regulations according to DIN VDE 0105.

In particular, the 5 security rules shall always be applied: https://de.wikipedia.org/wiki/F%C3%BCnf_Sicherheitsregeln are to be read.

But now we come back to our project and our part-list. You need the following parts:

1x NodeMcu

1x 2-speed relay

1x RC522 CardReader + Mifare Classic Card

1x Power adapter adapter

1x RGB LED Module

Notes:

In the RC522 Cardreader package MiFare Classic cards are already included, which are completely sufficient for our project. Therefore, it is not necessary to order separate RfId cards.

In the KY-016 LED RGB module, the pre-residues are already included for direct operation at the port pins. Therefore, these are no longer needed separately. If you prefer to work without the RGB module, the RGB Led with a common cathode will require 3x 220 Ohm rebooths.

The pin mapping for the RGB LED is:

Output NodeMcU

LED Color

D2

(B)

D3

(G)

D4

(R) ot

On a breadboard, the components are now connected to each other as follows:

The circuit looks like this:

The current demand of the circuit when the relay is activated is clearly visible on the image. This voltage is approximately 8 volts. 190 mA. Without the activated relay, the power requirement is approx. 110 mA. It is therefore important to connect an external voltage source and not to rely on the USB power supply.

After we have built all the components together, we put our Arduino DIE on the support of the ESP8266 chip, select under Tools-> Board the "Generic ESP8266 Module". Then we choose among tools Port the COM port to which our NodeMcu is connected. We now insert the following code:

 

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

#define RST_PIN     5   // SPI reset pin (D1 output)
#define RELAIS_PIN  16  // Relay (D0 output) [LOW Active]-Also internal LED near USB port
#define SS_PIN      15  // SPI Slave Select Pin

#define RGBLED_R    2   // Red (D4 exit) 
#define RGBLED_G    0   // Green (D3 output)-Also internal LED on the ESP module
#define RGBLED_B    4   // Blue (D2 exit)

#define LED_BUILTIN 16
#define PIN_WIRE_SDA 4 
#define PIN_WIRE_SCL 5 
 
MFRC522 mfrc522(SS_PIN, RST_PIN);   // Create an instance of the MFRC522
MFRC522::MIFARE_Key key;

byte myValidCardUID[4] = {0x00,0x00,0x00,0x00}; // Here the serial interface read                                                 // enter the UID for which the reading will be made in the future                                                 // will be valid, and the relay will be switched                                                  //
void setup() {   pinMode(RST_PIN,OUTPUT);   pinMode(RELAIS_PIN,OUTPUT);   pinMode(RGBLED_R,OUTPUT);   pinMode(RGBLED_G,OUTPUT);   pinMode(RGBLED_B,OUTPUT);   digitalWrite(RELAIS_PIN,HIGH);    // relay inactive   digitalWrite(RST_PIN,HIGH);   digitalWrite(RGBLED_R,LOW);       // Led Out   digitalWrite(RGBLED_G,LOW);   digitalWrite(RGBLED_B,LOW);   Serial.begin(9600);               // Serielle Kommunikation mit dem PC initialisieren   Serial.println("Ser. Komm. OK.");    SPI.begin();                      // Initialisiere SPI Kommunikation   digitalWrite(RST_PIN,LOW);   delay(300);   digitalWrite(RST_PIN,HIGH);   mfrc522.PCD_Reset();   mfrc522.PCD_Init();               // Initialisiere MFRC522 Lesemodul   mfrc522.PCD_AntennaOn();   yield();   digitalWrite(RGBLED_R,HIGH);     //Led Farbe Lila - Initialisierung abgeschlossen   digitalWrite(RGBLED_G,LOW);   digitalWrite(RGBLED_B,HIGH);
}
 
void loop()   {   if (mfrc522.PICC_IsNewCardPresent() && mfrc522.PICC_ReadCardSerial() )   // PICC = proximity integrated circuit card                                                                                                                                            // kontaktlose Chipkarte   {     Serial.print("PICC UID:");     for (byte i = 0; i < mfrc522.uid.size; i++)      {       Serial.print(mfrc522.uid.uidByte[i] < 0x10 ? " 0" : " ");       Serial.print(mfrc522.uid.uidByte[i], HEX);     } 
 bool IsValid = true;    for (byte i = 0; i < sizeof(myValidCardUID); i++)      {     if (mfrc522.uid.uidByte[i] != myValidCardUID[i]) { IsValid = false; }        }    if (IsValid)    {       bool PinState= digitalRead(RELAIS_PIN);       PinState = !PinState;       digitalWrite(RELAIS_PIN, PinState);            digitalWrite(RGBLED_R,LOW);     //Led Grün       digitalWrite(RGBLED_G,HIGH);       digitalWrite(RGBLED_B,LOW);       Serial.print("  gültig.");       delay(2000);       digitalWrite(RGBLED_R,LOW);     //Led Farbe Blau Leser ist in Grundzustand       digitalWrite(RGBLED_G,LOW);       digitalWrite(RGBLED_B,HIGH);     } else    {        digitalWrite(RGBLED_R,HIGH);     //Led Rot - Letzte Karte war ungültig       digitalWrite(RGBLED_G,LOW);       digitalWrite(RGBLED_B,LOW);       Serial.print(" ungültig.");       delay(2000);       }      Serial.println();      mfrc522.PICC_HaltA();       // Versetzt die aktuelle Karte in einen Ruhemodus.     delay(1000);   }   yield(); // interne ESP8266 Funktionen aufrufen
}

 

Wir kompilieren den Code und laden Ihn auf unsere NodeMcu hoch. Während des Hochladens des Sketches leuchtet unsere RGB Led „rot“. Nach erfolgreichem Upload wechselt die Farbe der LED auf „lila“. Durch den Wechsel der Farbe wird angezeigt, das der Upload Vorgang erfolgreich war.

Damit ein Hochladen auf die NodeMcu funktioniert, muss während der Kompiliervorganges der Taster „Flash“ auf der NodeMcu gedrückt werden und gedrückt gehalten werden.

Wenn der Upload -Vorgang erfolgreich abgeschlossen wurde, starten wir in der IDE unser Serielles Terminal und stellen die Übertragungsgeschwindigkeit auf 9600 Baud ein.

Nun ist unser Leser bereit die erste Karte einzulesen. Diese wird natürlich nicht als zugangsberechtigt angesehen, da unser Leser ja Ihre ID noch nicht kennt. Die Ausgabe im Terminal sollte dann wie folgt aussehen:

Dies ist eine erwartete Ausgabe. Damit diese Karte von unserem Leser zukünftig als gültig akzeptiert wird, ändern wir nun die Zeile „byte myValidCardUID[4] = {0x00,0x00,0x00,0x00};“ in „byte myValidCardUID[4] = {0x16,0x15,0x8D,0x05};“ kompilieren neu und laden unseren Code auf die Node MCU hoch. Danach wird diese Karte als gültig erkannt und man kann das Relais durch vorhalten der gültigen Karte umschalten. Dies wird durch ein 2 sekündiges grünes leuchten der LED bestätigt.

Falls eine ungültige Karte vorgehalten wird, schaltet die LED auf dauerhaft „rot“. Es ist somit erkennbar, ob in der Vergangenheit ein Fehlversuch durch eine nicht autorisierte Karte erfolgte.

Der Aufmerksame Leser wird sich sicherlich fragen, warum wir für diese Aufgabe eine NodeMcu verwenden, da diese Aufgabe z.B. auch durch einen Arduino Uno erfüllt werden könnte. Dies ist zwar prinzipiell richtig, jedoch wollen wir unseren Kartenleser um komfortable Konfigurationsmöglichkeiten per Netzwerk erweitern sowie Sicherheitsfunktionen ergänzen. All das ist aber Teil der kommenden Teile dieser Reihe.

The author recommends that the system described here not be used as access control for door systems or other security-critical systems, since the PICC "Mifare Classic" on which the system is based has already been cracked and therefore classified as unsafe.

Have fun copying and until the next post :) Tobias Kuch

 

Esp-8266Projects for advanced

8 comments

Harald

Harald

Hallo,
Einer von vielen sehr hilfreichen Artikeln. Allerdings auch mit einer Frage. hat sich schon mal jemand daran getraut diesen Card Reader per I2C anzusprechen. Angeblich kann das Funktionieren und würde mir viele Eingänge bringen.

Frank Carius

Frank Carius

Schaut euch vielleicht mal https://github.com/esprfid/esp-rfid) an. Das ist quasi eine fertige Firmware wie Tasmota, ESPEasy, ESPurna nur mit dem Fokus auf RFID.
Läuft vermutlich out of the Box mit eurem Hardware setup

Interessant wäre es natürlich mal, wie man z.B. eine EC-Karte/Kreditkarte mit dem RC522 nicht nur liest, sondern vielleicht einen Challenge sendet und den REsponse liest. Dann wäre es sicherer als einfach nur “Seriennummer lesen”

Michael

Michael

Hallo zusammen,
cooles Projekt. Ich versuche die Sensitivität des RC522 durch die Ergänzung der Initialisierung PCD_WriteRegister(RFCfgReg, (0×07<<4)); im File MRFC522.cpp zu erhöhen.
Leider ohne Erfolg.
Habt jemand schon mal erfolgreich die Reichweite des RC522 erhöht?
Die Reichweite ist für mein Projekt zu gering :-(.

Vielen Dank für alle Hinweise

Jörg

Jörg

Hallo,
toller Artikel, der Aufbau funktioniert nach einigem Hin und Her
(LED leuchtet lila), aber die LED reagiert nicht, wenn ich eine RFID-Karte davor halte.
Im seriellen Monitor gibt es keine Reaktion.
Ich habe es mit zwei unterschiedlichen Cardreadern und Karten versucht.
Was kann ich noch machen?

Vielen Dank und Grüße
Jörg

Paul

Paul

Ein super Projekt.

Hat auf Anhieb funktioniert. (Nur das kopieren des Codes muss man manuell machen, über den Button kommen die ein anderer schon schreibt Fehler rein.)
Ich gehe direkt zum Teil 2.

Heiko

Heiko

Hallo zusammen,
die Fehlermeldung ist geklärt.
Durch das Kopieren von der Internetseite werden statt Leerzeichen im Code Sonderzeichen eingetragen.
Die habe ich dann alle ersetzt durch Leerzeichen und schon läufts.

Danke trotzdem

Weiter so, ist ein Super Blog. Sehr interessant und leicht zu verstehen.

Heiko

Heiko

Hallo zusammen,
tolles Projekt.
Habe alles aufgebaut.
Ich bekomme die Fehlermeldung stray ‘\302’ in program
Alle Librarys sind installiert (meiner Meinung nach).
Der Reader ist in Ordnung, liest die Karten ordnungsgemäß ein.
Ist getestet mit einem anderen Programm.

Kann mir jemand erklären was es mit dieser Fehlermeldung auf sich hat?

Vielen Dank im voraus

Mathias Päzolt

Mathias Päzolt

Hallo,
sehr interessanter Artikel, aber ich wäre nicht ich, wenn ich nicht was zu meckern hätte :-)
Da ich ein anderes RFID-Modul verwende (VMA405 von Velleman, fand sich noch in der Bastelkiste) wäre ein mapping für alle Kontakte sehr sinnvoll, da sich mein Modul in der Beschaltung unterscheidet.

Leave a comment

All comments are moderated before being published

Recommended blog posts

  1. Install ESP32 now from the board manager
  2. Lüftersteuerung Raspberry Pi
  3. Arduino IDE - Programmieren für Einsteiger - Teil 1
  4. ESP32 - das Multitalent
  5. OTA - Over the Air - ESP programming via WLAN