Arduino 电子积木 串口RFID模块

RFID射频识别是一种非接触式的物体识别技术,它可以通过射频信号自动识别目标对象并获取相关数据,因此许多互动项目正是借用这一特性来实现对物体的识别的。通常来讲,一个最基本的RFID识系统主要由以下三部分组成:

        目前能够使用的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);
        }
        }
        }

        本文由flamingoeda授权(果壳网)发表,文章著作权为原作者所有。
        推荐 2人推荐
        1条评论

        你的评论

        回复请先登录
        flamingoeda 创客玩家 flamingoeda的新浪微博 发表于 2010-12-14 16:15

        ©2017果壳网    京ICP证100430号    京网文[2015] 0609-239号    新出发京零字东150005号     京公网安备11010502007133号

        违法和不良信息举报邮箱:jubao@guokr.com    举报电话:13691127034