基于FlexLua单片机技术5分钟实现UHF 超高频标签读写

96 篇文章 0 订阅
32 篇文章 0 订阅

UHF 超高频标签读写

本文章参考 FlexLua 官网 ,基于 FlexLua 脱离复杂单片机C开发正逐渐成为一种快速高效的 IoT 硬件开发方式。让小白即使不懂单片机开发也可很容易用FlexLua零门槛开发各种 IoT 硬件。

一、UHF RFID 介绍

UHF RFID 是一种无线射频自动识别技术,被识别的目标可以是仅仅薄如一张纸片的射频标签,且标签成本极低,搭配不同增益不同接口的天线,就可以达到不同的识别距离,距离范围可在零至几十米。

UHF射频标签是无源的(不需要供电),因此十分适合用在要求体积小且无电池供电的场景。但由于标签是无源的,其穿透性相比有源的会差一些,所以在要求穿透性的应用场合就不太合适。

每个标签有一个12字节的EPC码,这个码可以作为标签的身份ID,因此我们可以利用读写卡器来扫描或改写这个ID,从而实现对被识别物体或人的识别以及状态的修改。

b7211fd240f4d49e98a66b214ffb783b.jpeg

二、例程实现功能介绍

利用UHF RFID读写卡模块实现如下两个功能:

  • 实现对周围的标签进行扫描,并输出每个标签的12字节身份ID(EPC码)
  • 实现对某个标签身份ID的写入修改操作

Core提供了十分简单的API函数,所以只需下面三个函数即可完成上面的功能。

LIB_R200ReaderConfig()
r1,r2 = LIB_R200GetCard()
r1 = LIB_R200SetCard()

三、接线图

a8f07e332551f2dc5bfc2bf6ab9ce97e.jpeg

b27b7e7337590243875561a420a34672.jpeg

四、材料清单

  • UHF RFID 读卡器模块
  • 读卡器配套天线(SMA母头公针),根据不同距离需求选择不同增益的UHF RFID超高频天线(本篇章实验中所使用的china2频段为920.125~924.875MHz)
  • 射频标签(选择860-925MHz频段的标签(需支持协议类型:UHF EPC Gen2))

b1f7a100192b3f524381a0ba62e1d734.jpeg

60595fe864de25baa7e2f030f6f2ea5c.jpeg

模块介绍 | |
工作电压 | 3~5V(高功率下需要稳定的5V) |
工作峰值电路 | 约300mA |
工作频段 | 840-960Mhz |
扫描标签峰值速度 | 大于60张每秒 |
输出功率范围 | 0-20dBm(可调) |
适用距离 | 0-30米(根据不同的天线增益,有不同的距离) |
工作温度 | -40 ~ 85摄氏度 |
通讯接口 | TTL Uart |

五、完整代码

(1)扫描周围的标签卡号

--使能USB口和PC串口调试终端的通信功能
LIB_UsbConfig("CDC")
--设置R200读卡器模块占用TX0和RX0引脚,EN引脚占用D5引脚,并开始扫描工作
--工作国家区域:China2区 (920.125~924.875MHz)
--工作信道:0通道,即工作频率为920.125MHz
--发射功率:设置为最大的20.00dBm
LIB_R200ReaderConfig("UART0","D5","CHINA2",0,2000)
--设置D8口作为输出口,控制Core开发板上的LED1灯
LIB_GpioOutputConfig("D8","STANDARD")
while(GC(1) == true)
do
--(1)扫描标签的演示程序
Cnt, R = LIB_R200GetCard()
if Cnt >= 1 then --打印Cnt张扫描到的标签卡号
LIB_GpioToggle("D8")
n = 0
for i=1, Cnt do
print(string.format("%02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x",R[1+n],R[2+n],R[3+n],R[4+n],R[5+n],R[6+n],R[7+n],R[8+n],R[9+n],R[10+n],R[11+n],R[12+n]))
n = n + 12
end
end
end


如果感兴趣,上面代码中出现的LIB开头的库函数可以在 API文档< 中通过Ctrl+F查询。

