Componentes · 6 min de leitura

Como usar o RFID RC522: lendo cartões com Arduino e uma fechadura acionada por cartão

Como funciona o módulo RFID RC522? Cartões e chaveiros de 13,56 MHz, ligação SPI em 3,3 V, a biblioteca MFRC522, leitura do UID, verificação de cartões autorizados, uma fechadura com servo e uso no ESP32 e no Pico.

RFID (Radio Frequency IDentification, identificação por radiofrequência) é uma tecnologia que identifica um cartão ou chaveiro por ondas de rádio, sem encostar no leitor. Cartões de transporte, crachás de acesso de escritórios, etiquetas antifurto de lojas e microchips de animais de estimação usam RFID. O RC522 é um módulo leitor barato que funciona em 13,56 MHz e normalmente é vendido com um cartão branco e um chaveiro azul. Ele é a base de muitos projetos, de fechaduras com cartão a sistemas de controle de presença.

Módulo leitor RFID RC522
Módulo RFID RC522: a trilha de cobre na placa é a antena do leitor; ao lado estão um cartão e um chaveiro que ele lê.

Como funciona o RFID?

A antena de cobre da placa leitora cria um campo magnético de 13,56 MHz. Dentro do cartão ou do chaveiro há uma bobina fina e um chip minúsculo, mas nenhuma bateria. Quando o cartão se aproxima do campo, a energia induzida na bobina alimenta o chip, e o chip envia sua identidade e seus dados de volta ao leitor alterando o campo muito de leve. É por isso que os cartões funcionam por anos sem nunca serem carregados, mas, com o RC522, a distância de leitura é de apenas cerca de 3–5 centímetros.

Os cartões dos kits normalmente são MIFARE Classic 1K: o 1 KB de memória é dividido em 16 setores, cada um com 4 blocos de 16 bytes. Todo cartão tem um UID (identificador único) gravado na fábrica, normalmente com 4 bytes. A maioria dos projetos simples reconhece um cartão lendo esse UID, em vez de gravar dados no cartão.

Especificações do RC522

CaracterísticaValor
Frequência de operação13,56 MHz
Alimentação3,3 V (não 5 V)
Consumo de corrente13–26 mA
Distância de leituraCerca de 3–5 cm (depende do cartão)
Cartões compatíveisMIFARE Classic 1K/4K, Ultralight, NTAG (ISO 14443A)
InterfaceSPI (o chip também aceita I2C e UART)

Ligação do RC522 (SPI)

O RC522 conversa com a placa por SPI. Os pinos SCK, MOSI e MISO precisam ir nos pinos SPI fixos de cada placa, enquanto o SDA (SS) e o RST podem ir em qualquer pino digital, desde que o código corresponda. Você pode consultar os pinos SPI da sua placa na ferramenta Pinagem.

Pino do RC522Arduino UnoArduino MegaESP32Raspberry Pi Pico
SDA (SS)D1053GPIO 5GP17
SCKD1352GPIO 18GP18
MOSID1151GPIO 23GP19
MISOD1250GPIO 19GP16
IRQNão conectadoNão conectadoNão conectadoNão conectado
GNDGNDGNDGNDGND
RSTD95GPIO 22GP20
3.3V3.3V3.3V3V33V3
Nunca ligue o RC522 no pino 5V; o módulo funciona com 3,3 V, e 5 V pode danificá-lo para sempre. Muita gente liga direto nos pinos de dados de 5 V do Uno e normalmente funciona, mas oficialmente o chip não tolera 5 V. Para projetos que vão funcionar por muito tempo, um conversor de nível é mais seguro; o ESP32 e o Pico já funcionam com 3,3 V, então não têm esse problema.

A biblioteca MFRC522 e a leitura do UID do cartão

No Gerenciador de Bibliotecas, busque MFRC522 e instale a biblioteca de GithubCommunity (miguelbalboa). O código abaixo mostra no Monitor Serial, em hexadecimal (HEX), o UID de cada cartão que você aproximar:

