Projektentwurf zur Sturzerkennung basierend auf MPU6050

1. Hintergrund

Da die Alterung der Bevölkerung immer weiter voranschreitet, haben die Gesundheits- und Sicherheitsprobleme älterer Menschen große Aufmerksamkeit erregt. Dieses Design zielt darauf ab, den STM32-Mikrocontroller in Kombination mit dem MPU6050-Sensor zu verwenden, um ein Sturzerkennungssystem basierend auf Winkeländerungen zu implementieren. Dieses System kann nicht nur schnell und genau erkennen, ob ältere Menschen gestürzt sind, sondern durch die Integration von Kommunikationsmodulen auch eine Sturzerinnerungsfunktion in Echtzeit erreichen. Zu den Entwurfszielen gehört das Schreiben des Treibercodes und des Datenfilteralgorithmus des MPU6050-Sensors über C, um die Empfindlichkeit und Genauigkeit des Systems gegenüber der Körperhaltung sicherzustellen. Gleichzeitig können ältere Menschen durch die Integration des Kommunikationsmoduls bei einem Sturz umgehend Erinnerungsinformationen, einschließlich Textnachrichten und Koordinaten, an bestimmte Benutzer senden, damit diese rechtzeitig Hilfe leisten können. Um die Benutzerfreundlichkeit und Tragbarkeit des Systems zu gewährleisten, wird dieses Design von einer kleinen Batterie betrieben, sodass ältere Menschen es jederzeit und überall nutzen können.

Hinweis: Aufgrund unzureichender Voruntersuchungen verfügt dieses Design weder über ein GPS-Modul noch über eine drahtlose Übertragungsfunktion.

2. Projektmaterialliste

Das Steckbrett verfügt über verschiedene männliche und weibliche Drähte

stm32f103c8t6

Summer

0,96-Zoll-OLED-Anzeigemodul

Serieller CH340-Anschluss

ESP8266-01s

3. Verbindung zwischen Hauptcontroller und Sensor

Schaltplan

Da ich die Originalschaltung hier bereits demontiert habe, kann ich sie nur anhand dieses Bildes erklären, GND und VCC werden weggelassen.

Summer: I/O ist mit PB12 verbunden

OLED: SCL mit PB8, SDAPB9

MPU6050: SCL und PB10, SDA und PB11

Serielle Schnittstelle: TXD und PA10, RXD und PA9

Ich habe ESP8266-01 nicht erfolgreich gefahren, daher ist es hier nur eine Dekoration. Es ist zu beachten, dass MPU6050 wie ich am besten verbunden ist, da wir den Nick- und Rollwinkel über ihn ermitteln müssen, um die Stabilität des Moduls sicherzustellen.

Senden Sie Daten über die serielle Schnittstelle

4. Design des Sturzerkennungsalgorithmus

Verwenden Sie den MPU6050-Sensor, um die Rohdaten des Beschleunigungsmessers und des Gyroskops zu erhalten, kommunizieren Sie mit der MPU6050 über die STM32-I2C-Schnittstelle und lesen Sie die Beschleunigungs- und Winkelgeschwindigkeitsdaten aus. Dieser Algorithmus kann gemäß den folgenden Schritten implementiert werden

Schritt:

1. Berechnen Sie vom Beschleunigungsmesser abgeleitete Nick- und Rollwinkel:

   a. Verwenden Sie atan2(AY, sqrt(AX * AX + AZ * AZ)), um accPitch zu berechnen und das Ergebnis in einen Winkel umzuwandeln.

   b. Verwenden Sie atan2(-AX, AZ), um accRoll zu berechnen und das Ergebnis in einen Winkel umzuwandeln.

2. Führen Sie eine Winkelgeschwindigkeitsintegration für die Gyroskopdaten durch:

   a. Berechnen Sie gyroPitch, indem Sie die Gyroskopdaten GY integrieren und entsprechend dem Empfindlichkeitskoeffizienten (131,0) skalieren.

   b. Berechnen Sie gyroRoll, indem Sie die Gyroskopdaten GX integrieren und denselben Empfindlichkeitskoeffizienten verwenden.

3. Ergänzende Filterung anwenden:

   a. Definieren Sie den Komplementärfilterkoeffizienten Alpha als 0,98.

   b. Verwenden Sie komplementäre Filterung, um die vom Beschleunigungsmesser abgeleiteten Winkel (accPitch, accRoll) und die durch die Gyroskopintegration erhaltenen Winkel (gyroPitch, gyroRoll) zu kombinieren:

