RFID是如何工作的,如何制作基于Arduino的RFID门锁

在本教程中,我们将学习什么是RFID,它是如何工作的,以及如何制作基于Arduino的RF亚博88下载ID门锁。你可以观看下面的视频或阅读下面的书面教程了解更多细节。

概述


RFID代表射频识别它是一种非接触技术,广泛应用于许多行业,如人员跟踪、访问控制、供应链管理、图书馆图书跟踪、收费站系统等。

射频识别的应用及用途

RFID如何工作


RFID系统由两个主要组件,转发器或标签组成,该标签位于我们想要识别的对象上,以及收发器或读者。

RFID如亚博88下载何运作

RFID读取器由射频模块,控制单元和天线线圈组成,该控制单元和天线线圈产生高频电磁场。另一方面,标签通常是一种被动部件,其包括仅由天线和电子微芯片组成,因此当由于感应而导致收发器的电磁场附近时,在其天线线圈中产生电压,并且可以在其天线线圈中产生电压电压用作微芯片的电源。

RFID工作原则

现在,当标签被供电时,它可以从读取器中提取发送的消息,并将消息发送回读者,它使用称为负载操作的技术。在标签的天线处开启和关闭负载将影响读取器天线的功耗,这可以测量为电压降。电压的这种变化将被捕获为Zeros,这就是数据从标签传送到读者的方式。

在阅读器和标签之间还有另一种数据传输方式,称为反向散射耦合。在这种情况下,标签使用接收到的部分能量产生另一个电磁场,该电磁场将被阅读器的天线接收到。

RFID和Arduino.


这就是基本的工作原理现在让我们看看如何将射频识别和Arduino结合起来制作我们自己的射频识别门锁。我们将使用基于MIFARE协议的标签和MFRC522 RFID阅读器,这只需要几美元。

RFID和Arduino教程

这些标签有1kb的内存和一个可以做算术运算的微芯片。它们的工作频率是13.56 MHz,工作距离高达10厘米取决于天线的几何形状。如果我们把其中一个标签放在光源前,我们可以注意到天线和我们之前讨论过的微芯片。

天线和微芯片内的RFID标签

对于RFID阅读器模块,它使用SPI协议与Arduino板通信,我们需要这样连接它们。请注意,我们必须将模块的VCC连接到3.3V,其他引脚我们不用担心,因为它们是5V公差的。

一旦我们连接模块,我们需要下载MFRC522图书馆从GitHub。该库提供了几个很好的示例,我们可以从中学习如何使用该模块。

首先,我们可以上传“DumpInfo”示例并测试我们的系统是否正常工作。现在,如果我们运行串行监视器,并将标签带到模块附近,阅读器将开始读取标签,来自标签的所有信息将显示在串行监视器上。

Arduino MFRC522库DumpInfo示例

这里我们可以注意到标签的UID号以及1kb的内存,它实际上被划分为16个扇区,每个扇区分为4个块,每个块可以存储2字节的数据。对于本教程,我们不会使用任何标记的内存,我们将只使用标记的UID号。

Arduino RFID门锁门禁项目


在我们通过我们的RFID门锁项目的代码之前,让我们看一下这个项目的组件和电路原理图。

Arduino RFID门锁门禁项目

除了RFID模块之外,我们还将使用接近传感器来检查门是否关闭或打开,伺服电机用于锁定机构和字符显示。

你可以从下面的链接获得这个Arduino教程所需的组件:

yaboAG娱乐城披露:这些是联盟链接。作为亚马逊助理,我从合格购买中获得。

该项目具有以下工作流程:首先,我们必须设置主标记,然后系统进入正常模式。如果我们扫描一个未知标记,则访问将被拒绝,但如果我们扫描主机,我们将从我们可以添加和授权未知标记的位置进入程序模式。所以现在,如果我们再次扫描标签,就会授予访问,以便我们打开门。

Arduino RFID门锁门禁项目

门后,门会自动锁定。如果我们要从系统中删除标签,我们只需进入程序模式,请扫描“知道”标记,将删除。

源代码


现在让我们来看看代码。因此,首先我们需要包含RFID模块、显示器和伺服电机的库,定义下面程序所需的一些变量,并创建库的实例。

#include  #include  #include  #include  #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 (SS_PIN, RST_PIN); //创建实例液晶显示(2,3,4,5,6,7); //Parameters: (rs, enable, d4, d5, d6, d7) Servo myServo; // Servo motor

