Manufaturação industrial
Internet das coisas industrial | Materiais industriais | Manutenção e reparo de equipamentos | Programação industrial |
home  MfgRobots >> Manufaturação industrial >  >> Manufacturing Technology >> Processo de manufatura

Construa uma Fechadura de Porta RFID com Arduino – Domine a Tecnologia RFID Passo a Passo

Neste tutorial, aprenderemos o que é RFID, como funciona e como fazer uma fechadura de porta baseada em Arduino com RFID. Você pode assistir ao vídeo a seguir ou ler o tutorial escrito abaixo para mais detalhes.

Visão Geral

RFID significa Identificação por Radiofrequência (Radio Frequency IDentification) e é uma tecnologia sem contato amplamente usada em muitas indústrias para tarefas como rastreamento de pessoal, controle de acesso, gerenciamento de cadeia de suprimentos, rastreamento de livros em bibliotecas, sistemas de pedágio e muito mais.

Construa uma Fechadura de Porta RFID com Arduino – Domine a Tecnologia RFID Passo a Passo

Como o RFID Funciona


Um sistema RFID consiste em dois componentes principais: um transponder ou tag, localizado no objeto que queremos identificar, e um transceptor ou leitor.

Construa uma Fechadura de Porta RFID com Arduino – Domine a Tecnologia RFID Passo a Passo

O leitor RFID consiste em um módulo de radiofrequência, uma unidade de controle e uma bobina de antena que gera um campo eletromagnético de alta frequência. Por outro lado, a tag é geralmente um componente passivo, que consiste apenas em uma antena e um microchip eletrônico. Quando ela se aproxima do campo eletromagnético do transceptor, devido à indução, uma tensão é gerada em sua bobina de antena e essa tensão serve como energia para o microchip.

Construa uma Fechadura de Porta RFID com Arduino – Domine a Tecnologia RFID Passo a Passo

Agora, como a tag está energizada, ela pode extrair a mensagem transmitida pelo leitor. Para enviar a mensagem de volta ao leitor, ela usa uma técnica chamada manipulação de carga. Ligar e desligar uma carga na antena da tag afetará o consumo de energia da antena do leitor, o que pode ser medido como queda de tensão. Essas mudanças na tensão serão capturadas como zeros e uns, e essa é a forma como os dados são transferidos da tag para o leitor.

Existe também outra forma de transferência de dados entre o leitor e a tag, chamada acoplamento por retroespalhamento. Neste caso, a tag usa parte da energia recebida para gerar outro campo eletromagnético que será captado pela antena do leitor.

RFID e Arduino

Esse é o princípio básico de funcionamento. Agora, vamos ver como podemos usar RFID com Arduino e construir nossa própria fechadura de porta RFID. Usaremos tags baseadas no protocolo MIFARE e o leitor RFID MFRC522, que custa apenas alguns dólares.

Construa uma Fechadura de Porta RFID com Arduino – Domine a Tecnologia RFID Passo a Passo

Essas tags têm 1KB de memória e um microchip que pode realizar operações aritméticas. Sua frequência de operação é 13,56 MHz e a distância de operação é de até 10 cm, dependendo da geometria da antena. Se trouxermos uma dessas tags para perto de uma fonte de luz, podemos notar a antena e o microchip sobre os quais falamos anteriormente.

Construa uma Fechadura de Porta RFID com Arduino – Domine a Tecnologia RFID Passo a Passo

Quanto ao módulo leitor RFID, ele usa o protocolo SPI para comunicação com a placa Arduino. Aqui está como precisamos conectá-los. Observe que devemos conectar o VCC do módulo a 3,3V e, quanto aos outros pinos, não precisamos nos preocupar, pois eles são tolerantes a 5V.

Construa uma Fechadura de Porta RFID com Arduino – Domine a Tecnologia RFID Passo a Passo

Uma vez conectado o módulo, precisamos baixar a biblioteca MFRC522 do GitHub. A biblioteca vem com vários bons exemplos dos quais podemos aprender como usar o módulo.

Primeiro, podemos fazer upload do exemplo "DumpInfo" e testar se nosso sistema funciona corretamente. Agora, se executarmos o Monitor Serial e aproximarmos a tag do módulo, o leitor começará a ler a tag e todas as informações da tag serão exibidas no monitor serial.

Construa uma Fechadura de Porta RFID com Arduino – Domine a Tecnologia RFID Passo a Passo

