UHF 超高频标签读写
本文章参考 FlexLua 官网 ,基于 FlexLua 脱离复杂单片机C开发正逐渐成为一种快速高效的 IoT 硬件开发方式。让小白即使不懂单片机开发也可很容易用FlexLua零门槛开发各种 IoT 硬件。
一、UHF RFID 介绍
UHF RFID 是一种无线射频自动识别技术,被识别的目标可以是仅仅薄如一张纸片的射频标签,且标签成本极低,搭配不同增益不同接口的天线,就可以达到不同的识别距离,距离范围可在零至几十米。
UHF射频标签是无源的(不需要供电),因此十分适合用在要求体积小且无电池供电的场景。但由于标签是无源的,其穿透性相比有源的会差一些,所以在要求穿透性的应用场合就不太合适。
每个标签有一个12字节的EPC码,这个码可以作为标签的身份ID,因此我们可以利用读写卡器来扫描或改写这个ID,从而实现对被识别物体或人的识别以及状态的修改。
二、例程实现功能介绍
利用UHF RFID读写卡模块实现如下两个功能:
- 实现对周围的标签进行扫描,并输出每个标签的12字节身份ID(EPC码)
- 实现对某个标签身份ID的写入修改操作
Core提供了十分简单的API函数,所以只需下面三个函数即可完成上面的功能。
LIB_R200ReaderConfig()
r1,r2 = LIB_R200GetCard()
r1 = LIB_R200SetCard()
三、接线图
四、材料清单
- UHF RFID 读卡器模块
- 读卡器配套天线(SMA母头公针),根据不同距离需求选择不同增益的UHF RFID超高频天线(本篇章实验中所使用的china2频段为920.125~924.875MHz)
- 射频标签(选择860-925MHz频段的标签(需支持协议类型:UHF EPC Gen2))
模块介绍 | |
工作电压 | 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)写某个标签的卡号
- 注意:下面代码中把发射功率降低至14dBm,主要有两个原因:
- Core开发板的5v电源如果取自USB接口的5V电脑电源(Max:500mA),带载能力不够强,降低发射功率有利于提升写卡成功率。当然如果是更强带载能力的电源,可以不用考虑此条限制。
- 发射功率降低后,距离范围也会降低很多,这也符合写卡时的场景。
- 注意:即使作为写卡器,对LIBR200GetCard()扫描卡号函数的调用也不要删除,不然无法正常使用LIBR200SetCard()函数。
- 注意:写入卡号的同时也会写入标签密码,需提供原始密码,和新密码。新出厂的标签原始密码一般都为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)扫描周围的标签卡号
(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
上面error_code = 0表示写卡号成功,如果是其他值说明写卡失败,需要重新再来,每种error值代表特定的错误。详情请查阅API手册。
注意写标签时需保持标签离读卡器天线8-10cm左右成功几率更高,且周围不能出现其他标签的干扰,不然会导致写卡失败,error_code = 1。
由于各种原因都可能导致不是每次写卡都会100%成功,所以当写卡失败(error_code=0)时,用户需要重新执行一次写卡操作。