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

Como funciona o RFID e como fazer uma fechadura de porta RFID baseada em Arduino


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

Visão geral


RFID significa Identificação de Radiofrequência e é uma tecnologia sem contato que é amplamente usada em muitos setores para tarefas como rastreamento de pessoal, controle de acesso, gerenciamento da cadeia de suprimentos, rastreamento de livros em bibliotecas, sistemas de pedágio e assim por diante.[/column]

Como funciona o RFID



Um sistema RFID é composto por dois componentes principais, um transponder ou tag que está localizado no objeto que se deseja identificar e um transceptor ou leitor.

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, o tag geralmente é um componente passivo, que consiste em apenas uma antena e um microchip eletrônico, portanto, ao se aproximar do campo eletromagnético do transceptor, por indução, é gerada uma tensão na bobina de sua antena e esta tensão serve como energia para o microchip.

Agora, com o tag energizado, ele pode extrair a mensagem transmitida do leitor e, para enviar a mensagem de volta ao leitor, utiliza uma técnica chamada manipulação de carga. Ligar e desligar uma carga na antena da etiqueta afetará o consumo de energia da antena do leitor que pode ser medido como queda de tensão. Essas mudanças na tensão serão capturadas como uns e zeros e é assim que os dados são transferidos da etiqueta para o leitor.

Há também outra forma de transferência de dados entre o leitor e a etiqueta, chamada de acoplamento retrodisperso. Neste caso, o tag utiliza parte da potência recebida para gerar outro campo eletromagnético que será captado pela antena do leitor.

RFID e Arduino


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

Essas tags possuem 1kb de memória e possuem um microchip que pode realizar operações aritméticas. Sua frequência de operação é de 13,56 MHz e a distância de operação é de até 10 cm dependendo da geometria da antena. Se colocarmos uma dessas tags na frente de uma fonte de luz, podemos notar a antena e o microchip de que falamos anteriormente.

Quanto ao módulo leitor RFID, ele usa o protocolo SPI para comunicação com a placa Arduino e 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 são tolerantes a 5V.

Depois de conectar o módulo, precisamos fazer o download da biblioteca MFRC522 do GitHub. A biblioteca vem com vários bons exemplos dos quais podemos aprender como usar o módulo.

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

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

Projeto de controle de acesso de fechadura de porta RFID Arduino


Antes de passarmos pelo código do nosso projeto de fechadura RFID, vamos dar uma olhada nos componentes e nos esquemas de circuitos deste projeto.

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 trava e um display de caracteres.

Você pode obter os componentes necessários para este tutorial do Arduino nos links abaixo:
  • Módulo RFID MFRC522 …………………….
  • Servomotor ………………………………………..
  • Tela LCD …………………………………………
  • Placa Arduino ………………………………….
  • Breadboard e jump wires …………….. 
  • Sensor de proximidade CNY70 ……………………

O projeto tem o seguinte fluxo de trabalho:Primeiro temos que definir uma tag master e depois o sistema entra no modo normal. Se digitalizarmos uma etiqueta desconhecida o acesso será negado, mas se digitalizarmos o mestre entraremos em um modo de programa a partir do qual podemos adicionar e autorizar a etiqueta desconhecida. Então agora, se digitalizarmos a tag novamente, o acesso será concedido para que possamos abrir a porta.

A porta travará automaticamente depois que fecharmos a porta. Se quisermos remover uma tag do sistema, basta entrar novamente no modo de programa, escanear a tag de conhecimento e ela será removida.

Código-fonte


Agora vamos dar uma olhada no código.  Então 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;

// Create instances
MFRC522 mfrc522(SS_PIN, RST_PIN);
LiquidCrystal lcd(2, 3, 4, 5, 6, 7); //Parameters: (rs, enable, d4, d5, d6, d7)
Servo myServo; // Servo motorCode language: Arduino (arduino)