Aqui podemos notar o número UID da tag, bem como os 1KB de memória, que na verdade são divididos em 16 setores, cada setor em 4 blocos e cada bloco pode armazenar 2 bytes de dados. Para este tutorial, não usaremos nenhuma das memórias da tag, usaremos apenas o número UID da tag.

Projeto de Fechadura de Porta RFID com Arduino - Controle de Acesso

Antes de analisarmos o código do nosso projeto de fechadura RFID, vamos dar uma olhada nos componentes e no esquema do circuito deste projeto.

Construa uma Fechadura de Porta RFID com Arduino – Domine a Tecnologia RFID Passo a Passo

Além do módulo RFID, usaremos um sensor de proximidade para verificar se a porta está fechada ou aberta, um servo motor para o mecanismo de fechadura e um display de caracteres.

Você pode obter os componentes necessários para este tutorial Arduino nos links abaixo:

  • Módulo RFID MFRC522
  • Servo Motor
  • Display LCD
  • Placa Arduino
  • Protoboard e Jumpers
  • Sensor de Proximidade CNY70

O projeto tem o seguinte fluxo de trabalho: Primeiro, devemos definir uma tag mestra e, em seguida, o sistema entra no modo normal. Se escanearmos uma tag desconhecida, o acesso será negado. Mas se escanearmos a tag mestra, entraremos em um modo de programação a partir do qual podemos adicionar e autorizar a tag desconhecida. Então, se escanearmos a tag novamente, o acesso será concedido e poderemos abrir a porta.

Construa uma Fechadura de Porta RFID com Arduino – Domine a Tecnologia RFID Passo a Passo

A porta será travada automaticamente após fecharmos a porta. Se quisermos remover uma tag do sistema, basta entrar novamente no modo de programação, escanear a tag conhecida e ela será removida.

Código Fonte

Agora, vamos analisar o código. Primeiro, precisamos incluir as bibliotecas para o módulo RFID, o display e o servo motor, definir algumas variáveis necessárias para o programa abaixo, bem como criar as instâncias das bibliotecas.

#include <SPI.h>
#include <MFRC522.h>
#include <LiquidCrystal.h>
#include <Servo.h>

#define RST_PIN 9
#define SS_PIN 10

byte readCard[4];
char* myTags[100] = {};
int tagsCount = 0;
String tagID = "";
boolean successRead = false;
boolean correctTag = false;
int proximitySensor;
boolean doorOpened = false;

// Cria instâncias
MFRC522 mfrc522(SS_PIN, RST_PIN);
LiquidCrystal lcd(2, 3, 4, 5, 6, 7); // Parâmetros: (rs, enable, d4, d5, d6, d7)
Servo myServo; // Servo motor

Na seção setup, primeiro inicializamos os módulos e definimos o valor inicial do servo motor na posição de travamento. Em seguida, imprimimos a mensagem inicial no display e, com o seguinte loop "while", aguardamos até que uma tag mestra seja escaneada. A função personalizada getID() obtém o UID da tag e o coloca na primeira posição do array myTags[0].

void setup() {
  SPI.begin(); // Barramento SPI
  mfrc522.PCD_Init(); // MFRC522
  lcd.begin(16, 2); // Tela LCD
  myServo.attach(8); // Servo motor
  myServo.write(10); // Posição inicial de travamento do servo

  // Imprime mensagem inicial
  lcd.print("-No Master Tag!-");
  lcd.setCursor(0, 1);
  lcd.print(" SCAN NOW");

  // Aguarda até que uma tag mestra seja escaneada
  while (!successRead) {
    successRead = getID();
    if (successRead == true) {
      myTags[tagsCount] = strdup(tagID.c_str()); // Define tag mestra na posição 0
      lcd.clear();
      lcd.setCursor(0, 0);
      lcd.print("Master Tag Set!");
      tagsCount++;
    }
  }
  successRead = false;
  printNormalModeMessage();
}

Vamos analisar a função personalizada getID(). Primeiro, ela verifica se há uma nova tag próxima ao leitor e, se houver, continuaremos para o loop "for" que obterá o UID da tag. As tags que estamos usando têm número UID de 4 bytes, por isso precisamos fazer 4 iterações com este loop e, usando a função concat(), adicionamos os 4 bytes em uma única variável String. Também definimos todos os caracteres da string para maiúsculas e, no final, paramos a leitura.