C++ (Arduino IDE)
1#include <SPI.h>
2#include <MFRC522.h>
3
4const int SS_PIN = 10;
5const int RST_PIN = 9;
6
7MFRC522 rfid(SS_PIN, RST_PIN);
8
9void setup() {
10  Serial.begin(9600);
11  SPI.begin();
12  rfid.PCD_Init();
13  Serial.println("Kartı okutun / scan a card");
14}
15
16void loop() {
17  if (!rfid.PICC_IsNewCardPresent() || !rfid.PICC_ReadCardSerial()) return;  // kart yok / no card
18
19  Serial.print("UID:");
20  for (byte i = 0; i < rfid.uid.size; i++) {
21    Serial.print(rfid.uid.uidByte[i] < 0x10 ? " 0" : " ");
22    Serial.print(rfid.uid.uidByte[i], HEX);
23  }
24  Serial.println();
25
26  rfid.PICC_HaltA();        // kartı beklemeye al / halt the card
27  rfid.PCD_StopCrypto1();
28}
Anote os UIDs do seu cartão e do seu chaveiro; no próximo passo, você vai usá-los como "cartões autorizados". Se nenhum cartão for lido, carregue Arquivo > Exemplos > MFRC522 > DumpInfo; se o Monitor Serial mostrar "Firmware Version: 0x0" ou "0xFF", o problema está na sua ligação.

Verificando um cartão autorizado

Comparando o UID lido com um valor que você guardou, você decide se o cartão está autorizado. O exemplo abaixo verifica um único cartão autorizado; para vários cartões, basta deixar o array bidimensional e comparar em um loop:

C++ (Arduino IDE)
1// yukarıdaki tanımlar ve setup() aynen / definitions and setup() as above
2byte allowed[4] = {0xDE, 0xAD, 0xBE, 0xEF};   // kendi kartının UID'si / your card's UID
3
4bool isAllowed() {
5  if (rfid.uid.size != 4) return false;
6  for (byte i = 0; i < 4; i++) {
7    if (rfid.uid.uidByte[i] != allowed[i]) return false;
8  }
9  return true;
10}
11
12void loop() {
13  if (!rfid.PICC_IsNewCardPresent() || !rfid.PICC_ReadCardSerial()) return;
14  Serial.println(isAllowed() ? "İzin verildi / access granted" : "Reddedildi / access denied");
15  rfid.PICC_HaltA();
16  rfid.PCD_StopCrypto1();
17}

Uma fechadura com cartão acionada por servo

Vamos montar uma fechadura que gira um servo 90 graus para abrir durante 3 segundos quando um cartão autorizado é aproximado, e que dá um bipe curto de aviso com um buzzer para um cartão não autorizado. Para a ligação do servo, veja O que é servo motor?, e para o som de aviso, O que é buzzer? No Uno, a biblioteca Servo usa o Timer1 e o tone() usa o Timer2, então os dois funcionam juntos sem problema.

C++ (Arduino IDE)
1#include <SPI.h>
2#include <MFRC522.h>
3#include <Servo.h>
4
5MFRC522 rfid(10, 9);       // SS, RST
6Servo lock;
7const int BUZZER_PIN = 8;
8byte allowed[4] = {0xDE, 0xAD, 0xBE, 0xEF};
9
10void setup() {
11  SPI.begin();
12  rfid.PCD_Init();
13  lock.attach(6);
14  lock.write(0);                          // kilitli / locked
15}
16
17void loop() {
18  if (!rfid.PICC_IsNewCardPresent() || !rfid.PICC_ReadCardSerial()) return;
19  bool ok = rfid.uid.size == 4 && memcmp(rfid.uid.uidByte, allowed, 4) == 0;
20  if (ok) {
21    lock.write(90);                       // kilidi aç / unlock
22    delay(3000);
23    lock.write(0);                        // tekrar kilitle / lock again
24  } else {
25    tone(BUZZER_PIN, 400, 600);           // reddedildi sesi / denied beep
26  }
27  rfid.PICC_HaltA();
28  rfid.PCD_StopCrypto1();
29}
Uma fechadura que só confere o UID serve para aprender e para projetos de hobby, mas não é segurança de verdade: os UIDs MIFARE Classic podem ser copiados com aparelhinhos baratos. Para uma porta de verdade, peça também uma senha além do cartão, ou verifique informações guardadas em setores criptografados.

RC522 com o ESP32 e o Raspberry Pi Pico

A mesma biblioteca MFRC522 roda no ESP32; use os pinos VSPI e declare o objeto como MFRC522 rfid(5, 22);. Como o ESP32 funciona com 3,3 V, ele combina perfeitamente com o RC522 e, graças ao Wi-Fi, você pode registrar na internet os cartões lidos. No Pico com MicroPython, copie para o Pico um arquivo mfrc522.py (por exemplo, a biblioteca de danjperron) e use-o assim:

