一.概要
据统计每年约有 300 万老年人因跌倒受伤而在急诊室接受治疗,每五次跌倒就有一次会造成伤害,例如骨折或头部受伤,每年至少有 300,000 名老年人因髋部骨折住院。
所以跌倒检测系统前景非常广阔,可以在家庭环境、养老院和医疗机构、公共场所等多个领域和场景中发挥重要作用。在家庭环境中,这种系统可以为老年人提供额外的安全保障,一旦发生跌倒,系统将立即发送警报给家庭成员或医疗人员,以便及时采取措施。在养老院和医疗机构中,这种系统可以帮助工作人员及时发现老年人的跌倒情况,并采取适当的救助措施,减少因跌倒而引发的紧急情况。
本文就做了一个简单跌倒检测的系统,采用STM32F103C8T6单片机+MPU6050陀螺仪模块+蜂鸣器报警。用一个小电机来演示跌倒监测效果是否可以。
二.实验原理
硬件连接原理框图如下:
各传感器模块简介:
MPU6050是一款功能强大的六轴运动跟踪传感器,适用于各类物体加速度与角速度的精确测量,MPU6050主要实现倾斜检测。
直流有刷电机(BDC)在允许范围内,供电即可工作,只需要调整电压即可改变转速,具有良好的调速性能。
蜂鸣器是一种一体化结构的电子讯响器,采用直流电压供电,当I/O口输入高电平时,蜂鸣器发声。
三.实验控制流程
STM32F103C8T6单片机上电后,驱动直流有刷电机旋转,并时刻监测MPU6050陀螺仪模块采集到的倾斜角度,等到MPU6050检测到倾斜角度过大,单片机停止驱动直流有刷电机,并驱动蜂鸣器报警。
四.STM32单片机跌倒监测实验(MPU6050+直流有刷电机+蜂鸣器)
板子与MPU6050陀螺仪模块用杜邦线连接:
板子G-----模块GND
板子3.3---模块VCC
板子B6---模块SCL
板子B7---模块SDA
杜邦线接板子跟蜂鸣器
板子3.3---模块VCC
板子B12---模块I/O
板子G-----模块GND
用4根杜邦线把电机模块与开发板相连
板子3.3----模块VCC
板子A0-----模块A-1A
板子A1-----模块A-1B
板子G------模块GND
把四叶螺旋桨插到小型直流电机端口,电机的两根线连接到 L9110 两路电机驱动板的绿端子处(MOTOR A)
打开STM32CubeMX软件,新建工程
Part Number处输入STM32F103C8,再双击就创建新的工程
配置下载口引脚
配置外部晶振引脚
配置系统主频
IIC配置
GPIO配置
配置工程文件名,保存路径,KEIL5工程输出方式
生成工程
用Keil5打开工程
添加代码
主要程序:
unsigned char t,CleanTime;
uint32_t TimeCounter;
extern void i2c_CfgGpio(void);
short Accel[3];
short Gyro [3];
short Temp;
float AccelData[3];//单位mg
float GyroData[3];//单位mdps
float Angle;
/* USER CODE END 0 */
/* USER CODE END PFP */
/* Private user code ---------------------------------------------------------*/
/* USER CODE BEGIN 0 */
/* USER CODE END 0 */
/**
* @brief The application entry point.
* @retval int
*/
int main(void)
{
/* USER CODE BEGIN 1 */
/* USER CODE END 1 */
/* MCU Configuration--------------------------------------------------------*/
/* Reset of all peripherals, Initializes the Flash interface and the Systick. */
HAL_Init();
/* USER CODE BEGIN Init */
/* USER CODE END Init */
/* Configure the system clock */
SystemClock_Config();
/* USER CODE BEGIN SysInit */
/* USER CODE END SysInit */
/* Initialize all configured peripherals */
MX_GPIO_Init();
MX_I2C1_Init();
/* USER CODE BEGIN 2 */
OLED_Init(); //初始化OLED
MPU6050_Init();//MPU6050初始化配置
if(MPU6050ReadID() == 0)//读取MPU6050 ID
{
while(1);
}
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_0, GPIO_PIN_RESET);//启动风扇
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_1, GPIO_PIN_SET);
/* USER CODE END 2 */
/* Infinite loop */
/* USER CODE BEGIN WHILE */
while (1)
{
/* USER CODE END WHILE */
/* USER CODE BEGIN 3 */
HAL_Delay(100);
MPU6050ReadAcc(Accel);
for( int i=0;i<3;i++)
{
if(Accel[i]>=0)
{
AccelData[i]=Accel[i]*2000/32768;
}else
{
AccelData[i]=-(-Accel[i]+1)*2000/32768;
}
}
if(AccelData[1]<0)
{
OLED_ShowString(40,3,"-");
OLED_ShowNum(48,3,-AccelData[1],4,16);//加速度y
}else
{
OLED_ShowNum(48,3,AccelData[1],4,16);//加速度y
}
if(AccelData[2]<0)
{
OLED_ShowString(80,3,"-");
OLED_ShowNum(88,3,-AccelData[2],4,16);//加速度z
}else
{
OLED_ShowNum(88,3,AccelData[2],4,16);//加速度z
}
Angle = atan2(AccelData[2], AccelData[1])*180/3.14f;//计算倾角,正常Z轴垂直水平地面,角度应该在90度左右
if(Angle<=80 || Angle>=100)//倾斜明显,报警,风扇停止转动
{
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_0, GPIO_PIN_SET);//启动风扇
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_1, GPIO_PIN_SET);
HAL_GPIO_TogglePin(GPIOB, GPIO_PIN_12);//PB12引脚翻转输出
}else
{
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_0, GPIO_PIN_RESET);//启动风扇
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_1, GPIO_PIN_SET);
HAL_GPIO_WritePin(GPIOB, GPIO_PIN_12,GPIO_PIN_RESET);//PB12拉低,报警消除
}
}
/* USER CODE END 3 */
}
五.CubeMX工程源代码下载
通过百度网盘分享的文件:39.跌倒监测实验(MPU6050+直流有刷电机+蜂鸣器).rar
链接:https://pan.baidu.com/s/10eVXaiJGxt9BxrGVfhdZpw
提取码:51kr
如果链接失效,可以联系博主给最新链接
程序下载下来之后解压就行
六.实验效果视频
STM32F103C8T6+MPU6050陀螺仪跌倒检测实验
七.小结
跌倒检测实验,能更加深对MPU6050传感器的了解,可以应用到其他各种应用环境。