基于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进行驱动时的连接及通信问题,目前尚需解决。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Non-Contrastive Unsupervised Learning of Physiological Signals from Video

研究背景 基于相机的生命体评估是一个快速增长的领域&#xff0c;可以在各种设置中进行非接触式健康监测。虽然许多信号避免了人眼的检测&#xff0c;但可见光和红外范围内的视频数据包含由血量和呼吸等生理逻辑振荡引起的微妙强度变化。用于估计心脏脉搏的远程光电容积术&…

外汇天眼:最新监管警告名单更新,远离以下无牌黑户!

监管信息早知道&#xff01;外汇天眼将每周定期公布监管牌照状态发生变化的交易商&#xff0c;以供投资者参考&#xff0c;规避投资风险。如果平台天眼评分过高&#xff0c;建议投资者谨慎选择&#xff0c;因为在外汇天眼评分高不代表平台没问题&#xff01; 以下是监管牌照发生…

到底是前端验证还是后端验证

背景 软件应用研发中&#xff0c; 前端验证还是后端验证这是意识与认知问题。鉴于某些入门同学还不清楚&#xff0c;我们再来看下&#xff1a; 一. 从软件行业来自国外 Q: 前端验证和后端验证都是对同一个数据的验证&#xff0c;有什么区别&#xff1f; A: 二者的目的不同&…

【网络安全】Log4j 远程代码执行漏洞解析

一、简介 Log4j2 是一个用于 Java 应用程序的成熟且功能强大的日志记录框架。 它是 Log4j 的升级版本&#xff0c;相比于 Log4j&#xff0c;Log4j2 在性能、可靠性和灵活性方面都有显著的改进。 二、特点 Log4j2 是一个功能强大且灵活的日志记录框架&#xff0c;旨在提供高…

基于深度学习的安全帽检测识别系统(含UI界面,yolov8、Python代码,数据集)

项目介绍 项目中所用到的算法模型和数据集等信息如下&#xff1a; 算法模型&#xff1a;     yolov8 yolov8主要包含以下几种创新&#xff1a;         1. 添加注意力机制&#xff08;SE、CBAM等&#xff09;         2. 修改可变形卷积&#xff08;DySnake-主干c…

猫头虎分享2023年12月17日博客之星候选--城市赛道博主文章数据

猫头虎分享2023年12月17日博客之星候选–城市赛道博主文章数据 博主猫头虎的技术世界 &#x1f31f; 欢迎来到猫头虎的博客 — 探索技术的无限可能&#xff01; 专栏链接&#xff1a; &#x1f517; 精选专栏&#xff1a; 《面试题大全》 — 面试准备的宝典&#xff01;《IDEA开…

一文搞懂设计模式之建造者模式

大家好&#xff0c;我是晴天&#xff0c;我们又见面了&#xff0c;这周我们继续学习一文搞懂设计模式系列&#xff0c;本周将一起学习建造者模式&#xff08;生成器模式&#xff09; 什么是建造者模式 建造者模式&#xff08;也称为生成器模式&#xff09;是一种创建型设计模式…

ov多域名证书可以保护几个域名

互联网上的站点大多遵循http明文传输协议传输数据&#xff0c;因此&#xff0c;网站在传输一些私人信息时很容易被劫持、篡改&#xff0c;在互联网日益普及的今天&#xff0c;信息安全显得尤为重要。SSL数字证书就是开发者用来保护网站信息安全的工具之一&#xff0c;它会为htt…

【源码】基于jsp+servlet+jdbc实现的学生管理系统

文章目录 系统介绍技术选型成果展示账号地址及源码获取 系统介绍 基于jspservletjdbc实现的学生管理系统分为管理员与学生两种角色&#xff0c;以下是权限说明 学生 查看/修改信息&#xff1a;查看/修改自己的用户信息 修改密码&#xff1a;修改自己的登录密码&#xff0c;…

LAMP集中式搭建+LNMP分布式搭建(新版)

LAMP搭建LNMP搭建 LAMP搭建LNMP搭建一、LAMP搭建(集中式)1、LAMP简介2、LAMP组件及作用3、编译安装Apache httpd服务4、编译安装mysqld 服务5、编译安装PHP解析环境6、安装论坛7、安装博客 二、LNMP搭建(分布式)1、LNMP工作原理2、安装nginx3、安装mysql4、安装php5、在浏览器测…

