New

Dependencies:   SparkfunAnalogJoystick

Files at this revision

API Documentation at this revision

Comitter:
erodrz
Date:
Mon Aug 02 00:32:34 2021 +0000
Parent:
6:7c987ba78aa3
Commit message:
v4

Changed in this revision

MPU6050.lib Show annotated file Show diff for this revision Revisions of this file
main.cpp Show annotated file Show diff for this revision Revisions of this file
diff -r 7c987ba78aa3 -r ae7b2184b737 MPU6050.lib
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/MPU6050.lib	Mon Aug 02 00:32:34 2021 +0000
@@ -0,0 +1,1 @@
+https://os.mbed.com/users/erodrz/code/MPU6050/#659d1b0342bd
diff -r 7c987ba78aa3 -r ae7b2184b737 main.cpp
--- a/main.cpp	Thu Jul 29 19:19:16 2021 +0000
+++ b/main.cpp	Mon Aug 02 00:32:34 2021 +0000
@@ -2,6 +2,7 @@
 #include "mbed.h"
 #include "platform/mbed_thread.h"
 #include "SparkfunAnalogJoystick.h"
+#include "MPU6050.h"
 
 // Constantes de programación para procesos y funciones.
 // Valor en frecuencia de las notas reproducidas por el Buzzer que da avisos al usuario de la silla.
@@ -17,6 +18,7 @@
 Thread Thread5; // Hilo para manejar el joystick.
 Thread Thread6; // Hilo para manejar los comandos de voz recibidos por la Raspberry PI.
 Thread Thread7; // Hilo para manejar la selección de modo de la silla.
+Thread Thread8; // Hilo para manejar la detección de caídas y movimientos bruscos.
 
 // Variables globales de distancias en el entorno de la silla de ruedas.
 int Distance1 = 0; // Distancia adelante de la silla.
@@ -43,32 +45,79 @@
 // Salida para manejar la señal del buzzer de alertas.
 PwmOut Buzzer(PE_14);
 
-// Función para reproducir un sonido del buzzer cuando se detecta proximidad a un obstáculo.
-void Reproducir_Buzzer_Proximidad(void)
+// Objeto manejador del sensor acelerómetro y giroscopio.
+MPU6050 MPUsensor(PB_11,PB_10);
+
+// Función para reproducir un sonido del buzzer cuando se detecta un movimiento brusco.
+void Reproducir_Buzzer_Caidas()
 {
    Timer BuzzTime;
    BuzzTime.reset();
    BuzzTime.start();
-   while(BuzzTime.read_us() < 3000000) // Ejecutar sonido del buzzer por 3 segundos.
+   while(BuzzTime.read_us() < 1000000) // Ejecutar sonido del buzzer por 3 segundos.
    {
         Buzzer.period(1.0/Nota_C4); // Configurando el período, que es equivalente a frecuencia (veces que se reproducirá el tono por segundo).
         Buzzer.write(0.5);
         thread_sleep_for(200);
-        
+   }
+   Buzzer.write(0);
+   BuzzTime.stop();
+}
+
+// Función para detectar caídas y movimientos bruscos de la silla.
+void Thread1_MPU6050()
+{
+    while(1)
+    {
+        float Acelerometro[3]; // Acelerometro[0] = X, Acelerometro[1] = Y, Acelerometro[2] = Z
+        MPUsensor.getAccelero(Acelerometro); // Obtener lectura del sensor
+        if(Acelerometro[0] >= 4)
+        {
+            PC.printf("Sensor de aceleracion: Movimiento brusco a la derecha.\n\r");
+            Reproducir_Buzzer_Caidas();
+        }
+        if(Acelerometro[0] <= -4)
+        {
+            PC.printf("Sensor de aceleracion: Movimiento brusco a la izquierda.\n\r");
+            Reproducir_Buzzer_Caidas();
+        }
+        if(Acelerometro[1] >= 4)
+        {
+            PC.printf("Sensor de aceleracion: Movimiento brusco adelante.\n\r");
+            Reproducir_Buzzer_Caidas();
+        }
+        if(Acelerometro[1] <= -4)
+        {
+            PC.printf("Sensor de aceleracion: Movimiento brusco atras.\n\r");
+            Reproducir_Buzzer_Caidas();
+        }
+        if(Acelerometro[2] <= -4)
+        {
+            PC.printf("Sensor de aceleracion: Silla girada de cabeza.\n\r");
+            Reproducir_Buzzer_Caidas();
+        }
+        thread_sleep_for(200);
+    }
+}
+
+// Función para reproducir un sonido del buzzer cuando se detecta proximidad a un obstáculo.
+void Reproducir_Buzzer_Proximidad()
+{
+   Timer BuzzTime;
+   BuzzTime.reset();
+   BuzzTime.start();
+   while(BuzzTime.read_us() < 1000000) // Ejecutar sonido del buzzer por 3 segundos.
+   {
         Buzzer.period(1.0/Nota_A4); // Configurando el período, que es equivalente a frecuencia (veces que se reproducirá el tono por segundo).
         Buzzer.write(0.5);
         thread_sleep_for(200);
-        
-        Buzzer.period(1.0/Nota_E4); // Configurando el período, que es equivalente a frecuencia (veces que se reproducirá el tono por segundo).
-        Buzzer.write(0.5);
-        thread_sleep_for(200);
    }
    Buzzer.write(0);
    BuzzTime.stop();
 }
 
 // Función para limpiar caracteres presentes en el buffer de la interfaz serial.
