【基于Arduino RFID门禁系统】

基于Arduino RFID门禁系统

介绍

射频识别或RFID(Radio-Frequency Identification)是一种通过无线电信号进行自动识别,通过RFID标签检索和存储数据的方法。

这些 RFID 标签可以贴在动物、物体上。因此,这些标签具有许多应用,例如贴在车辆上的不停车标签、动物识别。有 3 种类型的 RFID 标签:无源标签是对发射器发送的信号做出响应的标签、半无源标签和本身发射信号的有源标签。目前有几种方法可以控制对某个位置的访问:使用指纹、带密码的键盘以及使用 RFID 系统。

在本文中,我们将学习如何使用 RFID 技术开发门禁系统。该系统将包括 MFRC522 RFID 模块、用于开门的伺服电机、作为系统 HMI 的显示器以及信号 LED。因此在本文中,我们将学习如何使用 RFID 模块开发访问控制。
因此,通过本文您将了解到:

在面包板板上进行电路组装;
了解RFID模块的功能;
伺服电机启动;
在液晶显示屏上显示字符。

现在,我们将开始使用RFID模块开发停车场门禁系统项目的完整介绍。使用带 Arduino 的 RFID 模块开发停车场门禁系统
该项目的核心是 RFID 模块,它由带有 MFRC522 集成电路的印刷电路板和电路板上的天线组成。当电路板通电时,模块会发出射频信号,当标签接近模块时,标签就会被读取,每个标签都有不同的代码。该模块由 3.3 V 供电,它使用 SPI(串行外设接口)通信与所使用的微控制器进行通信。

开发这个项目的第一步是组装图 1 中的电路。
路的操作非常简单!伺服电机用作打开和关闭门的机制。每次标签被 RFID 模块识别时,Arduino 都会发送信息以激活或关闭门。LCD用作与用户的通信接口。接下来,我们将了解该项目的编程逻辑是如何工作的。
Arduino停车系统控制的代码逻辑
要对 Arduino Nano 进行编程,我们需要以下库:

SPI -包含执行 SPI 通信所需功能的库。
MFRC522 -包含与 RFID 模块通信的必要函数的库。
Servo -包含启动伺服电机的必要函数的库。
Wire -包含与 LCD 显示器进行 I2C 通信所需功能的库。

Arduino IDE 中未安装 liquidCrystal_I2C 和 MFRC522 库,因此我们必须安装它们。安装库后,关闭 Arduino IDE 并再次打开它。完整代码如下所示。

/* * Teste Leitor RFID * tag 1 F1 B103 1F 241 17703 31
F1 B1 03 1F
 tag 2 14 45 29 57 20 69 41 87
14 45 29 57
 */

#include <SPI.h>
#include <MFRC522.h>
#include <Servo.h>
#include <Wire.h>
#include <LiquidCrystal_I2C.h>

Servo myservo ;
LiquidCrystal_I2C lcd (0x27,2,1,0,4,5,6,7,3,POSITIVE);

#define vermelho 4
#define verde 5
#define SS_PIN 10
#define RST_PIN 9

MFRC522 mfrc522 (SS_PIN, RST_PIN);

void setup() {  Wire.begin();
  lcd.begin(16,2);  lcd.setBacklight(HIGH);  lcd.setCursor(0,0);  lcd.print("Aproxime a sua   ");  lcd.setCursor(0,1);  lcd.print("tag do leitor ");    pinMode(verde,OUTPUT);  pinMode(vermelho,OUTPUT);    Serial.begin(9600);  SPI.begin();  Serial.println("Aproxime a tag do leitor ");    mfrc522.PCD_Init();     digitalWrite(verde,0);  digitalWrite(vermelho,0);    myservo.attach(6);  }