Python
1from mfrc522 import MFRC522      # mfrc522.py Pico'da olmalı / mfrc522.py must be on the Pico
2import time
3
4reader = MFRC522(spi_id=0, sck=18, miso=16, mosi=19, cs=17, rst=20)
5
6while True:
7    reader.init()
8    stat, tag_type = reader.request(reader.REQIDL)
9    if stat == reader.OK:
10        stat, uid = reader.SelectTagSN()
11        if stat == reader.OK:
12            print("UID:", "".join("{:02X}".format(b) for b in uid))
13    time.sleep_ms(200)

Tipos de RFID: quais cartões o RC522 lê?

TipoFrequênciaDistância de leituraUso típico
RFID LF125 kHzCerca de 10 cmCartões de acesso antigos, microchips de animais (EM4100)
RFID HF / NFC13,56 MHz1–10 cmCartões de transporte, MIFARE, NFC de celulares
RFID UHF860–960 MHzVários metrosEtiquetas de armazém, logística e varejo

O RC522 só lê cartões HF de 13,56 MHz. Os cartões de 125 kHz usados na entrada de muitos prédios (muitas vezes marcados com "EM") não podem ser lidos pelo RC522; eles precisam de um leitor de 125 kHz, como o RDM6300. O NFC é um tipo de RFID de 13,56 MHz que os celulares conseguem ler; o RC522 consegue ler o UID de adesivos NTAG.

Ideias de projetos com RFID

  • Fechadura de porta ou gaveta com cartão: uma fechadura que abre com um cartão autorizado e avisa quando é um não autorizado.
  • Sistema de controle de presença: associe cada cartão a um nome e registre o horário de chegada em um cartão SD ou na internet.
  • Display de boas-vindas: mostre "Welcome" e o nome da pessoa em um LCD quando um cartão for aproximado; para o display, veja Como usar um display LCD I2C.
  • Caixa de histórias: associe um arquivo de som diferente a cada cartão e faça um brinquedo sonoro para crianças com um DFPlayer.
  • Comedouro inteligente para pets: libere ração quando a etiqueta da coleira do animal for lida.
  • Jogo de cartas: monte um quiz ou um jogo da memória com cartões.

Erros comuns e como resolvê-los

  • Nenhum cartão é lido e a versão aparece como 0x0: os fios SPI estão nos pinos errados; confira principalmente o MOSI e o MISO.
  • Ligar o módulo no 5V: o RC522 funciona com 3,3 V; 5 V pode queimá-lo.
  • Tentar ler um cartão de 125 kHz: o RC522 não enxerga esses cartões; use um cartão de 13,56 MHz.
  • O cartão está longe demais ou sobre uma superfície metálica: aproxime o cartão a 1–3 cm; superfícies metálicas atrapalham o campo.
  • O mesmo cartão é lido várias vezes seguidas: o PICC_HaltA() não é chamado; pare o cartão depois de lê-lo.
  • Fios longos: os sinais SPI se degradam em fios longos; mantenha-os com menos de 20 cm.

O RFID responde à pergunta "quem é você?" com uma única aproximação, o que acrescenta muito a projetos de segurança e automação. No app BlueGrays você encontra projetos de leitura de RFID, leitor de cartões com LCD e fechadura RFID com servo passo a passo, com esquemas do circuito e código.

Perguntas frequentes

A que distância o RC522 consegue ler um cartão?

Com os cartões e chaveiros dos kits, ele normalmente lê a 3–5 cm. O tipo de cartão, o tamanho da antena e metais por perto afetam a distância. Para alcances maiores, você precisa de leitores UHF, que funcionam em outras frequências.

Quais cartões o RC522 lê? Ele lê cartões de 125 kHz?

O RC522 só lê cartões ISO 14443A de 13,56 MHz, como MIFARE Classic 1K/4K, Ultralight e etiquetas NTAG. Ele não lê os cartões EM de 125 kHz comuns na entrada de prédios; para esses, usa-se um leitor de 125 kHz, como o RDM6300.

O RC522 funciona com 5V?

Não, o RC522 precisa ser alimentado com 3,3 V. Ligá-lo no pino 5V pode danificar o módulo. Os pinos de dados normalmente aguentam os sinais de 5 V do Uno, mas, como o chip oficialmente não tolera 5 V, um conversor de nível é recomendado para projetos permanentes.

O UID de um cartão pode mudar ou ser copiado?

O UID de um cartão normal é gravado na fábrica e não muda. Porém, existem cartões "mágicos" cujo UID pode ser alterado, e os UIDs MIFARE Classic podem ser copiados para eles. É por isso que um sistema que confia só no UID não oferece segurança de verdade.

Posso gravar dados em um cartão com o RC522?

