Arduino - Sistema de Fechadura de Porta com RFID/NFC

Neste tutorial, vamos aprender a fazer um Sistema de Fechadura de Porta com RFID/NFC usando Arduino, Kit RFID/NFC RC522 e fechadura eletromagnética ou fechadura solenoide.

※ Nota:

Também temos outros tutoriais de Arduino - Sistema de fechadura de porta usando teclado.

Sobre o Módulo RFID/NFC RC522 e a Fechadura Eletromagnética

Se você ainda não conhece o Módulo RFID/NFC RC522, a Fechadura Eletromagnética e a Fechadura Solenoide (pinagem, como funcionam, como programar...), aprenda sobre eles nos seguintes tutoriais:

Componentes do Sistema

O sistema de fechadura de porta tem duas partes principais:

  • Fechadura da Porta: Arduino + leitor RFID/NFC + fechadura eletromagnética
  • Chave da Porta: tags RFID/NFC
Componentes da fechadura de porta rfid com arduino

Existem alguns tipos de leitores RFID/NFC que funcionam com o Arduino. Este tutorial usa o RFID-RC522 como leitor RFID/NFC porque ele é barato.

Como a Fechadura de Porta RFID/NFC Funciona

  • Algumas tags, cujos UIDs são definidos no código Arduino, funcionam como chaves autorizadas
  • O usuário aproxima uma tag RFID/NFC do leitor RFID/NFC
  • O leitor lê o UID da tag.
  • O Arduino obtém o UID do leitor
  • O Arduino compara o UID lido com os UIDs predefinidos
  • Se o UID corresponder a um dos UIDs predefinidos, o Arduino desativa a fechadura eletromagnética para destravar a porta.

Diagrama de Ligação

  • Fechadura de Porta com RFID RC522 e Fechadura Solenoide
Diagrama de ligação do Sistema de Fechadura de Porta com Arduino e RFID RC522

This image is created using Fritzing. Click to enlarge image

  • Fechadura de Porta com RFID RC522 e Fechadura Eletromagnética
Diagrama de ligação do Sistema de Fechadura de Porta com Arduino e RFID RC522

This image is created using Fritzing. Click to enlarge image

Para simplificar, os pinos do módulo RC522 são conectados diretamente aos pinos do Arduino. No entanto, isso pode fazer o Arduino parar de funcionar corretamente em certos casos, pois os pinos de saída do Arduino produzem 5V, enquanto os pinos do módulo RC522 funcionam normalmente em 3.3V. Por isso, é recomendável regular a tensão entre os pinos do Arduino e os pinos do módulo RC522. Para instruções mais detalhadas, consulte o tutorial Arduino - RFID RC522. O diagrama abaixo mostra como regular 5V para 3.3V usando resistores:

Diagrama de ligação do Arduino com RFID RC522 com tensão regulada

This image is created using Fritzing. Click to enlarge image

※ Nota:

A ordem dos pinos pode variar de acordo com o fabricante. SEMPRE use as etiquetas impressas no módulo. A imagem acima mostra a pinagem dos módulos do fabricante DIYables.

Código Arduino - Uma Única Chave