void loop() {    if(!mfrc522.PICC_IsNewCardPresent())  {    return;  }    if(!mfrc522.PICC_ReadCardSerial())  {    return;  }
  Serial.print(" UID da tag : ");    String conteudo = "";    byte letra;    for (byte i = 0; i< mfrc522.uid.size; i++)  {   Serial.print(mfrc522.uid.uidByte[i] <0x10 ? "0":" ");   Serial.print(mfrc522.uid.uidByte[i], HEX);      conteudo.concat(String(mfrc522.uid.uidByte[i] < 0x10 ? " 0" : " "));   conteudo.concat(String(mfrc522.uid.uidByte[i], HEX));  }    Serial.println();  Serial.print("Mensagem : ");    conteudo.toUpperCase();    if(conteudo.substring(1) == "14 45 29 57")  {    lcd.clear();    Serial.println("Acesso liberado ");      lcd.setBacklight(HIGH);    lcd.setCursor(0,0);    lcd.print("Ola !");    lcd.setCursor(0,1);    lcd.print("Acesso liberado");        digitalWrite(verde,1);    digitalWrite(vermelho,0);        myservo.write(95);    delay(800);    myservo.write(10);    digitalWrite(verde,0);    digitalWrite(vermelho,1);  }   if(conteudo.substring(1) == "F1 B1 03 1F")  {        lcd.clear();    Serial.println("Acesso negado ");    digitalWrite(verde,0);    digitalWrite(vermelho,1);        lcd.setBacklight(HIGH);    lcd.setCursor(0,0);    lcd.print("Erro ! Tag nao ");    lcd.setCursor(0,1);    lcd.print("autorizada ");      }      delay(1000);   lcd.clear();       lcd.setBacklight(HIGH);   lcd.setCursor(0,0);   lcd.print("Aproxime a sua  ");   lcd.setCursor(0,1);   lcd.print("tag do leitor ");
}

下面,我们将解释这个项目的完整逻辑。您需要做的第一件事是声明项目中使用的组件的所有库。

#include <SPI.h>
#include <MFRC522.h>
#include <Servo.h>
#include <Wire.h>
#include <LiquidCrystal_I2C.h>

之后,我们声明伺服电机和LCD的对象。对象的创建如下所示。

Servo myservo;
LiquidCrystal_I2C lcd (0x27,2,1,0,4,5,6,7,3,POSITIVE);
MFRC522 mfrc522 (SS_PIN, RST_PIN);

现在,我们有了 Arduino 上连接引脚的映射。

#define vermelho 4
#define verde 5
#define SS_PIN 10
#define RST_PIN 9

下面是 void 设置函数。它初始化I2C串行通信,串行通信,将引脚配置为输出,以及连接伺服电机的引脚。

void setup() {
  Wire.begin();
  lcd.begin(16,2);  lcd.setBacklight(HIGH);  lcd.setCursor(0,0);  lcd.print("Aproxime a sua   ");  lcd.setCursor(0,1);  lcd.print("tag do leitor ");    pinMode(verde,OUTPUT);  pinMode(vermelho,OUTPUT);    Serial.begin(9600);  SPI.begin();  Serial.println("Aproxime a tag do leitor ");    mfrc522.PCD_Init();     digitalWrite(verde,0);  digitalWrite(vermelho,0);    myservo.attach(6);  }

现在让我们了解完整的编程逻辑是如何工作的,它是在 void 循环函数中实现的。请参阅下面的无效循环代码。

void loop() {    if(!mfrc522.PICC_IsNewCardPresent())  {    return;  }    if(!mfrc522.PICC_ReadCardSerial())  {    return;  }
  Serial.print(" UID da tag : ");    String conteudo = "";    byte letra;    for (byte i = 0; i< mfrc522.uid.size; i++)  {   Serial.print(mfrc522.uid.uidByte[i] <0x10 ? "0":" ");   Serial.print(mfrc522.uid.uidByte[i], HEX);      conteudo.concat(String(mfrc522.uid.uidByte[i] < 0x10 ? " 0" : " "));   conteudo.concat(String(mfrc522.uid.uidByte[i], HEX));  }    Serial.println();  Serial.print("Mensagem : ");    conteudo.toUpperCase();    if(conteudo.substring(1) == "14 45 29 57")  {    lcd.clear();    Serial.println("Acesso liberado ");      lcd.setBacklight(HIGH);    lcd.setCursor(0,0);    lcd.print("Ola !");    lcd.setCursor(0,1);    lcd.print("Acesso liberado");        digitalWrite(verde,1);    digitalWrite(vermelho,0);        myservo.write(95);    delay(800);    myservo.write(10);    digitalWrite(verde,0);    digitalWrite(vermelho,1);  }   if(conteudo.substring(1) == "F1 B1 03 1F")  {        lcd.clear();    Serial.println("Acesso negado ");    digitalWrite(verde,0);    digitalWrite(vermelho,1);        lcd.setBacklight(HIGH);    lcd.setCursor(0,0);    lcd.print("Erro ! Tag nao ");    lcd.setCursor(0,1);    lcd.print("autorizada ");      }      delay(1000);   lcd.clear();       lcd.setBacklight(HIGH);   lcd.setCursor(0,0);   lcd.print("Aproxime a sua  ");   lcd.setCursor(0,1);   lcd.print("tag do leitor ");
}

