Arduino 电子积木 串口RFID模块

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);
    }
  }
}

 

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值