0 前言
🔥 这两年开始毕业设计和毕业答辩的要求和难度不断提升,传统的毕设题目缺少创新和亮点,往往达不到毕业答辩的要求,这两年不断有学弟学妹告诉学长自己做的项目系统达不到老师的要求。
为了大家能够顺利以及最少的精力通过毕设,学长分享优质毕业设计项目,今天要分享的是
🚩 基于树莓派的寝室宿舍门禁刷卡系统
🥇学长这里给一个题目综合评分(每项满分5分)
- 难度系数:4分
- 工作量:4分
- 创新点:3分
1 前言
本来想弄个指纹开锁,没想到指纹模块略有点贵,只能退而求其次使用刷卡模块(有钱了一定上指纹模块)。
所以打算使用 RFID 或 NFC 模块读取校园卡进行开门,用上小米手环的NFC爽的一批!
2 主要器件
- 树莓派(型号什么的基本上没影响,9102年了,总不可能买2吧)
- ms90s 舵机(拉开门锁)
- RFID-RC522 模块(读卡)
- 各种类型的杜邦线(连接引脚用)
- 不定量的螺丝(固定模块于门上)
3 实物效果
4 树莓派读取 RC522 RFID 标签
简介
RC522 RFID 模块是一个简单的附加组件,我们可以连接到 Raspberry Pi 以读取 MIFARE 标签和卡片。这是一个很棒的功能,可以包含在安全系统或任何需要识别物体或人而无需按下按钮、操作开关或其他传感器的应用程序中。非接触式标签可以放在钥匙圈上,卡片可以很好地放在钱包里。
支持的协议
使用 RC522 芯片的模块应该支持所有使用以下标准的标签:
- MIFARE 迷你
- MIFARE 1K
- MIFARE 4K,
- MIFARE 超轻
- MIFARE DESFire EV1
- MIFARE Plus 射频
可以购买额外的卡片和标签,但您应该确保它们支持其中一种标准。
这些 RFID 模块无法读取非接触式银行卡。他们可以从智能手机读取 ID,但 ID 每次都不同,因此在大多数情况下不是很有用。
硬件设置
使用 7 路母母跨接电缆将模块连接到 Pi。
接线细节如下表所示:
下载 RC522 Python 库
示例 Python 脚本
import time
import RPi.GPIO as GPIO
import MFRC522
# Create an object of the class MFRC522
MIFAREReader = MFRC522.MFRC522()
# Welcome message
print("Looking for cards")
print("Press Ctrl-C to stop.")
# This loop checks for chips. If one is near it will get the UID
try:
while True:
# Scan for cards
(status,TagType) = MIFAREReader.MFRC522_Request(MIFAREReader.PICC_REQIDL)
# Get the UID of the card
(status,uid) = MIFAREReader.MFRC522_Anticoll()
# If we have the UID, continue
if status == MIFAREReader.MI_OK:
# Print UID
print("UID: "+str(uid[0])+","+str(uid[1])+","+str(uid[2])+","+str(uid[3]))
time.sleep(2)
except KeyboardInterrupt:
GPIO.cleanup()
整合开门逻辑
- 先用 RC522 将相关卡的 ID 读入并存储。
- RC522 读取的卡片 ID 与存入的 ID 对比,符合则调用 open door 模块。
- open door 中对 mg90s 舵机进行控制,拉开门锁。
最终实现代码:
#!/usr/bin/python3
# -*- coding: utf-8 -*-
# @Time : 2019/8/6 16:19
# @FileName : entrance_guard.py
# @Author : jiaye
import os
import RPi.GPIO as GPIO
import SimpleMFRC522
def opendoor():
os.system("python /root/work_repository/RC522/open_door.py")
if __name__ == '__main__':
reader = SimpleMFRC522.SimpleMFRC522()
while(True):
try:
print ("Ready to read card")
id, text = reader.read()
print("Card id: ", id)
if (id == 357306137218):
# Open the door
# opendoor()
opendoor()
print ("Door is opened")
print(text)
finally:
GPIO.cleanup()
5 mg90s 控制原理
mg90s 的控制信号为周期 20ms 的 PWM 信号,其脉冲宽度范围为 0.5ms - 2.5 ms ,对应的舵机控制角度为 0-180 度,对应的占空比为 2.5% - 12.5% 。
注:舵机任意角度与占空比都是一一对应的,只要给出的脉冲宽度不一致,则一定会变换角度
如脉冲宽度为1.5 ms 时,对应的角度则为 90 度,详见下图:
检测舵机是否能正常工作
运行如下代码:
#!/usr/bin/python3
# -*- coding: utf-8 -*-
# @Time : 2019/8/6 18:56
# @FileName : open_door.py
# @Author : jiaye
import RPi.GPIO as GPIO
import time
import signal
import atexit
if __name__ == '__main__':
atexit.register(GPIO.cleanup)
servopin = 21
GPIO.setmode(GPIO.BCM)
GPIO.setup(servopin, GPIO.OUT, initial=False)
# 创建 PWM 实例
# channel: servopin, frequency: 50HZ
p = GPIO.PWM(servopin, 50)
# 更改频率,freq 为设置的新频率,单位为 Hz
# p.ChangeFrequency(freq)
# 启用 PWM
# para: duty ratio(占空比),一个周期内,通电时间所占比例
p.start(0)
# time.sleep(2)
for i in range(0, 181, 10):
# 更改占空比
p.ChangeDutyCycle(2.5 + 10 * i / 180) # 设置转动角度
time.sleep(0.02) # 等该20ms周期结束
p.ChangeDutyCycle(0) # 归零信号
# time.sleep(2)
print ("Opening door")
time.sleep(1)
for i in range(181, 0, -10):
p.ChangeDutyCycle(2.5 + 10 * i / 180)
time.sleep(0.02)
p.ChangeDutyCycle(0)
# time.sleep(0.2)
当舵机能够正常运行时说明之前的步骤正确,否则着重检查舵机有没有问题(如接线或舵机的触点没焊好,出现松动)
6 最后
转载:https://blog.csdn.net/MDC_sir/article/details/128329569