基于MPU6050的跌倒检测项目设计

一、背景

随着人口老龄化的不断加剧,老年人的健康和安全问题备受关注。本设计旨在利用STM32单片机与MPU6050传感器相结合,实现基于角度变化的跌倒检测系统。这一系统不仅能够快速、准确地检测老年人是否发生跌倒,还通过整合通信模块实现了实时的跌倒提醒功能。设计目标包括通过C编写MPU6050传感器的驱动代码和数据滤波算法,确保系统对身体姿态的敏感性和准确性。同时,通过整合通信模块,老年人在发生跌倒时能够及时地向特定用户发送提醒信息,包括短信和坐标,以便他们能够及时作出相应的帮助。为确保系统的可用性和便携性,本设计采用小型电池供电,使老年人可以随时随地使用。

注:本设计由于前期调研不够充分,没有GPS模块,也没有无线传输功能。

二、项目材料清单

面包板已经各种公母线

stm32f103c8t6

蜂鸣器

0.96寸OLED显示模块

CH340串口

ESP8266-01s

三、主控器与传感器的连接

电路连接图

这里因为我已经将原来的电路给拆了,所以只能照着这张图去给大家说下,GND和VCC就省去了。

蜂鸣器:I/O 与PB12相接

OLED:SCL与PB8,SDAPB9

MPU6050:SCL与PB10,SDA与PB11

串口:TXD与PA10,RXD与PA9

ESP8266-01s我没有驱动成功,所以放在这里只是一个摆设。需要注意的是MPU6050最好像我这样连接,因为我们需要通过它获取俯仰角和翻滚角,要保证模块的平稳。

通过串口发送数据

四、跌倒检测算法的设计

使用MPU6050传感器获取加速度计和陀螺仪的原始数据,通过STM32的I2C接口与MPU6050进行通信,读取加速度和角速度数据。该算法可以根据以下步骤来实现

步骤:

1. 计算加速度计推导的俯仰角和横滚角:

   a. 使用 atan2(AY, sqrt(AX * AX + AZ * AZ)) 计算 accPitch,将结果转换为角度。

   b. 使用 atan2(-AX, AZ) 计算 accRoll,将结果转换为角度。

2. 对陀螺仪数据进行角速度积分:

   a. 通过积分陀螺仪数据 GY,按照灵敏度系数(131.0)进行缩放,计算 gyroPitch。

   b. 通过积分陀螺仪数据 GX,使用相同的灵敏度系数,计算 gyroRoll。

3. 应用互补滤波:

   a. 将互补滤波系数 alpha 定义为 0.98。

   b. 利用互补滤波,结合加速度计推导的角度(accPitch、accRoll)和陀螺仪积分得到的角度(gyroPitch、gyroRoll):

4. 输出:

   更新后的俯仰角和横滚角代表设备平稳和稳定的方向。

下面是我写的伪代码,帮助大家理解这里:

Algorithm UpdateAttitude(int16_t AX, int16_t AY, int16_t AZ, int16_t GX, int16_t GY, int16_t GZ):

Input: Acceleration and gyroscope data (AX, AY, AZ, GX, GY, GZ)

Output: None (updates global variables pitch and roll)

1:accPitch = atan2(AY, sqrt(AX * AX + AZ * AZ)) * (180.0 / M_PI)

2:accRoll = atan2(-AX, AZ) * (180.0 / M_PI)

    3:gyroPitch = pitch + (float)GY / 131.0  

    4:gyroRoll = roll + (float)GX / 131.0

    5:alpha = 0.98  

    6:pitch = alpha * gyroPitch + (1.0 - alpha) * accPitch

    7:roll = alpha * gyroRoll + (1.0 - alpha) * accRoll

五、主逻辑代码

软件使用的Keil5,这些库函数都可以从江科大的视频获得,所以这里仅仅展示主逻辑代码