一文解读医疗评级 IT 基础设施灾备能力要求与 SmartX 超融合灾备解决方案(附用户实践与电子书)

近年来&#xff0c;电子病历系统应用水平分级评价&#xff08;以下简称“电子病历评级”&#xff09;和医院信息互联互通标准化成熟度测评&#xff08;以下简称“互联互通评级”&#xff09;正在成为国内医疗服务信息化建设的重要评价标准&#xff0c;各个省市都出台了明确的考…

效率必备神器

在这个快节奏的工作环境中&#xff0c;使用一些强大的工作软件来提高工作效率和组织工作流程变得异常重要。无论是个人任务管理还是团队协作&#xff0c;合适的工作软件都能极大地改善工作质量和生产力。让我们深入了解一些我个人强力推荐的工作软件&#xff0c;希望能给你带来…

年终盘点文生图的狂飙之路,2023年文生图卷到什么程度了?

目录 前言发展1月2月3月4月5月6月7月9月10月11月12月 思考与总结参考文献 前言 说到文生图&#xff0c;可能有些人不清楚&#xff0c;但要说AI绘画&#xff0c;就有很多人直呼&#xff1a; 2022可以说是AI绘图大爆发的元年。 AI绘画模型可以分为扩散模型&#xff08;Diffusio…

基于SSM框架的音乐产品购物网站的设计与实现论文

目 录 目 录 I 摘 要 III ABSTRACT IV 1 绪论 1 1.1 课题背景 1 1.2 研究现状 1 1.3 研究内容 2 2 系统开发环境 3 2.1 vue技术 3 2.2 JAVA技术 3 2.3 MYSQL数据库 3 2.4 B/S结构 4 2.5 SSM框架技术 4 3 系统分析 5 3.1 可行性分析 5 3.1.1 技术可行性 5 3.1.2 操作可行性 5 3…

vscode不同代码的项目分配不同的工作区

vscode不同代码的项目分配不同的工作区 很多时候我们很多项目都需要使用vscode来进行编写代码&#xff0c;像我个人会拿vscode写python&#xff0c;linux远程写代码&#xff0c;前端和stm32的编辑器&#xff0c;这些项目都有自己的插件&#xff0c;如果我们启动某一个项目&…

Kafka设计原理详解

Kafka核心总控制器 (Controller) 在Kafka集群中&#xff0c;通常会有一个或多个broker&#xff0c;其中一个会被选举为控制器 (Kafka Controller)&#xff0c;其主要职责是管理整个集群中所有分区和副本的状态。具体来说&#xff1a; 当某个分区的leader副本出现故障时&#…

基本的逻辑门

前言 本篇文章介绍基本的逻辑门&#xff0c;然后给出C语言描述 逻辑门是在集成电路上的基本组件。简单的逻辑门可由晶体管组成。这些晶体管的组合可以使代表两种信号的高低电平在通过它们之后产生高电平或者低电平的信号。高、低电平可以分别代表逻辑上的“真”与“假”或二进…

中非经济贸易工作委员会在深圳挂牌启动

12月中旬&#xff0c;中非经济贸易工作委员会在广东深圳举办主题为“中流砥柱•非凡湾区”的2023中非经济贸易大湾区论坛。中非经济贸易工作委员会在深圳正式挂牌启动&#xff0c;开创了粤港澳大湾区中非贸易高质量发展新格局。 十年“一带一路”建设硕果累累&#xff0c;中非经…

vue3实现本地开发使用的px转换成vw,px转换成rem方法整理

前言&#xff1a; 项目中如果想本地开发使用px&#xff0c;但是界面上线以后界面是自适应的效果,可以有多种方式来实现效果。 一、px转成vw 1、安装&#xff0c;安装成功后&#xff0c;node_modules 会新增这两个插件包 npm i postcss-px-to-viewport-8-plugin 2、新增 post…

微信小程序预览pdf,修改pdf文件名

记录微信小程序预览pdf文件&#xff0c;修改pdf名字安卓和ios都可用。 1.安卓和苹果的效果 2.需要用到的api 1.wx.downloadFile wx.downloadFile 下载文件资源到本地。客户端直接发起一个 HTTPS GET 请求&#xff0c;返回文件的本地临时路径 (本地路径)&#xff0c;单次下载…