基于树莓派4B的防摔系统(课设)

基于树莓派的防摔系统

ZSTUGWH

一、引言

防摔系统是一种旨在保护老人免受意外摔落损坏的技术解决方案。在基于树莓派设计的防摔系统中,树莓派是核心控制单元,通过使用各种传感器和执行器,实时监测设备的倾斜、加速度和位置等参数,以便迅速做出响应并防止摔落。

二、系统详细设计

1、硬件设备

以下是基于树莓派设计的防摔系统的主要组件和功能:

  1. 树莓派4B:树莓派是一个基于ARM架构的单板计算机,具有强大的计算能力和丰富的接口。它作为防摔系统的核心,负责接收传感器数据、处理数据和控制执行器。
  2. ADXL345三轴加速度传感器:加速度计是一种传感器,用于测量设备的加速度。在防摔系统中,加速度计可用于检测设备的倾斜和移动情况。
  3. L298N(H桥):用于控制直流电机的速度和方向。它提供了一个简单而可靠的方式,通过接收控制信号来控制电机的运动。L298N通常被广泛应用于机器人、智能小车、机械装置和其他需要控制直流电机的项目中。
  4. 5V真空泵:模拟防摔系统充气功能
  5. 12V直流电源:为H桥供电

2、软件环境

python3.9

tkinter

board

busio

Adafruit-ADXL345

adafruit_adxl34x

matplotlib

安装指令:

pip install board
pip install adafruit-blinka
pip install Adafruit-ADXL345
pip install adafruit-circuitpython-adxl34x
pip install matplotlib
sudo apt-get install python3-pil python3-pil.imagetk
sudo apt-get install python3-dev python3-pip python3-smbus i2c-tools -y

3、系统流程图

image-20230608231028412

4、设计过程

4.1 接口示意图:

L298N:

image-20230609003142241

ADXL345:

image-20230609003254968

4.2 ADXL345测试
import time
import board
import busio
import adafruit_adxl34x


i2c = busio.I2C(board.SCL, board.SDA)

accelerometer = adafruit_adxl34x.ADXL345(i2c)

print("Range: ", accelerometer.range)
print("Data Rate: ", accelerometer.data_rate)

while True:

    acceleration = accelerometer.acceleration

    print("X: %.2f, Y: %.2f, Z: %.2f m/s^2" % (acceleration[0], acceleration[1], acceleration[2]))

    time.sleep(0.1)

image-20230609004850334

4.3 H桥连接直流电机测试

import RPi.GPIO as GPIO                
import time                             

GPIO.setmode(GPIO.BOARD)              

INT1 = 11                       
INT2 = 12                          

GPIO.setup(INT1,GPIO.OUT)
GPIO.setup(INT2,GPIO.OUT)

GPIO.output(INT1,GPIO.HIGH)
GPIO.output(INT2,GPIO.LOW)
4.4 主程序:
import time
import math
import board
import busio
import adafruit_adxl34x
import matplotlib.pyplot as plt
from matplotlib.backends.backend_tkagg import FigureCanvasTkAgg
import tkinter as tk
from tkinter import ttk


import RPi.GPIO as GPIO                 
import time                             

# GPIO.cleanup()
# GPIO.setmode(GPIO.BOARD)                

INT1 = 17                               #将L298 INT1口连接到树莓派Pin17
INT2 = 18                               #将L298 INT2口连接到树莓派Pin18



GPIO.setup(INT1,GPIO.OUT)
GPIO.setup(INT2,GPIO.OUT)

def high():
        GPIO.output(INT1,GPIO.HIGH)
        GPIO.output(INT2,GPIO.LOW)
        time.sleep(5)
        
def low():
        GPIO.output(INT1,GPIO.LOW)
        GPIO.output(INT2,GPIO.LOW)



class RealTimeGraph(tk.Tk):
    def __init__(self):
        tk.Tk.__init__(self)
        self.title("Real-Time Acceleration Graph")
        self.geometry("600x400")
        self.acceleration_data = []
        self.MAX_READINGS = 20
        

        i2c = busio.I2C(board.SCL, board.SDA)
        self.accelerometer = adafruit_adxl34x.ADXL345(i2c)
        

        self.fig, self.ax = plt.subplots()
        self.line, = self.ax.plot([], [], 'b-')
        

        self.canvas = FigureCanvasTkAgg(self.fig, master=self)
        self.canvas.get_tk_widget().pack(side=tk.TOP, fill=tk.BOTH, expand=True)
        

        self.after(100, self.update_graph)

    def update_graph(self):
        acceleration = self.accelerometer.acceleration
        

        x = acceleration[0]
        y = acceleration[1]
        z = acceleration[2]
        total = math.sqrt(x*x+y*y+z*z)
        
        self.acceleration_data.append(total)
        if len(self.acceleration_data) > self.MAX_READINGS:
                self.acceleration_data.pop(0)
        

        self.line.set_data(range(len(self.acceleration_data)), self.acceleration_data)

        self.ax.relim()
        self.ax.set_ylim(-5, 30)
        self.ax.set_xlim(0, 20)
        self.ax.autoscale_view()
        
        for text in self.ax.texts:
                text.remove()
        if total>=15 or total <= 5:
                self.ax.text(0.95, 0.95, "Acceleration: {:.2f}G".format(total), 
                        transform=self.ax.transAxes, ha='right', va='top', fontsize=10,color='red')
        else :
                self.ax.text(0.95, 0.95, "Acceleration: {:.2f}G".format(total), 
                        transform=self.ax.transAxes, ha='right', va='top', fontsize=10)
        

        self.canvas.draw()
        
        if total>=15 or total <=5:
                high()
        else:
                low()
        

        self.after(100, self.update_graph)


app = RealTimeGraph()
app.mainloop()

4.5 一些问题

在后来合并测试中出现了一些问题,主要原因是H桥连接直流电机使用的是BOARD模式,而ADXL345默认使用的是BCM编码,后来都统一成BCM编码并转换接口,得以测试成功。

三、实验结果与讨论

GUI界面:显示实时加速度与加速度变化曲线

image-20230609001401296

加速度超过一定阈值时,加速度数值变红

image-20230609001503125

真空泵开始工作(本实验拿真空泵和袋子来模拟防摔衣的充气效果)

在这里插入图片描述

四、结论

基于树莓派的防摔系统是一种利用树莓派单板计算机和相关传感器、执行器等组件来保护老人免受意外摔落受伤的技术解决方案。

本系统使用ADXL345三轴加速度传感器来感应加速度,在加速度计算上,本系统采用将三个方向的加速度的平方和相加再开方,公式如下:
g 2 = x 2 + y 2 + z 2 g^2 =x^2+y^2+z^2 g2=x2+y2+z2
此方案为比较保守的加速度计算方案,在日常生活中,还要考虑到三个方向加速度的权重,比如摔倒一般是Z轴加速度变化较大,可以给Z轴权重增大,X轴和Y轴加速度减小等。

总的来说,该系统还是能够精准判断其加速度变化并做出反应,虽然和真实的防摔系统有所区别,但其原理是大同小异的。

  • 5
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

第十六个季节

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值