注意:如果不仅需要获取标签的卡号,还需要获取每张标签的Rssi信号强度时,可以将上面的 LIB_R200GetCard()函数换成 LIB_R200GetRssiCard()即可,详细用法请在 API文档中查看。

(2)写某个标签的卡号

  1. 注意:下面代码中把发射功率降低至14dBm,主要有两个原因:
    • Core开发板的5v电源如果取自USB接口的5V电脑电源(Max:500mA),带载能力不够强,降低发射功率有利于提升写卡成功率。当然如果是更强带载能力的电源,可以不用考虑此条限制。
    • 发射功率降低后,距离范围也会降低很多,这也符合写卡时的场景。
  2. 注意:即使作为写卡器,对LIBR200GetCard()扫描卡号函数的调用也不要删除,不然无法正常使用LIBR200SetCard()函数。
  3. 注意:写入卡号的同时也会写入标签密码,需提供原始密码,和新密码。新出厂的标签原始密码一般都为0x00000000,当新密码(本例中0x22223333)写入后请一定要记住,不然无法再次写入卡号,这种措施也是为了防止其他人随意修改您的标签卡号。如果您不用想写入新密码,将原始密码和新密码保持一致即可。

--使能USB口和PC串口调试终端的通信功能
LIB_UsbConfig("CDC")
--设置R200读卡器模块占用TX0和RX0引脚,EN引脚占用D5引脚,并开始扫描工作
--工作国家区域:China2区 (920.125~924.875MHz)
--工作信道:0通道,即工作频率为920.125MHz
--发射功率:设置为14.00dBm,写卡时功率小点,距离近点更好
LIB_R200ReaderConfig("UART0","D5","CHINA2",0,1400)
--设置D8口作为输出口,控制Core开发板上的LED1灯
LIB_GpioOutputConfig("D8","STANDARD")
--设置按键"BTN1"(占用D10口)以低电平有效的方式检测按键动作
LIB_ButtonConfig("BTN1","D10","L")
while(GC(1) == true)
do
--(1)扫描标签的演示程序
Cnt, R = LIB_R200GetCard()
if Cnt >= 1 then --打印Cnt张扫描到的标签卡号
LIB_GpioToggle("D8")
n = 0
for i=1, Cnt do
print(string.format("%02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x",R[1+n],R[2+n],R[3+n],R[4+n],R[5+n],R[6+n],R[7+n],R[8+n],R[9+n],R[10+n],R[11+n],R[12+n]))
n = n + 12
end
end
--(2)写标签密码和卡号的演示程序
key_value = LIB_ButtonQuery("BTN1")
--如果按键1短按过
if key_value == 1 then
card = {1,2,3,4,5,6,7,8,9,10,11,12}
--注意:新出厂的标签密码默认都是0x00000000,8这个值建议不要动
err = LIB_R200SetCard(0x00000000, 0x22223333, 8, card)
--err为0时表示写卡成功,其他的任何值都表示写卡失败需要重新写
print(string.format("error code = %d", err))
end
end


如果感兴趣,上面代码中出现的LIB开头的库函数可以在 API文档 中通过Ctrl+F查询。

六、代码运行结果

下面所用的调试工具SSCOM,请在shineblink.com网站中的《USB通信》栏目中下载。

(1)扫描周围的标签卡号

35905df53ce9f6e52b79efd2a316123c.jpeg

(2)写某个标签的卡号

当我们按下Core开发板上的BTN1按键后,可以看见卡号由原来的aa aa bb bb cc cc dd dd ee ee ff ff变为01 02 03 04 05 06 07 08 09 0a 0b 0c

9e22e86b444bef11ed1331c21ece466e.jpeg

上面error_code = 0表示写卡号成功,如果是其他值说明写卡失败,需要重新再来,每种error值代表特定的错误。详情请查阅API手册。

注意写标签时需保持标签离读卡器天线8-10cm左右成功几率更高,且周围不能出现其他标签的干扰,不然会导致写卡失败,error_code = 1。

由于各种原因都可能导致不是每次写卡都会100%成功,所以当写卡失败(error_code=0)时,用户需要重新执行一次写卡操作。

  • 12
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值