二、实践目标
本实践项目运用掌控板作为智能终端,借助NFC近场通讯模块和来设计一个智能门禁系统,继而结合舵机实现门的开关并记录人员进出门时间。
三、知识目标
- 认识NFC近场通讯模块、舵机;
- 理解NFC近场通讯模块和舵机的使用和接线方法,能根据连线图进行实物连接;
- 掌握以micro:bit为智能终端,通过BXY软件编写代码读取 RFID 卡 ID 信息的方法;
四、实践准备
硬件清单
知识链接
简介:无线射频识别(Radio Frequency Identification,RFID),常称为感应式电子晶片或近接卡、感应卡、非接触卡、电子标签、电子条码等。其原理为由扫描器发射一特定频率之无线电波能量给接收器,用以驱动接收器电路将内部的代码送出,此时扫描器便接收此代码。
接收器的特殊在于免用电池、免接触、免刷卡故不怕脏污,且晶片密码为世界唯一无法复制,安全性高、长寿命。RFID的应用非常广泛,目前典型应用有动物晶片、汽车晶片防盗器、门禁管制、停车场管制、生产线自动化、物料管理。
我们使用的门禁卡就是使用这个技术实现的。我们日常所接触的门禁卡里面有RFID芯片,含有RFID芯片的门禁卡时通过感应门禁阅读器,阅读器发射出来的无线波读取门禁卡的数据信息,RFID芯片会写入个人信息,从而阅读器可以感应到谁进出,是不是属于这个房子的主人,从而完成一系列的工作,RFID技术门禁卡更是住户的一个电子身份证,让用户身处RFID技术中而不知。
简介:近场通信(Near Field Communication,简称NFC),是一种新兴的技术,使用了NFC技术的设备(例如移动电话)可以在彼此靠近的情况下进行数据交换,是由非接触式射频识别(RFID)及互连互通技术整合演变而来的,通过在单一芯片上集成感应式读卡器、感应式卡片和点对点通信的功能,利用移动终端实现移动支付、电子票务、门禁、移动身份识别、防伪等应用。
现在很多手机中带有NFC功能,就可以使用手机模拟交通卡、门禁卡等等功能,这样我们甚至可以连卡都不用带了,只要带上手机就可以开门解锁了。
简介:NFC近场通讯模块采用NXP PN532进口高集成NFC通信芯片,支持市面上常见的各类MIFARE Classic S50/S70系列(即M1卡)和NTAG21x系列等工作频率在13.56Mhz的NFC电子标签或卡片。采用Gravity标准的PH2.0-4P接口,除了让接线更方便,在保留UART的基础上额外复合了I2C,通过开关轻松切换两种不同的接口,使用更灵活。当使用UART串口时,可以利用市面上常见的USB to UART转换器和第三方上位机软件轻松读写操作各类NFC卡。当使用I2C接口时,则可用于Arduino、micro:bit、FireBeetle ESP32、FireBeetle ESP8266等各类3V3/5V主控系统。
五、实践过程
在本项目中,我们将利用NFC近场通讯模块和舵机,结合SIoT物联网平台,分步骤设计一个智能门禁系统。在系统中有两部分,一部分是SIot物联网平台,主要执行数据接收和发送的部分,另一部分主控板则需要执行检测和判断,并将数据发送给SIot平台,或接收SIot平台发来的指令执行对应的功能。
- 检测RFID 卡 ID 信息
- 控制舵机转动
- 与物联网平台通信
任务1:检测RFID 卡 ID 信息
1、硬件搭建
STEP1:将一块掌控板插入I/O扩展板,注意正反
STEP2:按下图通过连接线将NFC近场通讯模块与舵机接入扩展板。
STEP3:通过USB连接线将掌控板接到计算机。
STEP4:将 NFC 近场通讯模块上的开关拨到 UART 一端。
2、软件编写
STEP1:软件设置
1、创建与保存项目文件
(1)启动BXY编程软件,选择主控类型“掌控板”。
(2)新建项目,保存并命名为“z7.1”。
STEP2:rfid_pn532程序烧录
在编写实验程序之前,我们需要先烧录rfid_pn532库程序至主控板中。程序见附录1。
STEP3:程序编写
# 功能:读取RFID卡ID信息
# 实验:
# 将RFID读卡器的TXD接在P15 RXD接在P16,运行此程序
# 将RFID卡放在读卡器上, 读到NFC卡, 蜂鸣器将响一下
# OLED屏幕上显示对应的信息
'''
注意: 要先烧录rfid_pn532.py文件
'''
from machine import UART
from mpython import *
import time
import music
from rfid_pn532 import RFID_PN532
u = UART(1, baudrate=115200, rx=Pin.P15, tx=Pin.P16, timeout=10)
pn = RFID_PN532(u)
oled.fill(0)
oled.DispChar("正在连接读卡器...",0,0)
oled.show()
pn.wakeup()
oled.DispChar("连接成功", 32,32)
oled.show()
oled.fill(0)
while True:
detected,id = pn.read_tag()
if detected:
oled.DispChar('探测到NFC卡',0,16)
music.play(music.BA_DING)
oled.DispChar(" id=%2x%2x%2x%2x"%(id[0],id[1],id[2],id[3]),32,32)
else:
oled.DispChar('未检测到卡',0,16)
oled.show()
oled.fill(0)
time.sleep(1)
3、运行调试
STEP1:点击“烧录”上传程序并运行
|
|
读卡器没有检测到NFC卡片时,掌控板屏幕显示未检测到卡 |
把NFC卡片放到读卡器上,蜂鸣器发出嘟的一声,掌控板屏幕显示NFC卡片的ID |
任务2:反馈控制
在上个任务中,我们已经实现了RFID 卡 ID 信息的检测,接下来,让我们自己尝试编写程序实现反馈控制,当检测信息正确时使舵机转动起来实现开门的效果。
任务3:与SIoT物联网平台通信
在实现控制门的开关后,让我们继续搭建SIoT物联网平台,完成智能门禁系统,实现与平台的通信,并以此记录人员进出门时间吧。
六、延伸拓展
- 通过之前加密相关知识的学习,我们知道NFC近场通讯模块可以将数据读取与写入到空白的卡片中,让我们自己尝试往卡片中写入信息并读取吧!
- NFC功能除了应用在门禁上,还有什么场景可以使用到它?
附录
附录1
import time
class RFID_PN532:
def __init__(self,uart,interval=200):
self.uart = uart
self.interval = interval
self.ack = bytearray(25)
self.id = bytearray(4)
def send_and_response(self,cmd):
self.uart.write(cmd)
time.sleep_ms(self.interval)
resp = self.uart.read()
return resp
def wakeup(self):
cmd= b'\x55\x55\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\x03\xfd\xd4\x14\x01\x17\x00'
respect = b'\x00\x00\xff\x00\xff\x00\x00\x00\xff\x02\xfe\xd5\x15\x16\x00'
while True:
r = self.send_and_response(cmd)
if r == respect:
break
time.sleep_ms(100)
def read_tag(self):
detected = False
new_card = False
cmd = b'\x00\x00\xFF\x04\xFC\xD4\x4A\x01\x00\xE1\x00'
time.sleep_ms(self.interval)
r = self.send_and_response(cmd)
if(len(r) == 6):
self.id=b'\x00\x00\x00\x00'
elif(len(r) == 25):
detected = True
if(self.is_new_card(r)):
self.id = r[19:23]
new_card = True
return detected,self.id
def is_new_card(self, resp):
std_ack = b'\x00\x00\xFF\x00\xFF\x00\x00\x00\xFF\x0C\xF4\xD5\x4B\x01\x01\x00\x04\x08\x04'
if(self.id == resp[19:23]):
return False
if(std_ack != resp[0:19]):
return False
return True