uint8_t getID() {
  // Preparando para leitura de PICCs
  if (!mfrc522.PICC_IsNewCardPresent()) {
    return 0;
  }
  if (!mfrc522.PICC_ReadCardSerial()) {
    return 0;
  }
  tagID = "";
  for (uint8_t i = 0; i < 4; i++) {
    readCard[i] = mfrc522.uid.uidByte[i];
    tagID.concat(String(mfrc522.uid.uidByte[i], HEX));
  }
  tagID.toUpperCase();
  mfrc522.PICC_HaltA(); // Para leitura
  return 1;
}

Antes de entrarmos no loop principal, no final da seção setup, também chamamos a função personalizada printNormalModeMessage(), que imprime a mensagem "Access Control" no display.

void printNormalModeMessage() {
  delay(1500);
  lcd.clear();
  lcd.print("-Access Control-");
  lcd.setCursor(0, 1);
  lcd.print(" Scan Your Tag!");
}

No loop principal, começamos lendo o valor do sensor de proximidade, que nos diz se a porta está fechada ou não.

int proximitySensor = analogRead(A0);

Se a porta estiver fechada, usando as mesmas linhas descritas na função getID(), escanearemos e obteremos o UID da nova tag. Podemos notar aqui que o código não prosseguirá até escanearmos uma tag devido às linhas "return" nas declarações "if".

Uma vez que temos a tag escaneada, verificamos se essa tag é a mestra que registramos anteriormente. Se for verdade, entraremos no modo de programação. Neste modo, se escanearmos uma tag já autorizada, ela será removida do sistema; se a tag for desconhecida, será adicionada ao sistema como autorizada.

// Verifica se a tag escaneada é a tag mestra
if (tagID == myTags[0]) {
  lcd.clear();
  lcd.print("Program mode:");
  lcd.setCursor(0, 1);
  lcd.print("Add/Remove Tag");
  while (!successRead) {
    successRead = getID();
    if (successRead == true) {
      for (int i = 0; i < 100; i++) {
        if (tagID == myTags[i]) {
          myTags[i] = "";
          lcd.clear();
          lcd.setCursor(0, 0);
          lcd.print(" Tag Removed!");
          printNormalModeMessage();
          return;
        }
      }
      myTags[tagsCount] = strdup(tagID.c_str());
      lcd.clear();
      lcd.setCursor(0, 0);
      lcd.print(" Tag Added!");
      printNormalModeMessage();
      tagsCount++;
      return;
    }
  }
}

Fora do modo de programação, com o próximo loop "for", verificamos se a tag escaneada é igual a alguma das tags registradas e liberamos a porta ou mantemos o acesso negado. No final, na declaração "else", aguardamos até que a porta seja fechada, então travamos a porta e imprimimos a mensagem de modo normal novamente.

// Verifica se a tag escaneada é autorizada
for (int i = 0; i < 100; i++) {
  if (tagID == myTags[i]) {
    lcd.clear();
    lcd.setCursor(0, 0);
    lcd.print(" Access Granted!");
    myServo.write(170); // Destrava a porta
    printNormalModeMessage();
    correctTag = true;
  }
}
if (correctTag == false) {
  lcd.clear();
  lcd.setCursor(0, 0);
  lcd.print(" Access Denied!");
  printNormalModeMessage();
}

// Se porta está aberta...
else {
  lcd.clear();
  lcd.setCursor(0, 0);
  lcd.print(" Door Opened!");
  while (!doorOpened) {
    proximitySensor = analogRead(A0);
    if (proximitySensor > 200) {
      doorOpened = true;
    }
  }
  doorOpened = false;
  delay(500);
  myServo.write(10); // Trava a porta
  printNormalModeMessage();
}

Isso é praticamente tudo. Aqui está o código completo do projeto:

/*
 * Projeto de Fechadura de Porta com Controle de Acesso Arduino
 * por Dejan Nedelkovski, www.HowToMechatronics.com
 * Biblioteca: MFRC522, https://github.com/miguelbalboa/rfid
 */
#include <SPI.h>
#include <MFRC522.h>
#include <LiquidCrystal.h>
#include <Servo.h>

#define RST_PIN 9
#define SS_PIN 10

byte readCard[4];
char* myTags[100] = {};
int tagsCount = 0;
String tagID = "";
boolean successRead = false;
boolean correctTag = false;
int proximitySensor;
boolean doorOpened = false;

MFRC522 mfrc522(SS_PIN, RST_PIN);
LiquidCrystal lcd(2, 3, 4, 5, 6, 7);
Servo myServo;