#include "stm32f10x.h"                  // Device header
#include "Delay.h"
#include "OLED.h"
#include "MPU6050.h"
#include "Buzzer.h"
#include "Serial.h"
#include <math.h>
#include <stdbool.h>bool pose1 = true;
bool pose2 = true;
#define M_PI (3.14159265358979323846264338327950288)
uint8_t ID;								//定义用于存放ID号的变量
int16_t AX, AY, AZ, GX, GY, GZ;			//定义用于存放各个数据的变量// 定义全局变量用于存储姿态角度
float pitch = 0.0; // 俯仰角
float roll = 0.0;  // 横滚角// 定义函数进行姿态检测
void UpdateAttitude(int16_t AX, int16_t AY, int16_t AZ, int16_t GX, int16_t GY, int16_t GZ) {// 加速度计的角度计算float accPitch = atan2(AY, sqrt(AX * AX + AZ * AZ)) * (180.0 / M_PI);float accRoll = atan2(-AX, AZ) * (180.0 / M_PI);// 陀螺仪积分得到角速度float gyroPitch = pitch + (float)GY / 131.0; // 131 根据陀螺仪灵敏度调整float gyroRoll = roll + (float)GX / 131.0;// 综合加速度计和陀螺仪数据,使用互补滤波float alpha = 0.98; // 互补滤波系数,根据需要调整pitch = alpha * gyroPitch + (1.0 - alpha) * accPitch;roll = alpha * gyroRoll + (1.0 - alpha) * accRoll;
}int main(void)
{/*模块初始化*/OLED_Init();		//OLED初始化MPU6050_Init();		//MPU6050初始化Serial_Init();Buzzer_Init();/*显示ID号*/OLED_ShowString(1, 1, "ID:");		//显示静态字符串ID = MPU6050_GetID();				//获取MPU6050的ID号OLED_ShowHexNum(1, 4, ID, 2);		//OLED显示ID号//Serial_SendByte(0x41);while (1){MPU6050_GetData(&AX, &AY, &AZ, &GX, &GY, &GZ);		//获取MPU6050的数据// 更新姿态角度UpdateAttitude(AX, AY, AZ, GX, GY, GZ);// 在OLED上显示姿态角度OLED_ShowString(2, 1, "Pitch: ");OLED_ShowSignedNum(2, 8, (int16_t)pitch, 5);OLED_ShowString(3, 1, "Roll: ");OLED_ShowSignedNum(3, 7, (int16_t)roll, 5);// 打印姿态if (pitch > 30) {OLED_ShowString(4, 1, "Back   ");pose1 = false;} else if (pitch < -30) {OLED_ShowString(4, 1, "Front  ");pose1 = false;} else {OLED_ShowString(4, 1, "Normal ");pose1 = true;}if (roll < -70) {OLED_ShowString(4, 10, "Right ");pose2 = false;} else if (roll > 0) {OLED_ShowString(4, 10, "Left  ");pose2 = false;} else {OLED_ShowString(4, 10, "Normal");pose2 = true;}if (!pose1 || !pose2) {// 触发蜂鸣器响Buzzer_ON();} else {// 关闭蜂鸣器Buzzer_OFF();}// 通过串口发送姿态角度Serial_SendString("Pitch: ");Serial_SendNumber((int16_t)pitch, 5);Serial_SendString(", Roll: ");Serial_SendNumber((int16_t)roll, 5);Serial_SendString("\r\n");}
}

简单来说下这个代码大致完成了什么功能,将面板板平放之后,我发现Pitch大约在-00006左右,roll大约在-00039左右,经过多次测试当俯仰角>30时判定为后倾,当俯仰角<-30时判定为前倾,当翻滚角>0时判定为左斜,当翻滚角<-70时判定为右斜。当满足上面任意请求时,蜂鸣器发出警报向周围人求助。

这里的阈值是可以修改的,在测试的时候也用OLED来显示了的,到一定的范围就打印出它的姿态,正常的就是normal,其他的就是使用的方向的英文来表示,大家想提供可以使用中文,因为我这个就是个课设作业,我也是才接触的stm32,花了一周的时间学习的江科大(有很多其实都没有用到),想拿高分最好就是把无线通信还有GPS的功能加上。

六、总结

本设计致力于解决老年人跌倒检测问题,采用了STM32F103C8T6主控制器,搭配蜂鸣器模块、MPU6050三轴加速度传感器、0.96寸OLED显示模块以及ESP8266-01s模块等组件,以实现全面的跌倒监测与通信功能。技术指标方面,STM32F103C8T6主控制器具备高性能、低功耗、丰富的I/O端口和通信端口等特点。MPU6050传感器具备消除敏感度、陀螺仪积分等先进特性,而0.96寸OLED屏为系统提供实时数据显示和系统调试支持。

尚待完善的地方:

(1)优化互补滤波算法的参数,以提高姿态角度计算的准确性和稳定性。

(2)进一步完善系统的无线通信功能,特别是考虑引入GPS功能,以确保在实际应用中能够可靠地向监护人发送准确的警报信息。同时还存在ESP8266-01s模块与STM32F103C8T6进行驱动时的连接及通信问题,目前尚需解决。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/300651.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

怎么搭建实时渲染云传输服务器

实时渲染云传输技术方案&#xff0c;在数字孪生、虚拟仿真领域使用越来越多&#xff0c;可能很多想使用该技术方案项目还不知道具体该怎么搭建云传输服务器&#xff0c;具体怎么使用实时云渲染平台系统。点量云小芹将对这两个问题做集中分享。 一、实时渲染服务器怎么搭建&…

blender scripting 编写