在设置部分,我们首先对模块进行初始化,将伺服电机的初始值设置为锁定位置。然后我们将初始消息打印到显示器上,然后使用下面的“while”循环等待,直到主标记被扫描。getID()自定义函数获取标签的UID,并将其放入myTags[0]数组的第一个位置。

void setup(){//启动spi.begin();// SPI总线MFRC522.pcd_init();// mfrc522 lcd.begin(16,2);//液晶屏myservo.attach(8);//伺服电机myservo.write(10);//伺服电机的初始锁定位置//打印初始消息lcd.print(“ - 没有主标记! - ”);lcd.setcursor(0,1);lcd.print(“立即扫描”);//等待直到扫描主卡(!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(); }

让我们来看看getID()自定义函数。首先,它检查读者附近是否有一个新标签,如果是,我们将继续“for”循环,这将获得标记的UID。我们使用的标签具有4个字节UID号,这就是为什么我们需要使用此循环执行4个迭代,并使用concat()函数我们将4个字节添加到单个字符串变量中。我们还将字符串的所有字符设置为上部案例,最后我们停止阅读。

UINT8_T getID(){//准备好读取piccs(!mfrc522.picc_isnewcardpresent()){//如果放置到RFID读取器的新PICC继续返回0;}如果(!mfrc522.picc_readcardserial()){//由于picc放置了串行并继续返回0;} tagid =“”;for(uint8_t i = 0; i <4; i ++){//我们使用的mifare piccs有4个字节uid readcard [i] = mfrc522.uid.uidbyte [i];tagid.concat(string(mfrc522.uid.uidbyte [i],hex));//在单个字符串变量中添加4个字节} tagid.touppercase();mfrc522.picc_halta();//停止阅读返回1;}

在我们进入主循环之前,在设置部分的末尾,我们还调用PrintNormalModeMessage()自定义函数,该函数在显示屏上打印“访问控制”消息。

void printnormalmodemessage(){延迟(1500);lcd.clear();lcd.print(“ -  Access Control-”);lcd.setcursor(0,1);lcd.print(“扫描你的标签!”);}

在主回路中,我们首先读取接近传感器的值,它告诉我们门是否关闭。

int proximitySensor = analogRead(A0);

因此,如果门关闭,则使用与GetID()自定义功能中所述的相同线,我们将扫描并获取新标记的UID。我们可以在这里注意到,由于“如果”语句中的“返回”行扫描标记,因此代码不会进一步继续。

一旦我们扫描了标签,我们会检查该标签是否是我们以前注册的主站,如果这是真的,我们将进入程序模式。在此模式下,如果我们扫描已授权标记,它将被从系统中删除,或者如果标记未知,则将添加到系统中的系统。

//检查扫描的标记是否是主标记(TagId == MyTags [0]){lcd.clear();lcd.print(“计划模式:”);lcd.setcursor(0,1);lcd.print(“添加/删除标记”);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(“删除标签!”);printnormalmodemessage(); return; } } myTags[tagsCount] = strdup(tagID.c_str()); lcd.clear(); lcd.setCursor(0, 0); lcd.print(" Tag Added!"); printNormalModeMessage(); tagsCount++; return; } } }

在程序模式之外,通过下一个“for”循环,我们检查扫描的标签是否等于任何挂号标签,我们要么解锁门或保持访问拒绝。最后在“别的”声明中我们等到门关闭,然后我们锁定了门并再次打印了正常模式消息。

//检查扫描的标签是否被授权(int i = 0; i <100; i ++){if(tagid == mytags [i]){lcd.clear();lcd.setCursor(0,0);lcd.print(“获得授予的!”);myservo.write(170);//解锁门打印机莫狄德透明();classtag = true;if}}如果(classtag == false){lcd.clear();lcd.setCursor(0,0);lcd.print(“拒绝访问!”);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(); }

所以这就是一切,这里是项目的完整代码:

/ * * Arduino门锁访问控制项目* *由Dejan Nedelkovski,www.www.kuaixg.com * *图书馆:亚搏手机版官方下载MFRC522,https://github.com/miguelbalboa/rfid * / #include  #include  #include  #include  #define rst_pin 9 #define ss_pin 10字节readcard [4];char* myTags[100] = {};int tagsCount = 0;String tagID = "";boolean successRead = false;boolean correctTag = false;int proximitySensor;boolean doorOpened = false;MFRC522 (SS_PIN, RST_PIN); //创建实例液晶显示(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!"); }

我希望您享受本教程,并随意在下面的评论部分提出任何疑问。

41回应

  1. Torbjörn卡尔森

    非常感谢!我正在制作智能锁,作为机械工程师,我从不同的视频中得到了很多帮助。伟大的!
    /可

    回复
  2. SetaSena.

    先生,我不能让它工作。我的所有电线检查了所有的电线。
    液晶仍然空白!
    我怎样才能解决这个问题?

    回复
    • 德扬Nedelkovski

      LCD的问题是对比。尝试调整LCD对比度引脚的电压,尝试使用电位器或不同的分压器,以及使用带有Arduino的LCD显示屏查看我的详细教程。

      回复
      • 萨姆

        嗨,我已经提到了你的液晶教程,但我没有电位器。我可以问是否应该在地面或5V的对比度销上进行调整?在图片颜色代码上看到,我在GND上使用了220欧姆和1000Ohm。我使用错误的电阻,还是错了。因为我正在使用相同的液晶和连接,所以不应该有任何错误吗?谢谢!!I need this for a mini project of mine hope you can help me with the LCD contrast issue Thanks!!

      • 萨姆

        啊. .谢谢!我已经试着去掉一个对比引脚电阻,并把它直接连接到地。它工作!

    • 李惠特

      是否存储在EEPROM中的标签ID,以便在掉头关闭之前存储的标签后?

      谢谢,

      李。

      回复
  3. Facundo.

    你好,我用arduino uno代替arduino nano做这个有什么区别吗?

    回复
  4. moroisa

    我可以使用螺线管12 V而不是电机伺服,如果我想添加LED指示灯吗?我必须做什么(编码)?
    请帮忙。

    回复
      • 莫罗萨

        我做到了,

        添加螺线管,按按钮从另一侧,LED RGB,电池和LCD I2C适配器换档。除了一个思考外,一切都是完美的,当损耗电源再次开始时,程序开始。现在我试图用我的EEPROM,你有什么建议吗?
        还有一个小问题,当我试图在printNormalModeMessage()上做滚动文本时,程序卡住了,不能扫描卡和运行系统,只是滚动文本出现在LCD上,请帮助。谢谢您,先生。

  5. 马克

    伟大的项目,但我如何存储UID?将名称存储到安全性标签上也很棒。
    马克

    回复
  6. Baidar

    你用哪个Arduino,为什么。还有一种方法可以记录什么卡被扫描,扫描的时间,并能够保存显示。

    回复
  7. 汤姆

    嗨,伟大的文章。我需要约2英尺的范围,这可能吗?
    谢谢,汤姆

    回复
    • 罗恩

      是的,一些RFID阅读器可以在两英尺远的地方激活被动标签。然而,它们并不紧凑,需要比这个项目多得多的电力,只在商业上可用,而且相对昂贵。在这种情况下,近距离传感器可能不实用,超声波传感器可能也不够。如果有意义,可以考虑使用可中断的光束,比如红外或激光,物体触发RFID阅读器激活。另一种可能性是让RFID阅读器打开,并在标签经过时进行投票,以实现跟踪类型的应用。

      回复
  8. 大卫威廉姆斯

    你好呀!
    我有一个关于这个项目的问题:
    这个项目也可以在没有接近传感器的情况下工作,或者我需要一个才能正常工作吗?
    谢谢

    回复
    • 德国

      嘿,它会起作用,但它需要在代码中进行一些修改。如果您没有那个,您也可以使用不同的接近传感器。

      回复
  9. 出于某种原因,GetID()不在我的工作。有什么可以解决这个问题吗?谢谢。
    PS:我试图复制和粘贴在网站上的代码,这也不能工作。

    回复
  10. 本史密斯

    嗨,你如何连接光学传感器CNY70?

    我的已经炸过三次了,我按照示意图做的。

    只是为了确保您使用的电阻为220和10K对光学传感器的权利?

    以及如何连接传感器接地和电源?

    好,谢谢

    回复
    • 德国

      充分利用您将适当的引脚连接到适当的电阻,以及地面和5V。电路图显示了连接它的正确方法。

      回复
  11. 费尔南多

    嘿,谢谢你的计划。我想知道我们是否可以用超声波传感器代替近距离传感器CNY70?

    回复
    • 德国

      是的,你可以用超声波传感器。当然,您必须适当地修改代码。我用人民币70元,因为它更小。

      回复

发表评论

您的电子邮件地址将不会被公布。

受到推崇的

2019年初学者和爱好者的最佳进入级示波器

为初学者和爱好者最好的示波器

受到推崇的

2019年初学者的8个最佳Arduino Starter Kits

初学者的8个最佳Arduino Starter Kits

受到推崇的

最佳3D打印机初学者和爱好者- 3D打印

初学者和爱好者的最佳3D打印机