Na seção de configuração, primeiro inicializamos os módulos e configuramos o valor inicial do servo motor em uma posição travada. Em seguida, imprimimos a mensagem inicial no display e com o seguinte loop “while” esperamos até que uma tag master seja escaneada. A função customizada getID() obtém o UID da tag e o colocamos no primeiro local do array myTags[0].
void setup() {
  // Initiating
  SPI.begin();        // SPI bus
  mfrc522.PCD_Init(); //  MFRC522
  lcd.begin(16, 2);   // LCD screen
  myServo.attach(8);  // Servo motor

  myServo.write(10); // Initial lock position of the servo motor
  // Prints the initial message
  lcd.print("-No Master Tag!-");
  lcd.setCursor(0, 1);
  lcd.print("    SCAN NOW");
  // Waits until a master card is scanned
  while (!successRead) {
    successRead = getID();
    if ( successRead == true) {
      myTags[tagsCount] = strdup(tagID.c_str()); // Sets the master tag into position 0 in the array
      lcd.clear();
      lcd.setCursor(0, 0);
      lcd.print("Master Tag Set!");
      tagsCount++;
    }
  }
  successRead = false;
  printNormalModeMessage();
}Code language: Arduino (arduino)

Vamos dar uma olhada na função customizada getID(). Primeiro ele verifica se há uma nova tag colocada perto do leitor e se sim continuaremos para o loop “for” que obterá o UID da tag. As tags que estamos usando têm um 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 ao final paramos a leitura.
uint8_t getID() {
  // Getting ready for Reading PICCs
  if ( ! mfrc522.PICC_IsNewCardPresent()) { //If a new PICC placed to RFID reader continue
    return 0;
  }
  if ( ! mfrc522.PICC_ReadCardSerial()) {   //Since a PICC placed get Serial and continue
    return 0;
  }
  tagID = "";
  for ( uint8_t i = 0; i < 4; i++) {  // The MIFARE PICCs that we use have 4 byte UID
    readCard[i] = mfrc522.uid.uidByte[i];
    tagID.concat(String(mfrc522.uid.uidByte[i], HEX)); // Adds the 4 bytes in a single String variable
  }
  tagID.toUpperCase();
  mfrc522.PICC_HaltA(); // Stop reading
  return 1;
}Code language: Arduino (arduino)

Antes de entrarmos no loop principal, no final da seção de configuração, também chamamos a função personalizada printNormalModeMessage() que imprime a mensagem “Controle de Acesso” no display.
void printNormalModeMessage() {
  delay(1500);
  lcd.clear();
  lcd.print("-Access Control-");
  lcd.setCursor(0, 1);
  lcd.print(" Scan Your Tag!");
}Code language: Arduino (arduino)

No loop principal começamos com a leitura do valor do sensor de proximidade, que nos informa se a porta está fechada ou não.
int proximitySensor = analogRead(A0);Code language: Arduino (arduino)

Portanto, se a porta estiver fechada, usando as mesmas linhas que descrevemos na função customizada getID(), faremos a varredura e obteremos o UID da nova tag. Podemos notar aqui que o código não prosseguirá até que digitalizemos uma tag por causa das linhas “return” nas instruções “if”.

Uma vez digitalizada a tag, verificamos se essa tag é a master que registramos anteriormente e, se for verdade, entraremos no modo de programa. Neste modo, se digitalizarmos um tag já autorizado, ele será removido do sistema ou, se o tag for desconhecido, será adicionado ao sistema como autorizado.
// Checks whether the scanned tag is the master tag
    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;
        }
      }
    }Code language: Arduino (arduino)

Fora do modo programa, com o próximo loop “for” verificamos se a tag escaneada é igual a alguma das tags cadastradas e destrancamos a porta ou mantemos o acesso negado. No final da instrução “else” esperamos até que a porta seja fechada, então trancamos a porta e imprimimos a mensagem de modo normal novamente.
// Checks whether the scanned tag is authorized
    for (int i = 0; i < 100; i++) {
      if (tagID == myTags[i]) {
        lcd.clear();
        lcd.setCursor(0, 0);
        lcd.print(" Access Granted!");
        myServo.write(170); // Unlocks the door
        printNormalModeMessage();
        correctTag = true;
      }
    }
    if (correctTag == false) {
      lcd.clear();
      lcd.setCursor(0, 0);
      lcd.print(" Access Denied!");
      printNormalModeMessage();
    }
  }
  // If door is open...
  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); // Locks the door
    printNormalModeMessage();
  }Code language: Arduino (arduino)