void setup() {
  SPI.begin();
  mfrc522.PCD_Init();
  lcd.begin(16, 2);
  myServo.attach(8);
  myServo.write(10);
  lcd.print("-No Master Tag!-");
  lcd.setCursor(0, 1);
  lcd.print(" SCAN NOW");
  while (!successRead) {
    successRead = getID();
    if (successRead == true) {
      myTags[tagsCount] = strdup(tagID.c_str());
      lcd.clear();
      lcd.setCursor(0, 0);
      lcd.print("Master Tag Set!");
      tagsCount++;
    }
  }
  successRead = false;
  printNormalModeMessage();
}

void loop() {
  int proximitySensor = analogRead(A0);
  if (proximitySensor > 200) {
    if (!mfrc522.PICC_IsNewCardPresent()) return;
    if (!mfrc522.PICC_ReadCardSerial()) return;
    tagID = "";
    for (uint8_t i = 0; i < 4; i++) {
      tagID.concat(String(mfrc522.uid.uidByte[i], HEX));
    }
    tagID.toUpperCase();
    mfrc522.PICC_HaltA();
    correctTag = false;

    if (tagID == myTags[0]) {
      lcd.clear();
      lcd.print("Program mode:");
      lcd.setCursor(0, 1);
      lcd.print("Add/Remove Tag");
      while (!successRead) {
        successRead = getID();
        if (successRead == true) {
          for (int i = 0; i < 100; i++) {
            if (tagID == myTags[i]) {
              myTags[i] = "";
              lcd.clear();
              lcd.setCursor(0, 0);
              lcd.print(" Tag Removed!");
              printNormalModeMessage();
              return;
            }
          }
          myTags[tagsCount] = strdup(tagID.c_str());
          lcd.clear();
          lcd.setCursor(0, 0);
          lcd.print(" Tag Added!");
          printNormalModeMessage();
          tagsCount++;
          return;
        }
      }
    }
    successRead = false;

    for (int i = 0; i < 100; i++) {
      if (tagID == myTags[i]) {
        lcd.clear();
        lcd.setCursor(0, 0);
        lcd.print(" Access Granted!");
        myServo.write(170);
        printNormalModeMessage();
        correctTag = true;
      }
    }
    if (correctTag == false) {
      lcd.clear();
      lcd.setCursor(0, 0);
      lcd.print(" Access Denied!");
      printNormalModeMessage();
    }
  } else {
    lcd.clear();
    lcd.setCursor(0, 0);
    lcd.print(" Door Opened!");
    while (!doorOpened) {
      proximitySensor = analogRead(A0);
      if (proximitySensor > 200) {
        doorOpened = true;
      }
    }
    doorOpened = false;
    delay(500);
    myServo.write(10);
    printNormalModeMessage();
  }
}

uint8_t getID() {
  if (!mfrc522.PICC_IsNewCardPresent()) return 0;
  if (!mfrc522.PICC_ReadCardSerial()) return 0;
  tagID = "";
  for (uint8_t i = 0; i < 4; i++) {
    readCard[i] = mfrc522.uid.uidByte[i];
    tagID.concat(String(mfrc522.uid.uidByte[i], HEX));
  }
  tagID.toUpperCase();
  mfrc522.PICC_HaltA();
  return 1;
}

void printNormalModeMessage() {
  delay(1500);
  lcd.clear();
  lcd.print("-Access Control-");
  lcd.setCursor(0, 1);
  lcd.print(" Scan Your Tag!");
}

Espero que você tenha gostado deste tutorial. Sinta-se à vontade para fazer qualquer pergunta na seção de comentários abaixo.

Processo de manufatura

  1. Fecheadura RFID Segura com Arduino e RC522 (MIFARE 13,56 MHz)
  2. Crie uma Fechadura RFID Segura com Arduino – Guia Passo a Passo
  3. Crie um Botão de Teclado "Socável" Personalizado com Arduino: Guia Passo a Passo
  4. Fechadura de Porta por Senha com Arduino, Teclado e Atuador Linear
  5. Autômatos Celulares em Tempo Real no Arduino com Display OLED 128x64
  6. eDOT: Relógio de Precisão e Estação Meteorológica Arduino com Controle IR Embutido
  7. Sistema de Presença em Tempo Real com RFID, Arduino e Google Sheets
  8. Criar Tons Musicais com Arduino: Um Guia Passo a Passo
  9. Porta Automática com Arduino e Sensor Ultrassônico HC-SR04
  10. Construa uma Bússola Digital em Tempo Real com Arduino e Processing