-void LimpiarSerialBuffer(void)
+void LimpiarSerialBuffer()
 {
     char char1 = 0;
     while(PC.readable())
@@ -85,10 +134,10 @@
     Direccion2 = 0; // En dirección de las manecillas del reloj.
 
     PWM_Velocidad1.period(0.0001f); // Declaramos el período.
-    PWM_Velocidad1.write(0.15f); // %25 del duty cicle.
+    PWM_Velocidad1.write(0.25f); // %25 del duty cicle.
 
     PWM_Velocidad2.period(0.0001f); // Declaramos el período.
-    PWM_Velocidad2.write(0.15f); // %25 del duty cicle.
+    PWM_Velocidad2.write(0.25f); // %25 del duty cicle.
 
     thread_sleep_for(Tiempo);
 
@@ -103,10 +152,10 @@
     Direccion2 = 1; // En dirección contraria a las manecillas del reloj.
 
     PWM_Velocidad1.period(0.0001f); // Declaramos el período.
-    PWM_Velocidad1.write(0.15f); // %25 del duty cicle.
+    PWM_Velocidad1.write(0.25f); // %25 del duty cicle.
     
     PWM_Velocidad2.period(0.0001f); // Declaramos el período.
-    PWM_Velocidad2.write(0.15f); // %25 del duty cicle.
+    PWM_Velocidad2.write(0.25f); // %25 del duty cicle.
 
     thread_sleep_for(Tiempo); 
 
@@ -121,10 +170,10 @@
     Direccion2 = 0; // En dirección de las manecillas del reloj.
 
     PWM_Velocidad1.period(0.0001f); // Declaramos el período.
-    PWM_Velocidad1.write(0.15f); // %25 del duty cicle.
+    PWM_Velocidad1.write(0.25f); // %25 del duty cicle.
 
     PWM_Velocidad2.period(0.0001f); // Declaramos el período.
-    PWM_Velocidad2.write(0.15f); // %25 del duty cicle.
+    PWM_Velocidad2.write(0.25f); // %25 del duty cicle.
 
     thread_sleep_for(Tiempo); 
 
@@ -139,10 +188,10 @@
     Direccion2 = 1; // En dirección contraria a las manecillas del reloj.
 
     PWM_Velocidad1.period(0.0001f); // Declaramos el período.
-    PWM_Velocidad1.write(0.15f); // %25 del duty cicle.
+    PWM_Velocidad1.write(0.25f); // %25 del duty cicle.
 
     PWM_Velocidad2.period(0.0001f); // Declaramos el período.
-    PWM_Velocidad2.write(0.15f); // %25 del duty cicle.
+    PWM_Velocidad2.write(0.25f); // %25 del duty cicle.
 
     thread_sleep_for(Tiempo); 
 
@@ -522,4 +571,6 @@
     thread_sleep_for(200);
     Thread7.start(Thread7_IndicarModo);
     thread_sleep_for(200);
+    Thread8.start(Thread1_MPU6050);
+    thread_sleep_for(200);
 }