Então isso é praticamente tudo e aqui está o código completo do projeto:
/*
* Arduino Door Lock Access Control Project
*                
* by Dejan Nedelkovski, www.HowToMechatronics.com
* 
* Library: 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;

// Create instances
MFRC522 mfrc522(SS_PIN, RST_PIN);
LiquidCrystal lcd(2, 3, 4, 5, 6, 7); //Parameters: (rs, enable, d4, d5, d6, d7)
Servo myServo; // Servo motor

void setup() {
  // Initiating
  SPI.begin();        // SPI bus
  mfrc522.PCD_Init(); //  MFRC522
  lcd.begin(16, 2);   // LCD screen
  myServo.attach(8);  // Servo motor

  myServo.write(10); // Initial lock position of the servo motor
  // Prints the initial message
  lcd.print("-No Master Tag!-");
  lcd.setCursor(0, 1);
  lcd.print("    SCAN NOW");
  // Waits until a master card is scanned
  while (!successRead) {
    successRead = getID();
    if ( successRead == true) {
      myTags[tagsCount] = strdup(tagID.c_str()); // Sets the master tag into position 0 in the array
      lcd.clear();
      lcd.setCursor(0, 0);
      lcd.print("Master Tag Set!");
      tagsCount++;
    }
  }
  successRead = false;
  printNormalModeMessage();
}

void loop() {
  int proximitySensor = analogRead(A0);
  // If door is closed...
  if (proximitySensor > 200) {
    if ( ! mfrc522.PICC_IsNewCardPresent()) { //If a new PICC placed to RFID reader continue
      return;
    }
    if ( ! mfrc522.PICC_ReadCardSerial()) {   //Since a PICC placed get Serial and continue
      return;
    }
    tagID = "";
    // The MIFARE PICCs that we use have 4 byte UID
    for ( uint8_t i = 0; i < 4; i++) {  //
      readCard[i] = mfrc522.uid.uidByte[i];
      tagID.concat(String(mfrc522.uid.uidByte[i], HEX)); // Adds the 4 bytes in a single String variable
    }
    tagID.toUpperCase();
    mfrc522.PICC_HaltA(); // Stop reading

    correctTag = false;
    // Checks whether the scanned tag is the master tag
    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;
    // Checks whether the scanned tag is authorized
    for (int i = 0; i < 100; i++) {
      if (tagID == myTags[i]) {
        lcd.clear();
        lcd.setCursor(0, 0);
        lcd.print(" Access Granted!");
        myServo.write(170); // Unlocks the door
        printNormalModeMessage();
        correctTag = true;
      }
    }
    if (correctTag == false) {
      lcd.clear();
      lcd.setCursor(0, 0);
      lcd.print(" Access Denied!");
      printNormalModeMessage();
    }
  }
  // If door is open...
  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); // Locks the door
    printNormalModeMessage();
  }
}

uint8_t getID() {
  // Getting ready for Reading PICCs
  if ( ! mfrc522.PICC_IsNewCardPresent()) { //If a new PICC placed to RFID reader continue
    return 0;
  }
  if ( ! mfrc522.PICC_ReadCardSerial()) {   //Since a PICC placed get Serial and continue
    return 0;
  }
  tagID = "";
  for ( uint8_t i = 0; i < 4; i++) {  // The MIFARE PICCs that we use have 4 byte UID
    readCard[i] = mfrc522.uid.uidByte[i];
    tagID.concat(String(mfrc522.uid.uidByte[i], HEX)); // Adds the 4 bytes in a single String variable
  }
  tagID.toUpperCase();
  mfrc522.PICC_HaltA(); // Stop reading
  return 1;
}

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

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

Processo de manufatura

  1. Bloqueio Arduino RFID com RC522 - Protocolo MIFARE 13,56 MHz
  2. Tutorial de bloqueio RFID do Arduino
  3. Como fazer um botão de teclado punível personalizável
  4. Fechadura da porta baseada em senha
  5. Arduino e autômatos celulares baseados em OLED
  6. eDOT - Relógio de precisão baseado em Arduino e estação meteorológica
  7. Sistema de atendimento baseado em Arduino e planilha do Google
  8. Como fazer música com um Arduino
  9. Como fazer a abertura automática de porta baseada no Arduino
  10. Como fazer uma bússola usando Arduino e IDE de processamento