基于树莓派的防摔系统
ZSTUGWH
一、引言
防摔系统是一种旨在保护老人免受意外摔落损坏的技术解决方案。在基于树莓派设计的防摔系统中,树莓派是核心控制单元,通过使用各种传感器和执行器,实时监测设备的倾斜、加速度和位置等参数,以便迅速做出响应并防止摔落。
二、系统详细设计
1、硬件设备
以下是基于树莓派设计的防摔系统的主要组件和功能:
- 树莓派4B:树莓派是一个基于ARM架构的单板计算机,具有强大的计算能力和丰富的接口。它作为防摔系统的核心,负责接收传感器数据、处理数据和控制执行器。
- ADXL345三轴加速度传感器:加速度计是一种传感器,用于测量设备的加速度。在防摔系统中,加速度计可用于检测设备的倾斜和移动情况。
- L298N(H桥):用于控制直流电机的速度和方向。它提供了一个简单而可靠的方式,通过接收控制信号来控制电机的运动。L298N通常被广泛应用于机器人、智能小车、机械装置和其他需要控制直流电机的项目中。
- 5V真空泵:模拟防摔系统充气功能
- 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、系统流程图
4、设计过程
4.1 接口示意图:
L298N:
ADXL345:
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)
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界面:显示实时加速度与加速度变化曲线
加速度超过一定阈值时,加速度数值变红
真空泵开始工作(本实验拿真空泵和袋子来模拟防摔衣的充气效果)
四、结论
基于树莓派的防摔系统是一种利用树莓派单板计算机和相关传感器、执行器等组件来保护老人免受意外摔落受伤的技术解决方案。
本系统使用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轴加速度减小等。
总的来说,该系统还是能够精准判断其加速度变化并做出反应,虽然和真实的防摔系统有所区别,但其原理是大同小异的。