Come utilizzare il modulo RFID RC522 con la scheda UNO R3 attraverso un’interfaccia di comunicazione seriale Serial Peripheral Interface.
Lo scorso martedì, il nostro ineffabile Simone ci ha proposto uno splendido editoriale sul funzionamento teorico dei moduli RFID. Oggi coglieremo la palla al balzo per presentare un esempio di utilizzo di un modulo RFID attraverso Arduino. Come al solito avremo codice commentato e uno schema dei collegamenti.
Il modulo RC522 utilizza un’interfaccia di comunicazione seriale (Serial Peripheral Interface – SPI) per comunicare con controllori come Arduino, Raspberry, Pico e così via. Per maggiori informazioni sul protocollo SPI puoi leggere il nostro articolo introduttivo.
Componenti richiesti:
- (1) x scheda UNO R3 o compatibili
- (1) x Modulo RFID RC522
- (7) x Connettori F-M (connettori di DuPont Femmina Maschio)
Introduzione al componente RC522
Il modulo MFRC522 ha integrato un lettore/scrittore per comunicazioni contactless a 13.65MHz. Il modulo MFRC522 supporta lo standard ISO 14443A / MIFARE.
I componenti interni del MFRC5522 adoperati a trasmettere wireless sono in grado di leggere e scrivere tramite un’antenna disegnata per comunicare con carte e transponder con circuiti attivi secondo lo standard ISO/IEC 14443A/MIFARE. La parte ricevente ha a disposizione un robusto ed efficiente circuito di demodulazione e decodifica per i segnali ISO/IEC 14443A/MIFARE ricevuti da carte e transponder compatibili. La parte digitale comprende un completo frame ISO/IEC 14443A con rilevazioni d’errori ( accoppiamento e controllo a ridondanza ciclica).
Il modulo MFRC5522 è compatibile con i prodotti MIFARE®Classic (e.g. MIFARE Standard). Supporta le comunicazioni MIFARE contactless che utilizzano una velocità di trasferimento superiore a 848kbit/s in entrambe le direzioni.
Le interfacce implementate sono le seguenti:
- Interfaccia SPI
- Seriale UART (Simile alla RS232 con livelli di voltaggio adeguati)
- Interfaccia I2C
L’immagine qui sotto mostra un diagramma tipico del circuito da implementare per utilizzare il modulo MFRC5522.
Schema di collegamento
Codice
Dopo aver effettuato i collegamenti, carica il codice. Non dimenticare di includere il modulo RFID.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 |
#include <SPI.h> #include <MFRC522.h> #define RST_PIN 9 // Configurable, see typical pin layout above #define SS_PIN 10 // Configurable, see typical pin layout above MFRC522 mfrc522(SS_PIN, RST_PIN); // Create MFRC522 instance /* Set your new UID here! */ #define NEW_UID {0xDE, 0xAD, 0xBE, 0xEF} MFRC522::MIFARE_Key key; void setup() { Serial.begin(9600); // Initialize serial communications with the PC while (!Serial); // Do nothing if no serial port is opened (added for Arduinos based on ATMEGA32U4) SPI.begin(); // Init SPI bus mfrc522.PCD_Init(); // Init MFRC522 card Serial.println(F("Warning: this example overwrites the UID of your UID changeable card, use with care!")); // Prepare key - all keys are set to FFFFFFFFFFFFh at chip delivery from the factory. for (byte i = 0; i < 6; i++) { key.keyByte[i] = 0xFF; } } // Setting the UID can be as simple as this: //void loop() { // byte newUid[] = NEW_UID; // if ( mfrc522.MIFARE_SetUid(newUid, (byte)4, true) ) { // Serial.println("Wrote new UID to card."); // } // delay(1000); //} // But of course this is a more proper approach void loop() { // Look for new cards, and select one if present if ( ! mfrc522.PICC_IsNewCardPresent() || ! mfrc522.PICC_ReadCardSerial() ) { delay(50); return; } // Now a card is selected. The UID and SAK is in mfrc522.uid. // Dump UID Serial.print(F("Card 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); } Serial.println(); // Dump PICC type // MFRC522::PICC_Type piccType = mfrc522.PICC_GetType(mfrc522.uid.sak); // Serial.print(F("PICC type: ")); // Serial.print(mfrc522.PICC_GetTypeName(piccType)); // Serial.print(F(" (SAK ")); // Serial.print(mfrc522.uid.sak); // Serial.print(")\r\n"); // if ( piccType != MFRC522::PICC_TYPE_MIFARE_MINI // && piccType != MFRC522::PICC_TYPE_MIFARE_1K // && piccType != MFRC522::PICC_TYPE_MIFARE_4K) { // Serial.println(F("This sample only works with MIFARE Classic cards.")); // return; // } // Set new UID byte newUid[] = NEW_UID; if ( mfrc522.MIFARE_SetUid(newUid, (byte)4, true) ) { Serial.println(F("Wrote new UID to card.")); } // Halt PICC and re-select it so DumpToSerial doesn't get confused mfrc522.PICC_HaltA(); if ( ! mfrc522.PICC_IsNewCardPresent() || ! mfrc522.PICC_ReadCardSerial() ) { return; } // Dump the new memory contents Serial.println(F("New UID and contents:")); mfrc522.PICC_DumpToSerial(&(mfrc522.uid)); delay(2000); } |
La configurazione prevede di decommentare le righe di definizione per il protocollo SPI (#4 e #5). Di seguito una tabella utile per diverse piattaforme:
1 2 3 4 5 6 7 8 9 10 11 |
* Typical pin layout used: * ----------------------------------------------------------------------------------------- * MFRC522 Arduino Arduino Arduino Arduino Arduino * Reader/PCD Uno Mega Nano v3 Leonardo/Micro Pro Micro * Signal Pin Pin Pin Pin Pin Pin * ----------------------------------------------------------------------------------------- * RST/Reset RST 9 5 D9 RESET/ICSP-5 RST * SPI SS SDA(SS) 10 53 D10 10 10 * SPI MOSI MOSI 11 / ICSP-4 51 D11 ICSP-4 16 * SPI MISO MISO 12 / ICSP-1 50 D12 ICSP-1 14 * SPI SCK SCK 13 / ICSP-3 52 D13 ICSP-3 15 |
Come vedete, Arduino UNO utilizzerà i pin 9, 10, 11, 12 e 13 mentre altre schede Arduino potranno essere configurate secondo lo schema.
Il codice per il funzionamento del sistema RFID RC522 potrebbe spaventare. In realtà possiamo leggerlo come sempre a blocchi.
Nel Setup() inizializziamo la seriale,aspettiamo una risposta, inizializziamo il bus SPI, creiamo un oggetto RFID e azzeriamo l’UID (User ID) del nostro modulo o card.
Di seguito nella sezione Loop() commentata, è presentato uno dei sistemi standard per inserire un nuovo UID sul dispositivo, utilizzando il classico sistema di scrittura in un array. Pur trattandosi di una procedura valida, questo sistema non rappresenta il massimo dal punto di vista della pulizia del codice.
Il Loop() corretto parte invece dalla riga 37 e rappresenta una macchina a stati.
- Se non sono presenti cards o dispositivi, esci dal ciclo
- Se è stato trovato un dispositivo, esegui il dump del suo UID
- La successiva sezione commentata esegue l’eventuale dump dei dati presenti sul dispositivo
- A Riga 70 viene inserito il nuovo UID del dispositivo
- A Riga 76 il lettore viene resettato per poter acquisire i nuovi dati inseriti nella scheda
- A Riga 82 viene richiesto il dump dei nuovi dati presenti nella scheda
Nota 1: Possiamo usare l’UID come numero di stanza per creare una chiave elettronica.
Nota 2: No, le chiavi elettroniche degli alberghi sono molto più complesse. Esse implicano un payload tra 1024 e 4096 byte contenente chiavi pubbliche e private con le quali codificare la combinazione della serratura…
Iscriviti ai nostri gruppi Telegram
Link utili
- Arduino UNO R3
- Elegoo UNO R3
- Arduino Starter Kit per principianti
- Elegoo Advanced Starter Kit
- Arduino Nano