Newest version of Wheelchair Logic

Dependencies:   MPU6050 SparkfunAnalogJoystick

Revision:
7:ae7b2184b737
Parent:
6:7c987ba78aa3
Child:
8:418ff0ef9463
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);
 }