2021-8-2 15:42:29 [显示全部楼层]
485浏览
查看: 485|回复: 0

[BXY高中信息技术教程] 「BXY」掌控板 高中信息技术教程—智能门禁系统

[复制链接]
本帖最后由 EVE 于 2021-8-2 15:55 编辑

一、实践情境
住在一些老旧小区时,每次出门,我们都得随身携带一长串钥匙,这为我们的生活带来了许多不便。为此,在这节课上,我们将设计一个智能门禁系统,能够免去带钥匙的烦恼并能记录人员进出门时间。
image001.png

二、实践目标

本实践项目运用掌控板作为智能终端,借助NFC近场通讯模块和来设计一个智能门禁系统,继而结合舵机实现门的开关并记录人员进出门时间。

三、知识目标

  1. 认识NFC近场通讯模块、舵机;
  2. 理解NFC近场通讯模块和舵机的使用和接线方法,能根据连线图进行实物连接;
  3. 掌握以micro:bit为智能终端,通过BXY软件编写代码读取 RFID 卡 ID 信息的方法;

四、实践准备

硬件清单

掌控板x2 I/O扩展板x1 NFC近场通讯模块 x1 DMS-MG90 金属9g舵机 x1 Type-C&Micro二合一USB线x1

软件使用:BXY编程软件SIoT软件

知识链接

  • 无线射频技术

简介:无线射频识别(Radio Frequency Identification,RFID),常称为感应式电子晶片或近接卡、感应卡、非接触卡、电子标签、电子条码等。其原理为由扫描器发射一特定频率之无线电波能量给接收器,用以驱动接收器电路将内部的代码送出,此时扫描器便接收此代码。

接收器的特殊在于免用电池、免接触、免刷卡故不怕脏污,且晶片密码为世界唯一无法复制,安全性高、长寿命。RFID的应用非常广泛,目前典型应用有动物晶片、汽车晶片防盗器、门禁管制、停车场管制、生产线自动化、物料管理。

我们使用的门禁卡就是使用这个技术实现的。我们日常所接触的门禁卡里面有RFID芯片,含有RFID芯片的门禁卡时通过感应门禁阅读器,阅读器发射出来的无线波读取门禁卡的数据信息,RFID芯片会写入个人信息,从而阅读器可以感应到谁进出,是不是属于这个房子的主人,从而完成一系列的工作,RFID技术门禁卡更是住户的一个电子身份证,让用户身处RFID技术中而不知。

  • 近场通信

简介:近场通信(Near Field Communication,简称NFC),是一种新兴的技术,使用了NFC技术的设备(例如移动电话)可以在彼此靠近的情况下进行数据交换,是由非接触式射频识别(RFID)及互连互通技术整合演变而来的,通过在单一芯片上集成感应式读卡器、感应式卡片和点对点通信的功能,利用移动终端实现移动支付、电子票务、门禁、移动身份识别、防伪等应用。

现在很多手机中带有NFC功能,就可以使用手机模拟交通卡、门禁卡等等功能,这样我们甚至可以连卡都不用带了,只要带上手机就可以开门解锁了。

  • 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平台发来的指令执行对应的功能。

  1. 检测RFID 卡 ID 信息
  2. 控制舵机转动
  3. 与物联网平台通信

任务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物联网平台,完成智能门禁系统,实现与平台的通信,并以此记录人员进出门时间吧。

六、延伸拓展

  1. 通过之前加密相关知识的学习,我们知道NFC近场通讯模块可以将数据读取与写入到空白的卡片中,让我们自己尝试往卡片中写入信息并读取吧!
  2. 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

z7.zip

496 Bytes, 阅读权限: 10, 下载次数: 3

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

为本项目制作心愿单
购买心愿单
心愿单 编辑
[[wsData.name]]

硬件清单

  • [[d.name]]
btnicon
我也要做!
点击进入购买页面
上海智位机器人股份有限公司 沪ICP备09038501号-4

© 2013-2021 Comsenz Inc. Powered by Discuz! X3.4 Licensed

mail