• 【毕业设计】 树莓派寝室宿舍门禁刷卡系统 - 物联网 单片机 嵌入式



    0 前言

    🔥 这两年开始毕业设计和毕业答辩的要求和难度不断提升,传统的毕设题目缺少创新和亮点,往往达不到毕业答辩的要求,这两年不断有学弟学妹告诉学长自己做的项目系统达不到老师的要求。

    为了大家能够顺利以及最少的精力通过毕设,学长分享优质毕业设计项目,今天要分享的是

    🚩 基于树莓派的寝室宿舍门禁刷卡系统

    🥇学长这里给一个题目综合评分(每项满分5分)

    • 难度系数:4分
    • 工作量:4分
    • 创新点:3分

    🧿 选题指导, 项目分享:

    https://gitee.com/dancheng-senior/project-sharing-1/blob/master/%E6%AF%95%E8%AE%BE%E6%8C%87%E5%AF%BC/README.md


    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()
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32

    整合开门逻辑

    • 先用 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()
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30

    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)
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46

    当舵机能够正常运行时说明之前的步骤正确,否则着重检查舵机有没有问题(如接线或舵机的触点没焊好,出现松动)


    6 最后

  • 相关阅读:
    5个汇编考察问题
    《Mycat分布式数据库架构》之数据切分实战
    Django templates 存放html目录
    2022年中国消费金融行业数字化技术创新分析
    可降阶的高阶方程与高阶线性微分方程
    手把手教你 在IDEA搭建 SparkSQL的开发环境
    MASA Framework -- EventBus入门与设计
    CVE-2022-29405 Apache Archiva任意用户密码重置漏洞分析
    c++提高篇——模板
    windows频繁更新问题解决方案
  • 原文地址:https://blog.csdn.net/m0_71572576/article/details/126794666