RFID射频识别是一种非接触式的物体识别技术,它可以通过射频信号自动识别目标对象并获取相关数据,因此许多互动项目正是借用这一特性来实现对物体的识别的。通常来讲,一个最基本的RFID识系统主要由以下三部分组成:
- 标签(Tag):由耦合元件及芯片组成,每个标签具有唯一的电子编码,附着在物体上标识目标对象;
- 阅读器(Reader):读取(有时还可以写入)标签信息的设备,可设计为手持式或固定式;
- 天线(Antenna):在标签和读取器间传递射频信号。
目前能够使用的RFID模块比较多,与Arduino之间的接口也有所区别,我们设计的这两款RFID模块都是通过串口来与Arduino连接的,两者的功能和连接方式完全一样,只是天线的形式有所区别而已。
下图这款是阅读器和天线分离的,分别位于两块电路板上,由于天线的面积相对较大,因此检测距离可以达到10cm:
而下图这款则是阅读器和天线集成在一块电路板上的,检测距离为6cm:
RFID的工作原理其实并不复杂,当标签进入到读卡器的工作区域之后,读卡器就可以通过天线所产生的磁场,读出标签里所存储的数据:
根据具体使用场景的不同,我们可以使用不同类型的标签,不同类型的标签作用范围有所区别:
在实际使用的过程中,我们可以先用读卡器读出不同标签中的ID,此时可以使用我们之前介绍的USB转串口模块Serial Dongle:
电路连接好之后,用串口调试工具打开Serial Dongle对应的串口,将波特率设置为19200,然后以HEX格式发送读卡的命令 AA BB 02 20 22(一共5个字节):
如果此时没有卡在读卡器的作用区间之内,RFID模块将通过串口返回HEX格式的AA BB 02 DF DD(五个字节):
但如果此时有卡在读卡器的作用区间之内,RFID模块上的红色LED会点亮,同时通过串口返回HEX格式的AA BB 06 20 5E 97 25 C7 0D(9个字节),其中从20之后开始的4个字节5E 97 25 C7即是标签的ID。不同标签返回的ID值是不一样的,而我们正是通过对该ID值的判断来区分不同的物体的。
在得到了相应标签的ID值后,我们就可以在Arduino中来进行识别了,硬件连接上依然是通过传感器扩展板上的COM接口来连接我们的串口RFID模块:
与之对应的Arduino代码如下所示,其中我们要检测的标签ID是5E 97 25 C7,当Arduino检测到相应的标签后,会将13号数字I/O端口上的LED点亮1秒钟:
int val = 0; int ledPin = 13; int status = 0; unsigned char searchCMD[] = {0xAA, 0xBB,0x02, 0x20, 0x22}; unsigned char searchRES[4]; void setup() { Serial.begin(19200); pinMode(13, OUTPUT); } int searchCard() { Serial.write(searchCMD, 5); delay(100); status = 0; while(true) { if (Serial.available() > 0) { val = Serial.read(); switch (status) { case 0: // parse 0xAA if (val == 0xAA) status = 1; break; case 1: // parse 0xBB if (val == 0xBB) status = 2; else return -1; break; case 2: if (val == 0x06) status = 3; else return -1; break; case 3: if (val == 0x20) status = 4; else return -1; break; case 4: case 5: case 6: case 7: searchRES[status - 4] = val; status ++; break; case 8: return 0; // read successfully break; default: return -1; break; } } } } void loop() { if (searchCard() != -1) { if (searchRES[0] == 0x5E && searchRES[1] == 0x97 && searchRES[2] == 0x25 && searchRES[3] == 0xC7) { digitalWrite(13, HIGH); delay(1000); digitalWrite(13, LOW); delay(1000); } } }