O módulo RFID RC522 é um leitor de cartões inteligentes que, entre outras coisas, permite ativar um mecanismo quando o cartão certo é apresentado ao leitor. Usaremos aqui o módulo RC522, que é o mais comum.
Pré-requisito: Dar sentidos ao seu robô
Material
- Computador
- Arduino
- Cabo USB para ligar a placa Arduino ao PC
- Módulo RFID RC522
Esquema
O módulo RC522 RFID comunica com o Arduino por meio do protocolo SPI. A comunicação SPI usa pinos específicos dos microcontroladores Arduino.
O pinout é o seguinte (lado esquerdo RC522, lado direito Arduino UNO):
- Vcc <-> 3V3 (ou 5V, dependendo da versão do módulo)
- RST (Reset) <-> 9
- GND (Terra) <-> GND
- MISO (Master Input Slave Output) <-> 12
- MOSI (Master Output Slave Input) <-> 11
- SCK (Serial Clock) <-> 13
- SS/SDA (Slave select) <-> 10
Atenção: Dependendo da versão do módulo, a tensão de alimentação pode ser diferente (3,3V ou 5V). Verifique a tensão de alimentação do seu módulo.
Código para ler um cartão RFID
Para utilizar o módulo RFID RC522, usamos a biblioteca SPI.h, que permite estabelecer a comunicação entre a placa Arduino e o módulo. Usamos também a biblioteca MFRC522.h, que permite dialogar com o módulo.
#include <SPI.h> #include <MFRC522.h> // INPUT #define SS_PIN 10 #define RST_PIN 9 MFRC522 rfid(SS_PIN, RST_PIN); // Init array that will store new NUID byte nuidPICC[4]; void setup() { Serial.begin(9600); SPI.begin(); // Init SPI bus rfid.PCD_Init(); // Init MFRC522 Serial.println(F("Scan RFID NUID...")); } void loop() { readRFID(); delay(200); } // void readRFID() { // Look for new card if ( ! rfid.PICC_IsNewCardPresent()) return; // Verify if the NUID has been readed if ( !rfid.PICC_ReadCardSerial()) return; if (rfid.uid.uidByte[0] != nuidPICC[0] || rfid.uid.uidByte[1] != nuidPICC[1] || rfid.uid.uidByte[2] != nuidPICC[2] || rfid.uid.uidByte[3] != nuidPICC[3] ) { Serial.println(F("A new card has been detected.")); // Store NUID into nuidPICC array for (byte i = 0; i < 4; i++) { nuidPICC[i] = rfid.uid.uidByte[i]; } Serial.print(F("RFID tag in dec: ")); printDec(rfid.uid.uidByte, rfid.uid.size); Serial.println(); } // Halt PICC rfid.PICC_HaltA(); // Stop encryption on PCD rfid.PCD_StopCrypto1(); } /** * Helper routine to dump a byte array as dec values to Serial. */ void printDec(byte *buffer, byte bufferSize) { for (byte i = 0; i < bufferSize; i++) { Serial.print(buffer[i] < 0x10 ? " 0" : " "); Serial.print(buffer[i], DEC); } }
Aplicação
Uma típica aplicação do módulo RFID é fazer abrir um mecanismo quando o crachá correto é apresentado ao leitor.
Para isso, utilizamos um módulo RFID e um servomotor que servirá como fechadura controlada. O servomotor pode ser substituído por um solenoide, um relé ou outro motor, dependendo do mecanismo que se pretende utilizar.
Para o programa, vamos reutilizar o código de leitura do cartão RFID e comparar o valor lido com o valor que pretendemos usar para abrir o sistema. Se o valor estiver correto, o servomotor é ativado e o LED integrado se acende.
#include <SPI.h> #include <MFRC522.h> #include <Servo.h> /**************************PARAMETERS******************************/ const int ipadd[4] = {103, 97, 67, 25}; //ip address à modifier selon la carte int servoOpen = 180; int servoClose = 0; int delayBeforeClosing = 1000; /******************************************************************/ // INPUT #define SS_PIN 10 #define RST_PIN 9 // OUTPUT const int servoPin = 6; const int ledPin = 13; Servo servo; MFRC522 rfid(SS_PIN, RST_PIN); bool approved = 0, oldApproved = 0; // Init array that will store new NUID byte nuidPICC[4]; void setup() { Serial.begin(9600); SPI.begin(); // Init SPI bus rfid.PCD_Init(); // Init MFRC522 pinMode(ledPin, OUTPUT); servo.write(servoClose); servo.attach(servoPin); Serial.println(F("Scan RFID NUID...")); } void loop() { readRFID(); if (nuidPICC[0] == ipadd[0] && nuidPICC[1] == ipadd[1] && nuidPICC[2] == ipadd[2] && nuidPICC[3] == ipadd[3]) { approved = true; if (approved != oldApproved) { Serial.println(F("Card approved!")); digitalWrite(ledPin, HIGH); servo.write(servoOpen); delay(delayBeforeClosing); } nuidPICC[0] = 0; nuidPICC[1] = 0; nuidPICC[2] = 0; nuidPICC[3] = 0; } else { approved = false; if (approved != oldApproved) { Serial.println(F("Card incorrect!")); digitalWrite(ledPin, LOW); servo.write(servoClose); } } oldApproved = approved; } // void readRFID() { // Look for new 1 cards if ( ! rfid.PICC_IsNewCardPresent()) return; // Verify if the NUID has been readed if ( !rfid.PICC_ReadCardSerial()) return; if (rfid.uid.uidByte[0] != nuidPICC[0] || rfid.uid.uidByte[1] != nuidPICC[1] || rfid.uid.uidByte[2] != nuidPICC[2] || rfid.uid.uidByte[3] != nuidPICC[3] ) { Serial.println(F("A new card has been detected.")); // Store NUID into nuidPICC array for (byte i = 0; i < 4; i++) { nuidPICC[i] = rfid.uid.uidByte[i]; } Serial.print(F("RFID tag in dec: ")); printDec(rfid.uid.uidByte, rfid.uid.size); Serial.println(); } // Halt PICC rfid.PICC_HaltA(); // Stop encryption on PCD rfid.PCD_StopCrypto1(); } /** Helper routine to dump a byte array as dec values to Serial. */ void printDec(byte *buffer, byte bufferSize) { for (byte i = 0; i < bufferSize; i++) { Serial.print(buffer[i] < 0x10 ? " 0" : " "); Serial.print(buffer[i], DEC); } }
Fontes
Retrouvez nos tutoriels et d’autres exemples dans notre générateur automatique de code
La Programmerie