您应该做的第一件事是检查没有检测到标签,也没有读取标签。代码如下所示。

if(!mfrc522.PICC_IsNewCardPresent())  {    return;  }    if(!mfrc522.PICC_ReadCardSerial())  {    return;  }

之后,系统读取标签并将其值显示在 IDE Arduino 串行监视器上。请参阅下面的代码部分。

Serial.print(" UID da tag : ");    String conteudo = "";    byte letra;    for (byte i = 0; i< mfrc522.uid.size; i++)  {   Serial.print(mfrc522.uid.uidByte[i] <0x10 ? "0":" ");   Serial.print(mfrc522.uid.uidByte[i], HEX);      conteudo.concat(String(mfrc522.uid.uidByte[i] < 0x10 ? " 0" : " "));   conteudo.concat(String(mfrc522.uid.uidByte[i], HEX));  }    Serial.println();  Serial.print("Mensagem : ");    conteudo.toUpperCase();

出示标签代码后,系统将标签值与系统中注册的十六进制值进行比较。

if(conteudo.substring(1) == "14 45 29 57")  {
    lcd.clear();    Serial.println("Acesso liberado ");      lcd.setBacklight(HIGH);    lcd.setCursor(0,0);    lcd.print("Ola !");    lcd.setCursor(0,1);    lcd.print("Acesso liberado");        digitalWrite(verde,1);    digitalWrite(vermelho,0);        myservo.write(95);    delay(800);    myservo.write(10);    digitalWrite(verde,0);    digitalWrite(vermelho,1);
  }

如果标签值等于 14 45 29 57,将执行上述条件的命令。在这些命令中,LCD 将打印访问信息并启动伺服电机打开入口门。

如果标签值等于 F1 B1 03 1F 值,代码流进入条件并显示消息“Tag not authorized!” 并且不触发伺服电机释放访问。

代码部分如下所示。

if(conteudo.substring(1) == "F1 B1 03 1F")  {        lcd.clear();    Serial.println("Acesso negado ");    digitalWrite(verde,0);    digitalWrite(vermelho,1);        lcd.setBacklight(HIGH);    lcd.setCursor(0,0);    lcd.print("Erro ! Tag nao ");    lcd.setCursor(0,1);    lcd.print("autorizada ");      }

最后,系统清洁 LCD 屏幕并显示信息,让用户将标签靠近 RFID 阅读器。代码区域如下所示。

delay(1000);   lcd.clear();       lcd.setBacklight(HIGH);   lcd.setCursor(0,0);   lcd.print("Aproxime a sua  ");   lcd.setCursor(0,1);   lcd.print("tag do leitor ");

现在,我们将在工作台上看到代码与电路一起工作的结果。在对 Arduino Uno 进行编程后,我们将使系统正常工作。在图 2 中,我们有系统的初始消息,要求用户接近标签以释放访问权限。

在图 3 中,我们让用户使用正确的标签来允许访问,然后绿色 LED 亮起并激活伺服电机,访问权限显示在显示屏上。

800 毫秒后,伺服电机返回初始位置,绿色 LED 熄灭,红色 LED 亮起。
在图 4 中,用户使用了一个未注册的标签,因此系统给出了一个错误并且不释放访问权限。
之后,系统重新开始编程逻辑运行周期。

结论和未来的项目改进
使用 RFID 技术的系统应用于多种类型的项目。它们不仅限于控制和访问系统。例如,一个非常常见的应用是用它来识别服装和其他商品的批次。发挥您的创造力,您会发现带有 Arduino 的 RFID 模块适用于您的项目的不同类型的应用程序。将来,我们将使用 Arduino 创建门系统的原型,供您使用激光切割机或 3D 打印机在实践中设置您的停车场。

物联沃分享整理
物联沃-IOTWORD物联网 » 【基于Arduino RFID门禁系统】

发表评论