/* * Este código de Arduino foi desenvolvido por pt.newbiely.com * Este código de Arduino é disponibilizado ao público sem nenhuma restrição. * Para tutoriais completos e diagramas de ligação, visite: * https://pt.newbiely.com/tutorials/arduino/arduino-rfid-nfc-door-lock-system */ #include <SPI.h> #include <MFRC522.h> #define SS_PIN 10 #define RST_PIN 5 #define RELAY_PIN A5 // the Arduino pin connects to relay MFRC522 rfid(SS_PIN, RST_PIN); byte keyTagUID[4] = {0xFF, 0xFF, 0xFF, 0xFF}; void setup() { Serial.begin(9600); SPI.begin(); // init SPI bus rfid.PCD_Init(); // init MFRC522 pinMode(RELAY_PIN, OUTPUT); // initialize pin as an output. digitalWrite(RELAY_PIN, HIGH); // lock the door Serial.println("Tap RFID/NFC Tag on reader"); } void loop() { if (rfid.PICC_IsNewCardPresent()) { // new tag is available if (rfid.PICC_ReadCardSerial()) { // NUID has been readed MFRC522::PICC_Type piccType = rfid.PICC_GetType(rfid.uid.sak); if (rfid.uid.uidByte[0] == keyTagUID[0] && rfid.uid.uidByte[1] == keyTagUID[1] && rfid.uid.uidByte[2] == keyTagUID[2] && rfid.uid.uidByte[3] == keyTagUID[3] ) { Serial.println("Access is granted"); digitalWrite(RELAY_PIN, LOW); // unlock the door for 2 seconds delay(2000); digitalWrite(RELAY_PIN, HIGH); // lock the door } else { Serial.print("Access denied for user with UID:"); for (int i = 0; i < rfid.uid.size; i++) { Serial.print(rfid.uid.uidByte[i] < 0x10 ? " 0" : " "); Serial.print(rfid.uid.uidByte[i], HEX); } Serial.println(); } rfid.PICC_HaltA(); // halt PICC rfid.PCD_StopCrypto1(); // stop encryption on PCD } } }

Passos Rápidos

Como o UID normalmente não vem impresso na tag RFID/NFC, o primeiro passo é descobrir o UID da tag. Isso pode ser feito assim:

  • Copie o código acima e abra-o na Arduino IDE
  • Clique no botão Upload na Arduino IDE para carregar o código no Arduino
  • Abra o Serial Monitor
  • Aproxime uma tag RFID/NFC do módulo RFID-RC522
  • Obtenha o UID no Serial Monitor
∞
Newbiely | Arduino IDE 2.3.8
──
☐
✕
File
Edit
Sketch
Tools
Help
Arduino Uno
Newbiely.ino
···
8 Serial.println("Hello World!");
Output
Serial Monitor
Message (Enter to send message to 'Arduino Uno' on 'COM15')
New Line
9600 baud
Tap RFID/NFC tag on reader Access denied for user with UID: 3A C9 6A CB
Ln 11, Col 1
Arduino Uno on COM15
2

Depois de obter o UID:

  • Atualize o UID na linha 18 do código acima. Por exemplo, altere byte keytagUID[4] = {0xFF, 0xFF, 0xFF, 0xFF}; PARA byte keytagUID[4] = {0x3A, 0xC9, 0x6A, 0xCB};
  • Carregue o código no Arduino novamente
  • Aproxime uma tag RFID/NFC do módulo RFID-RC522
  • Veja a saída no Serial Monitor
∞
Newbiely | Arduino IDE 2.3.8
──
☐
✕
File
Edit
Sketch
Tools
Help
Arduino Uno
Newbiely.ino
···
8 Serial.println("Hello World!");
Output
Serial Monitor
Message (Enter to send message to 'Arduino Uno' on 'COM15')
New Line
9600 baud
Tap RFID/NFC tag on reader Access is granted
Ln 11, Col 1
Arduino Uno on COM15
2
  • Verifique a fechadura eletromagnética; ela deve estar destravada
  • Aproxime outra tag RFID/NFC do módulo RFID-RC522
  • Veja a saída no Serial Monitor
∞
Newbiely | Arduino IDE 2.3.8
──
☐
✕
File
Edit
Sketch
Tools
Help
Arduino Uno
Newbiely.ino
···
8 Serial.println("Hello World!");
Output
Serial Monitor
Message (Enter to send message to 'Arduino Uno' on 'COM15')
New Line
9600 baud
Tap RFID/NFC tag on reader Access is granted Access denied for user with UID: BD 1E 1D 00
Ln 11, Col 1
Arduino Uno on COM15
2

※ Nota:

  • Para facilitar o teste, o tempo de destravamento é de 2 segundos; ele deve ser aumentado no uso prático/demonstração
  • É necessário instalar a biblioteca MFRC522. Veja o tutorial Arduino - RFID/NFC RC522

Código Arduino - Várias Chaves

Vamos imaginar que uma sala permite que apenas o gerente e a secretária destravem a porta.

Nesse caso, precisamos usar duas tags RFID/NFC: uma para o gerente e outra para a secretária. Temos que especificar os UIDs das duas tags no código

