在本教程中,我们将学习什么是RFID,它是如何工作的,以及如何制作基于Arduino的RF亚博88下载ID门锁。你可以观看下面的视频或阅读下面的书面教程了解更多细节。
概述
RFID代表射频识别它是一种非接触技术,广泛应用于许多行业,如人员跟踪、访问控制、供应链管理、图书馆图书跟踪、收费站系统等。
RFID如何工作
RFID系统由两个主要组件,转发器或标签组成,该标签位于我们想要识别的对象上,以及收发器或读者。
RFID读取器由射频模块,控制单元和天线线圈组成,该控制单元和天线线圈产生高频电磁场。另一方面,标签通常是一种被动部件,其包括仅由天线和电子微芯片组成,因此当由于感应而导致收发器的电磁场附近时,在其天线线圈中产生电压,并且可以在其天线线圈中产生电压电压用作微芯片的电源。
现在,当标签被供电时,它可以从读取器中提取发送的消息,并将消息发送回读者,它使用称为负载操作的技术。在标签的天线处开启和关闭负载将影响读取器天线的功耗,这可以测量为电压降。电压的这种变化将被捕获为Zeros,这就是数据从标签传送到读者的方式。
在阅读器和标签之间还有另一种数据传输方式,称为反向散射耦合。在这种情况下,标签使用接收到的部分能量产生另一个电磁场,该电磁场将被阅读器的天线接收到。
RFID和Arduino.
这就是基本的工作原理现在让我们看看如何将射频识别和Arduino结合起来制作我们自己的射频识别门锁。我们将使用基于MIFARE协议的标签和MFRC522 RFID阅读器,这只需要几美元。
这些标签有1kb的内存和一个可以做算术运算的微芯片。它们的工作频率是13.56 MHz,工作距离高达10厘米取决于天线的几何形状。如果我们把其中一个标签放在光源前,我们可以注意到天线和我们之前讨论过的微芯片。
对于RFID阅读器模块,它使用SPI协议与Arduino板通信,我们需要这样连接它们。请注意,我们必须将模块的VCC连接到3.3V,其他引脚我们不用担心,因为它们是5V公差的。
一旦我们连接模块,我们需要下载MFRC522图书馆从GitHub。该库提供了几个很好的示例,我们可以从中学习如何使用该模块。
首先,我们可以上传“DumpInfo”示例并测试我们的系统是否正常工作。现在,如果我们运行串行监视器,并将标签带到模块附近,阅读器将开始读取标签,来自标签的所有信息将显示在串行监视器上。
这里我们可以注意到标签的UID号以及1kb的内存,它实际上被划分为16个扇区,每个扇区分为4个块,每个块可以存储2字节的数据。对于本教程,我们不会使用任何标记的内存,我们将只使用标记的UID号。
Arduino RFID门锁门禁项目
在我们通过我们的RFID门锁项目的代码之前,让我们看一下这个项目的组件和电路原理图。
除了RFID模块之外,我们还将使用接近传感器来检查门是否关闭或打开,伺服电机用于锁定机构和字符显示。
你可以从下面的链接获得这个Arduino教程所需的组件:
- MFRC522 RFID模块.........................亚马逊/伯格多德/aliexpress.
- 伺服电机..........................................亚马逊/伯格多德/aliexpress.
- 液晶显示器 ………………………………………亚马逊/伯格多德/aliexpress.
- arduino board .......................................亚马逊/伯格多德/aliexpress.
- 面包板和跳线...............亚马逊/伯格多德/aliexpress.
- 近距离传感器CNY70 ........................亚马逊/aliexpress.
yaboAG娱乐城披露:这些是联盟链接。作为亚马逊助理,我从合格购买中获得。
该项目具有以下工作流程:首先,我们必须设置主标记,然后系统进入正常模式。如果我们扫描一个未知标记,则访问将被拒绝,但如果我们扫描主机,我们将从我们可以添加和授权未知标记的位置进入程序模式。所以现在,如果我们再次扫描标签,就会授予访问,以便我们打开门。
门后,门会自动锁定。如果我们要从系统中删除标签,我们只需进入程序模式,请扫描“知道”标记,将删除。
源代码
现在让我们来看看代码。因此,首先我们需要包含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!"); }
我希望您享受本教程,并随意在下面的评论部分提出任何疑问。
谢谢!非常好的教程和项目。
谢谢!
先生,请也请使用esp8266_01和PIC微控制器您的解释对每个人都非常有用
非常感谢!我正在制作智能锁,作为机械工程师,我从不同的视频中得到了很多帮助。伟大的!
/可
很高兴听到这个,谢谢!
HC-SR501模块将具有与CNY70?
不是的,HC-SR501是PIR传感器,而CNY70是距离测量传感器。
先生,我不能让它工作。我的所有电线检查了所有的电线。
液晶仍然空白!
我怎样才能解决这个问题?
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,以便在掉头关闭之前存储的标签后?
谢谢,
李。
你好,我用arduino uno代替arduino nano做这个有什么区别吗?
没有任何区别。
我可以使用螺线管12 V而不是电机伺服,如果我想添加LED指示灯吗?我必须做什么(编码)?
请帮忙。
确定你可以做到这一点。代码不需要太大变化,可能只是使用数字销来激活螺线管。
我做到了,
添加螺线管,按按钮从另一侧,LED RGB,电池和LCD I2C适配器换档。除了一个思考外,一切都是完美的,当损耗电源再次开始时,程序开始。现在我试图用我的EEPROM,你有什么建议吗?
还有一个小问题,当我试图在printNormalModeMessage()上做滚动文本时,程序卡住了,不能扫描卡和运行系统,只是滚动文本出现在LCD上,请帮助。谢谢您,先生。
是的,为了解决电力损耗的问题,你应该找到一种方法将数据存储在EEPROM中。
感谢这个教程,它的解释非常好,工作完美。
问候,Tobo。
伟大的项目,但我如何存储UID?将名称存储到安全性标签上也很棒。
马克
即使电源使用Arduino的EEPROM,您也可以存储UID。
你用哪个Arduino,为什么。还有一种方法可以记录什么卡被扫描,扫描的时间,并能够保存显示。
当然,你可以制作一个程序来存储时间,你可以使用DS3231实时时钟模块来实现这个目的。
这个项目对我帮助很大。许多谢谢。
可以用An electric slot代替thé伺服电机吗
当然,任何修改都是可能的。
神奇的教程!谢谢
嗨,伟大的文章。我需要约2英尺的范围,这可能吗?
谢谢,汤姆
是的,一些RFID阅读器可以在两英尺远的地方激活被动标签。然而,它们并不紧凑,需要比这个项目多得多的电力,只在商业上可用,而且相对昂贵。在这种情况下,近距离传感器可能不实用,超声波传感器可能也不够。如果有意义,可以考虑使用可中断的光束,比如红外或激光,物体触发RFID阅读器激活。另一种可能性是让RFID阅读器打开,并在标签经过时进行投票,以实现跟踪类型的应用。
你好呀!
我有一个关于这个项目的问题:
这个项目也可以在没有接近传感器的情况下工作,或者我需要一个才能正常工作吗?
谢谢
嘿,它会起作用,但它需要在代码中进行一些修改。如果您没有那个,您也可以使用不同的接近传感器。
出于某种原因,GetID()不在我的工作。有什么可以解决这个问题吗?谢谢。
PS:我试图复制和粘贴在网站上的代码,这也不能工作。
你会得到什么样的误差?确保您已经安装了MFRC522库,上面的文章中包含了该库的链接。
它说:getID()未在此范围内宣布。
谢谢,伟大的文章。
你最错过了第143 - 168号线。
试着再复制一次代码。
嗨,你如何连接光学传感器CNY70?
我的已经炸过三次了,我按照示意图做的。
只是为了确保您使用的电阻为220和10K对光学传感器的权利?
以及如何连接传感器接地和电源?
好,谢谢
充分利用您将适当的引脚连接到适当的电阻,以及地面和5V。电路图显示了连接它的正确方法。
嘿,谢谢你的计划。我想知道我们是否可以用超声波传感器代替近距离传感器CNY70?
是的,你可以用超声波传感器。当然,您必须适当地修改代码。我用人民币70元,因为它更小。