Arduino Nano - Fechadura de Porta RFID

Este tutorial ensina você a criar um sistema de fechadura de porta usando Arduino Nano, módulo RFID/NFC RC522, um relé, uma fechadura solenoide ou fechadura eletromagnética e, opcionalmente, um LCD. Para facilitar, o tutorial ensina a criar a fechadura de porta RFID dos passos simples aos mais complexos. Em detalhes, vamos fazer:

Se você quiser criar um sistema de fechadura de porta com senha, consulte Arduino Nano - Fechadura de Porta com Teclado

Hardware Necessário

1×Official Arduino Nano
1×Alternatively, DIYables Nano V3.0 Development Board
1×Cabo USB A para Mini-B
1×RFID/NFC RC522 Kit (reader + tags)
1×Fechadura Solenoide
1×(Alternativa) Electromagnetic Lock
1×Relé
1×Fonte de Alimentação 12V
1×Conector de Alimentação DC
1×Fios Jumper
1×(Recomendado) Placa de Expansão com Bornes de Parafuso para Arduino Nano
1×(Recomendado) Placa de Expansão Breakout para Arduino Nano
1×(Recomendado) Divisor de Alimentação para Arduino Nano

Or you can buy the following kits:

1×DIYables Sensor Kit (18 sensors/displays)
Divulgação: Alguns dos links desta seção são links de afiliado da Amazon. Podemos receber uma comissão pelas compras feitas por meio desses links, sem custo adicional para você. Agradecemos o seu apoio.

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

Se você não conhece o Módulo RFID/NFC RC522, a fechadura solenoide e a fechadura eletromagnética (incluindo pinagem, como funcionam e como programar), os tutoriais a seguir podem trazer mais informações:

Componentes do Sistema de Fechadura de Porta

Um sistema simples de fechadura de porta é formado por dois componentes:

  • Fechadura da Porta: um Arduino Nano, um leitor RFID/NFC, um relé e uma fechadura solenoide ou uma fechadura eletromagnética
  • Chave da Porta: tags RFID/NFC
Componentes da fechadura de porta RFID com Arduino Nano

Como a Fechadura de Porta RFID/NFC Funciona

  • O usuário aproxima uma tag RFID/NFC do leitor RFID/NFC, que lê o UID da tag.
  • O Arduino Nano então obtém esse UID do leitor e o compara com os UIDs definidos no código do Arduino Nano.
  • Esses UIDs funcionam como as chaves autorizadas.
  • Se o UID corresponder a um dos UIDs predefinidos, o Arduino Nano desativará a fechadura solenoide para destravar a porta.
  • O Arduino Nano trancará a porta após um tempo limite, ativando o relé.

Diagrama de Ligação

  • Fechadura de Porta RFID RC522 com Fechadura Solenoide
Diagrama de ligação do sistema de fechadura solenoide de porta RFID RC522 com Arduino Nano

This image is created using Fritzing. Click to enlarge image

  • Fechadura de Porta RFID RC522 com Fechadura Eletromagnética
Diagrama de ligação do sistema de fechadura eletromagnética de porta RFID RC522 com Arduino Nano

This image is created using Fritzing. Click to enlarge image

Para simplificar a ligação, os pinos do módulo RC522 são conectados diretamente aos pinos do Arduino. No entanto, isso pode fazer o Arduino funcionar mal em alguns casos, pois os pinos de saída do Arduino produzem 5V, enquanto os pinos do módulo RC522 operam em 3,3V. Por isso, recomenda-se regular a tensão entre os pinos do Arduino e do módulo RC522. O diagrama abaixo mostra como resistores podem ser usados para reduzir 5V para 3,3V.

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

This image is created using Fritzing. Click to enlarge image

※ Nota:

Os fabricantes podem organizar a ordem dos pinos de maneira diferente, por isso é importante seguir os rótulos impressos no módulo. O diagrama de pinagem mostrado acima exibe a disposição dos pinos dos módulos produzidos pelo fabricante DIYables.

Código Arduino Nano - Chave Única

/* * Este código de Arduino Nano foi desenvolvido por pt.newbiely.com * Este código de Arduino Nano é disponibilizado ao público sem nenhuma restrição. * Para tutoriais completos e diagramas de ligação, visite: * https://pt.newbiely.com/tutorials/arduino-nano/arduino-nano-rfid-door-lock */ #include <SPI.h> #include <MFRC522.h> #define RC522_SS_PIN 10 // The Arduino Nano pin connected to RC522's SS pin #define RC522_RST_PIN 5 // The Arduino Nano pin connected to RC522's RST pin #define RELAY_PIN A5 // The Arduino Nano pin connected to relay MFRC522 rfid(RC522_SS_PIN, RC522_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

Para descobrir o UID de uma tag RFID/NFC:

  • Faça o upload do código acima para o Arduino Nano usando o Arduino IDE
  • Abra o Serial Monitor e aproxime a tag do módulo RFID-RC522. O UID será exibido no Serial Monitor.