/* * Este código de Arduino foi desenvolvido por pt.newbiely.com * Este código de Arduino é disponibilizado ao público sem nenhuma restrição. * Para tutoriais completos e diagramas de ligação, visite: * https://pt.newbiely.com/tutorials/arduino/arduino-rfid-nfc-door-lock-system */ #include <SPI.h> #include <MFRC522.h> #define SS_PIN 10 #define RST_PIN 5 #define RELAY_PIN A5 // the Arduino pin connects to relay MFRC522 rfid(SS_PIN, RST_PIN); byte managerKeyUID[4] = {0x3A, 0xC9, 0x6A, 0xCB}; byte secretaryKeyUID[4] = {0x30, 0x01, 0x8B, 0x15}; void setup() { Serial.begin(9600); SPI.begin(); // init SPI bus rfid.PCD_Init(); // init MFRC522 pinMode(RELAY_PIN, OUTPUT); // initialize pin as an output. digitalWrite(RELAY_PIN, HIGH); // lock the door Serial.println("Tap RFID/NFC Tag on reader"); } void loop() { if (rfid.PICC_IsNewCardPresent()) { // new tag is available if (rfid.PICC_ReadCardSerial()) { // NUID has been readed MFRC522::PICC_Type piccType = rfid.PICC_GetType(rfid.uid.sak); if (rfid.uid.uidByte[0] == managerKeyUID[0] && rfid.uid.uidByte[1] == managerKeyUID[1] && rfid.uid.uidByte[2] == managerKeyUID[2] && rfid.uid.uidByte[3] == managerKeyUID[3] ) { Serial.println("Access is granted for manager"); digitalWrite(RELAY_PIN, LOW); // unlock the door for 2 seconds delay(2000); digitalWrite(RELAY_PIN, HIGH); // lock the door } else if (rfid.uid.uidByte[0] == secretaryKeyUID[0] && rfid.uid.uidByte[1] == secretaryKeyUID[1] && rfid.uid.uidByte[2] == secretaryKeyUID[2] && rfid.uid.uidByte[3] == secretaryKeyUID[3] ) { Serial.println("Access is granted for secretary"); digitalWrite(RELAY_PIN, LOW); // unlock the door for 2 seconds delay(2000); digitalWrite(RELAY_PIN, HIGH); // lock the door } else { Serial.print("Access denied for user with UID:"); for (int i = 0; i < rfid.uid.size; i++) { Serial.print(rfid.uid.uidByte[i] < 0x10 ? " 0" : " "); Serial.print(rfid.uid.uidByte[i], HEX); } Serial.println(); } rfid.PICC_HaltA(); // halt PICC rfid.PCD_StopCrypto1(); // stop encryption on PCD } } }

Siga passos semelhantes aos de cima e depois aproxime as tags, uma por uma, do módulo RFID-RC522. O resultado no Serial Monitor fica assim:

∞
Newbiely | Arduino IDE 2.3.8
──
☐
✕
File
Edit
Sketch
Tools
Help
Arduino Uno
Newbiely.ino
···
8 Serial.println("Hello World!");
Output
Serial Monitor
Message (Enter to send message to 'Arduino Uno' on 'COM15')
New Line
9600 baud
Tap RFID/NFC tag on reader Access is granted for secretary Access is granted for manager
Ln 11, Col 1
Arduino Uno on COM15
2

Você pode expandir o código acima para três, quatro ou mais tags.

※ Nota:

No código acima, as chaves estão fixas no código. Na prática, deveria ser possível adicionar/excluir chaves dinamicamente por meio de um modo especial. Nesse caso, as chaves devem ser salvas na memória EEPROM. A quantidade de chaves que pode ser salva depende do tamanho da EEPROM. O código ficará complicado. Se você quiser construir um sistema assim, oferecemos um serviço de programação. Fique à vontade para entrar em contato conosco.

Vídeo

※ NOSSAS MENSAGENS

  • Fique à vontade para compartilhar o link deste tutorial. Porém, por favor, não use nosso conteúdo em outros sites. Investimos muito esforço e tempo para criar este conteúdo, por favor respeite nosso trabalho!