Sim. Nos cartões MIFARE Classic, cada setor é protegido por uma chave; em cartões novos, a chave padrão é FF FF FF FF FF FF. Com o exemplo ReadAndWrite da biblioteca MFRC522, você grava dados nos blocos e os lê de volta. O último bloco de cada setor guarda as chaves, então não grave dados aleatórios nele.

Posso usar o celular como cartão no RC522?

Normalmente não de forma confiável. O iPhone não libera o NFC para emulação de cartão, e os celulares Android enviam um UID aleatório que muda a cada aproximação. Para um sistema baseado no celular, é melhor ler uma etiqueta NFC com o celular e enviar o resultado para a placa por Wi-Fi ou Bluetooth.

Ver todos os projetos
Leitura de valores RFID
#53Iniciante
Premium

Leitura de valores RFID

O chaveiro de acesso do seu prédio ou seu cartão de entrada guarda um número de identificação oculto, e este projeto faz a leitura dele. Aproxime o cartão do leitor RFID e o Arduino escreve o número d

4.7(47)
61
Leitor de cartões RFID RC522 com ESP32 e LCD
#123Intermediário

Leitor de cartões RFID RC522 com ESP32 e LCD

Neste projeto, vamos conectar o módulo RFID RC522, baseado no MFRC522, ao ESP32 via SPI e ler o UID do cartão ou da etiqueta. Isso serve de base para aplicações como fechaduras, sistemas de associados e controle de acesso. Vamos exibir o UID lido em um display LCD; nesta versão, ele não é comparado com uma lista de cartões autorizados. ATENÇÃO: o RC522 funciona apenas com 3,3V; alimentá-lo com 5V queima o módulo!

4.8(21)
39
Fechadura RFID com ESP32 (RC522 + servo + OLED + buzzer + LED)
#137Avançado
Premium

Fechadura RFID com ESP32 (RC522 + servo + OLED + buzzer + LED)

Vamos montar uma fechadura inteligente com ESP32, módulo RFID RC522, servo motor SG90, display OLED SSD1306, buzzer ativo e 2 LEDs. Ao ler um cartão, seu UID é comparado à lista de cartões autorizados definida no código. Se estiver autorizado, o servo motor gira para abrir a fechadura (LED verde + 2 bipes curtos), que trava novamente após 5 segundos. Com um cartão não autorizado, o LED vermelho acende, 3 bipes rápidos soam e o UID lido aparece no OLED.

4.8(9)
15
Cofre eletrônico inteligente
#92Avançado
Premium

Cofre eletrônico inteligente

Um pequeno cofre para guardar seus objetos de valor, que abre com uma senha. Você digita sua senha de quatro dígitos no teclado; se estiver correta, o servo motor abre a trava, a luz verde acende e o

4.7(42)
63
Fechadura com senha, teclado 4x4 e LCD
#64Avançado
Premium

Fechadura com senha, teclado 4x4 e LCD

Uma pequena fechadura eletrônica que impede a entrada de quem não sabe a senha. Você pressiona a cerquilha e digita a senha no teclado. Se estiver correta, o display indica que o acesso foi permitido,

4.8(59)
75
Alarme de movimento com ESP32 (PIR + buzzer + LED + Telegram)
#145Avançado
Premium

Alarme de movimento com ESP32 (PIR + buzzer + LED + Telegram)

Um sistema de alarme de segurança inteligente que aciona o buzzer e o LED quando o sensor PIR detecta movimento e, ao mesmo tempo, envia uma notificação instantânea ao proprietário pelo Telegram. Inclui um intervalo de espera de 30 segundos para limitar a frequência dos alarmes repetidos; esse mecanismo não valida as detecções do PIR nem elimina disparos falsos. Pode ser usado na segurança de casas, no monitoramento de garagens, depósitos ou salas de trabalho.

0.0(0)
9
Display LCD I2C com ESP32 (16x2)
#119Intermediário
Premium

Display LCD I2C com ESP32 (16x2)

Neste projeto, exibimos texto conectando um display LCD de 16x2 caracteres ao ESP32 pelo protocolo I2C. Com o I2C, controlamos o display usando apenas dois pinos de dados (SDA e SCL), dispensando o uso de seis ou mais pinos da conexão paralela tradicional. O código mostra uma mensagem fixa na primeira linha e um contador que aumenta a cada segundo na segunda linha. Na inicialização, também executamos um scanner I2C para mostrar o endereço do display no Monitor Serial (geralmente 0x27 ou 0x3F).

4.9(23)
40