∞
Newbiely | Arduino IDE 2.3.8
──
☐
✕
File
Edit
Sketch
Tools
Help
Arduino Nano
Newbiely.ino
···
8 Serial.println("Hello World!");
Output
Serial Monitor
Message (Enter to send message to 'Arduino Nano' 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 Nano on COM15
2

Quando você tiver o UID:

  • Altere a linha 18 do código para refletir o UID, por exemplo, troque byte keytagUID[4] = {0xFF, 0xFF, 0xFF, 0xFF}; por byte keytagUID[4] = {0x3A, 0xC9, 0x6A, 0xCB};
  • Faça o upload do código revisado para o Arduino Nano
  • Coloque uma tag RFID/NFC no módulo RFID-RC522
  • Verifique a saída no Serial Monitor
∞
Newbiely | Arduino IDE 2.3.8
──
☐
✕
File
Edit
Sketch
Tools
Help
Arduino Nano
Newbiely.ino
···
8 Serial.println("Hello World!");
Output
Serial Monitor
Message (Enter to send message to 'Arduino Nano' on 'COM15')
New Line
9600 baud
Tap RFID/NFC tag on reader Access is granted
Ln 11, Col 1
Arduino Nano on COM15
2
  • Verifique se a fechadura solenoide não está desativada.
  • Aproxime uma tag RFID/NFC diferente do módulo RFID-RC522.
  • Confira a saída no Serial Monitor.
∞
Newbiely | Arduino IDE 2.3.8
──
☐
✕
File
Edit
Sketch
Tools
Help
Arduino Nano
Newbiely.ino
···
8 Serial.println("Hello World!");
Output
Serial Monitor
Message (Enter to send message to 'Arduino Nano' 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 Nano on COM15
2

※ Nota:

  • Para facilitar os testes, o tempo de destravamento foi definido como 2 segundos; porém, ele deve ser aumentado para uso prático/demonstração.
  • É necessário instalar a biblioteca MFRC522. Para mais informações, consulte o Tutorial Arduino Nano - RFID/NFC RC522.

Código Arduino Nano - Várias Chaves

Vamos imaginar uma sala em que somente o gerente e a secretária podem abrir a porta.

Nesse caso, são necessárias duas tags RFID/NFC: uma para o gerente e outra para a secretária. Os UIDs das duas tags devem ser especificados no código.

/* * Este código de Arduino Nano foi desenvolvido por pt.newbiely.com * Este código de Arduino Nano é disponibilizado ao público sem nenhuma restrição. * Para tutoriais completos e diagramas de ligação, visite: * https://pt.newbiely.com/tutorials/arduino-nano/arduino-nano-rfid-door-lock */ #include <SPI.h> #include <MFRC522.h> #define RC522_SS_PIN 10 // The Arduino Nano pin connected to RC522's SS pin #define RC522_RST_PIN 5 // The Arduino Nano pin connected to RC522's RST pin #define RELAY_PIN A5 // The Arduino Nano pin connected to relay MFRC522 rfid(RC522_SS_PIN, RC522_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 } } }

Repita os mesmos passos de antes e depois aproxime cada tag, uma por vez, do módulo RFID-RC522. A saída no Serial Monitor deve ficar assim:

∞
Newbiely | Arduino IDE 2.3.8
──
☐
✕
File
Edit
Sketch
Tools
Help
Arduino Nano
Newbiely.ino
···
8 Serial.println("Hello World!");
Output
Serial Monitor
Message (Enter to send message to 'Arduino Nano' 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 Nano on COM15
2

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

Adicionando um Display LCD à Fechadura de Porta RFID

Opcionalmente, podemos adicionar um display LCD para mostrar aos usuários o status do acesso (por exemplo, GRANTED/DENIED). Você pode saber mais sobre o LCD no Tutorial Arduino Nano - LCD

Diagrama de ligação - Sistema de fechadura de porta usando RFID, fechadura solenoide ou fechadura eletromagnética e display LCD

Diagrama de ligação da fechadura de porta RFID RC522 com LCD e Arduino Nano

This image is created using Fritzing. Click to enlarge image

Veja A melhor forma de alimentar o Arduino Nano e outros componentes.

Observe que, no diagrama de ligação acima, foi adicionada uma alimentação de 5V porque o pino 5V do Arduino não consegue fornecer energia suficiente para o relé e o LCD ao mesmo tempo.

Código Arduino Nano - Sistema de fechadura de porta com senha usando módulo RFID RC522, fechadura solenoide ou fechadura eletromagnética e display LCD

/* * Este código de Arduino Nano foi desenvolvido por pt.newbiely.com * Este código de Arduino Nano é disponibilizado ao público sem nenhuma restrição. * Para tutoriais completos e diagramas de ligação, visite: * https://pt.newbiely.com/tutorials/arduino-nano/arduino-nano-rfid-door-lock */ #include <SPI.h> #include <MFRC522.h> #include <DIYables_LCD_I2C.h> #define RC522_SS_PIN 10 // The Arduino Nano pin connected to RC522's SS pin #define RC522_RST_PIN 5 // The Arduino Nano pin connected to RC522's RST pin #define RELAY_PIN A5 // The Arduino Nano pin connected to relay MFRC522 rfid(RC522_SS_PIN, RC522_RST_PIN); DIYables_LCD_I2C lcd(0x27, 16, 2); // I2C address 0x27 (from DIYables LCD), 16 column and 2 rows 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 lcd.init(); // Initialize the LCD I2C display lcd.backlight(); 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 lcd.clear(); lcd.setCursor(0, 0); lcd.print("CORRECT!"); lcd.setCursor(0, 1); lcd.print("DOOR UNLOCKED!"); delay(2000); digitalWrite(RELAY_PIN, HIGH); // lock the door lcd.clear(); } 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 lcd.clear(); lcd.setCursor(0, 0); lcd.print("CORRECT!"); lcd.setCursor(0, 1); lcd.print("DOOR UNLOCKED!"); delay(2000); digitalWrite(RELAY_PIN, HIGH); // lock the door lcd.clear(); } else { Serial.print("Access denied for user with UID:"); lcd.clear(); lcd.setCursor(0, 0); lcd.print("INCORRECT!"); lcd.setCursor(0, 1); lcd.print("ACCESS DENIED!"); 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 } } }

※ Nota:

O endereço do LCD pode variar de acordo com o fabricante. Usamos 0x27 em nosso código, conforme especificado pela DIYables.

Adicionando um sensor de porta à fechadura de porta RFID

No código anterior, a porta era trancada após um certo tempo desde que foi destravada pelo Arduino Nano. No entanto, em situações reais, um sensor de porta costuma ser integrado ao sistema. Se a porta estiver fechada, o Arduino Nano trancaria a porta imediatamente, sem esperar o fim do tempo limite.

Para não sobrecarregar você, não adicionamos o sensor de porta ao diagrama de ligação e ao código. Deixamos essa parte para a sua criatividade. Você pode consultar os tutoriais Arduino Nano - Sensor de Porta e Arduino Nano - Sensor de Porta controla Relé.

Gerenciando e armazenando as chaves RFID válidas na EEPROM

No exemplo anterior, as chaves RFID válidas (UID) estavam fixas no código do Arduino Nano. Isso significa que, para adicionar ou excluir chaves RFID, você precisaria modificar o código e fazer o upload dele para o Arduino Nano novamente, o que pode ser inconveniente.

Para tornar as coisas mais práticas, precisamos de uma forma de gerenciar as chaves RFID sem ter que modificar e fazer o upload do código para o Arduino Nano toda vez. Uma solução é armazenar as chaves RFID na EEPROM em vez de deixá-las fixas no código. Consequentemente, precisamos de um método que permita adicionar ou excluir chaves RFID da EEPROM sem precisar alterar o código.

Existem dois métodos para gerenciar chaves RFID na EEPROM:

  • Chaves RFID como chaves mestras
    • Use uma chave RFID como chave mestra ADD para adicionar uma nova chave. Depois que o Arduino detecta a chave mestra ADD, ele alterna entre o modo ADD e o modo OPERATION.
    • No modo ADD, se o Arduino detectar uma nova chave, ele a adiciona à EEPROM
    • Da mesma forma para a chave mestra DELETE e o modo DELETE.
  • Escrever comandos ADD/DELETE via Serial/Bluetooth/IR
    • Os comandos são enviados via Serial/Bluetooth/IR usando o Serial Monitor, um app Bluetooth, um controle IR...
    • Comandos incluídos: diretiva (ADD/DELETE) e UID da chave RFID.
    • Para aumentar a segurança, o comando também deve incluir uma senha. O Arduino verifica a senha para determinar se o comando é válido ou não.

    Os dois métodos exigem adicionar muito código Arduino. Isso não é uma tarefa fácil para iniciantes. Portanto, este tutorial fornece apenas o conhecimento para ajudar os iniciantes a conhecer melhor o sistema de fechadura de porta, sem sobrecarregá-los com código complicado. Se você quiser implementar isso para uso prático, entre em contato conosco através do nosso serviço de programação pago

Armazenando o histórico de acessos em um Cartão SD

Você pode querer armazenar o histórico de acessos com as seguintes informações: UID da chave RFID, status do acesso (GRANTED/DENIED) e data e hora. Você pode usar um cartão SD para guardar o histórico, porque a EEPROM não é grande o suficiente para armazená-lo. Você pode consultar este tutorial Arduino Nano - Registrar Dados com Data e Hora em um Cartão SD.

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!