4. Ausgabe:

   Die aktualisierten Nick- und Rollwinkel repräsentieren die reibungslose und stabile Ausrichtung des Geräts.

Hier ist der Pseudocode, den ich geschrieben habe, um Ihnen das Verständnis zu erleichtern:

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

Eingabe: Beschleunigungs- und Gyroskopdaten (AX, AY, AZ, GX, GY, GZ)

Ausgabe: Keine (aktualisiert die globalen Variablen Pitch und 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

5. Hauptlogikcode

Die Software verwendet Keil5. Diese Bibliotheksfunktionen können dem Video der Jiangsu University of Science and Technology entnommen werden, daher wird hier nur der Hauptlogikcode gezeigt.

#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");
	}
}

Um es einfach auszudrücken: Welche Funktion erfüllt dieser Code ungefähr? Nachdem ich das Panel flach gelegt hatte, stellte ich fest, dass die Neigung etwa -00006 und die Neigung etwa -00039 betrug. Nach vielen Tests ist dies der Fall, wenn der Neigungswinkel >30 beträgt Wenn der Nickwinkel <-30 ist, wird er als Vorwärtsneigung beurteilt, wenn der Rollwinkel > 0 ist, wird er als Linksneigung beurteilt, und wenn der Rollwinkel <-70 ist, wird er als Vorwärtsneigung beurteilt als Rechtsneigung. Wenn eine der oben genannten Anforderungen erfüllt wird, gibt der Summer einen Alarm aus und bittet die umstehenden Personen um Hilfe.

Der Schwellenwert kann hier geändert werden. Während des Tests wurde er auch mit OLED angezeigt. Wenn er einen bestimmten Bereich erreicht, wird seine Haltung gedruckt. Der normale ist normal, und die anderen werden in englischer Sprache in die Richtung ausgedrückt. Wenn Sie Ich möchte bereitstellen Sie können Chinesisch verwenden, da dies eine Kursaufgabe für mich ist und ich gerade mit stm32 in Kontakt gekommen bin. Ich habe eine Woche damit verbracht, es an der Jiangsu University of Science and Technology zu studieren (von denen ich viele nicht wirklich verwendet habe). ). Wenn ich Highscores erzielen möchte, ist es am besten, die drahtlose Kommunikation wiederherzustellen. Es wurde eine GPS-Funktion hinzugefügt.

6. Zusammenfassung

Dieses Design dient der Lösung des Problems der Sturzerkennung bei älteren Menschen. Es verwendet den Hauptcontroller STM32F103C8T6 mit einem Summermodul, einem dreiachsigen Beschleunigungssensor MPU6050, einem 0,96-Zoll-OLED-Anzeigemodul und einem ESP8266-01s-Modul sowie anderen Komponenten, um dies zu erreichen umfassende Sturzüberwachungs- und Kommunikationsfunktionen. In Bezug auf technische Indikatoren zeichnet sich der Hauptcontroller STM32F103C8T6 durch hohe Leistung, geringen Stromverbrauch sowie umfangreiche E/A- und Kommunikationsanschlüsse aus. Der MPU6050-Sensor verfügt über erweiterte Funktionen wie Empfindlichkeitsbeseitigung und Gyroskop-Integration, während der 0,96-Zoll-OLED-Bildschirm Echtzeit-Datenanzeige und System-Debugging-Unterstützung für das System bietet.

Bereiche, die noch verbessert werden müssen:

(1) Optimieren Sie die Parameter des komplementären Filteralgorithmus, um die Genauigkeit und Stabilität der Lagewinkelberechnung zu verbessern.

(2) Die drahtlose Kommunikationsfunktion des Systems weiter verbessern, insbesondere die Einführung der GPS-Funktion in Betracht ziehen, um sicherzustellen, dass in praktischen Anwendungen genaue Alarminformationen zuverlässig an Wächter gesendet werden können. Gleichzeitig gibt es beim Betrieb des ESP8266-01s-Moduls und des STM32F103C8T6 weiterhin Verbindungs- und Kommunikationsprobleme, die noch gelöst werden müssen.

Ich denke du magst

Origin blog.csdn.net/m0_62919535/article/details/135203484
Empfohlen
Rangfolge