blender scripting 编写 一、查看ui按钮对应的代码二、查看或修改对象名称三、案例&#xff1a;渲染多张图片并导出对应的相机参数 一、查看ui按钮对应的代码 二、查看或修改对象名称 三、案例&#xff1a;渲染多张图片并导出对应的相机参数 注&#xff1a;通过ui交互都设置好…

算法与数据结构--二叉搜索树与自平衡二叉搜索树

0.字典&#xff08;即c的map&#xff09; 注&#xff1a;字典的 "member运算" 指的是检查字典中是否存在某个特定的键的操作&#xff0c;即查询操作。 如果我们使用数组来实现字典/map&#xff0c;虽然使用二分法查询也可以达到logn&#xff0c;但是的话插入和删除太…

【操作系统】探究进程奥秘:显示进程列表的解密与实战

​&#x1f308;个人主页&#xff1a;Sarapines Programmer&#x1f525; 系列专栏&#xff1a;Linux专栏&#xff1a;《探秘Linux | 操作系统解密》⏰诗赋清音&#xff1a;月悬苍穹泛清辉&#xff0c;梦随星河徜徉辉。情牵天际云千层&#xff0c;志立乘风意自飞。 ​ 目录 &a…

ImageJ图像滤波基础

文章目录 滤波简单滤波器卷积滤波Unsharp MaskTop Hat ImageJ系列&#xff1a;安装与初步&#x1f48e;灰度图像处理 滤波 预设滤波器 ImageJ的Process菜单提供了诸多图像滤波器&#xff0c;其中大部分方法均可定制参数&#xff0c;但也提供了一些已经预设参数的处理方法。 …

Visual Studio2022配置ReSharper C++ 常用设置

如需安装免费的可以在下面留言&#xff0c;看到即回复 文章目录 Visual Studio2022配置ReSharper C 常用设置配置Visual Studio2022&#xff0c;使其能够按回车进行补全配置ReSharper C 设置自动弹出配置ReSharper C 的快捷键ReSharper C 去掉注释拼写使用中文注释 如何关闭新版…

2007年AMC8数学竞赛中英文真题典型考题、考点分析和答案解析

今天&#xff0c;我们来继续研究AMC8竞赛的真题。通过反复研究历年真题&#xff0c;不仅可以掌握AMC8这个竞赛的命题规律和常见考点&#xff0c;通过真题的详细解析可以建立自己的解题思路、举一反三&#xff0c;还可以通过做真题不断发现自己的薄弱点查漏补缺。 今天我们来看看…

FinGPT:金融大语言模型 | 开源日报 No.127

verdaccio/verdaccio Stars: 15.0k License: MIT Verdaccio 是一个轻量级的 Node.js 私有代理仓库。 以下是 Verdaccio 的核心优势和关键特性&#xff1a; 零配置&#xff1a;无需复杂设置即可快速启动私有 npm 注册表。本地化管理&#xff1a;通过内置小型数据库进行简单而…

Nature | Baker团队用AI设计出史上最高互作强度的蛋白质

蛋白质是生命的基础&#xff0c;是生命功能的主要执行者&#xff0c;其结构与功能由氨基酸序列所决定。蛋白质设计是指对新蛋白质分子进行人为的合理设计&#xff0c;旨在设计新的活性&#xff0c;行为或目的&#xff0c;并增进对蛋白质功能的基本了解。可以从头开始设计蛋白质…

蓝桥杯备赛 day 1 —— 递归 、递归、枚举算法(C/C++,零基础,配图)

目录 &#x1f308;前言 &#x1f4c1; 枚举的概念 &#x1f4c1;递归的概念 例题&#xff1a; 1. 递归实现指数型枚举 2. 递归实现排列型枚举 3. 递归实现组合型枚举 &#x1f4c1; 递推的概念 例题&#xff1a; 斐波那契数列 &#x1f4c1;习题 1. 带分数 2. 反硬币 3. 费解的…

12.25

led.c #include "led.h" void all_led_init() {RCC_GPIO | (0X3<<4);//时钟使能GPIOE_MODER &(~(0X3<<20));//设置PE10输出GPIOE_MODER | (0X1<<20);//设置PE10为推挽输出GPIOE_OTYPER &(~(0x1<<10));//PE10为低速输出GPIOE_OSPEED…

【深度学习目标检测】十一、基于深度学习的电网绝缘子缺陷识别(python,目标检测,yolov8)

YOLOv8是一种物体检测算法&#xff0c;是YOLO系列算法的最新版本。 YOLO&#xff08;You Only Look Once&#xff09;是一种实时物体检测算法&#xff0c;其优势在于快速且准确的检测结果。YOLOv8在之前的版本基础上进行了一系列改进和优化&#xff0c;提高了检测速度和准确性。…