Newest version of Wheelchair Logic

Dependencies:   MPU6050 SparkfunAnalogJoystick

Files at this revision

API Documentation at this revision

Comitter:
erodrz
Date:
Fri Nov 05 00:26:15 2021 +0000
Parent:
9:4a1c40f8b2d7
Commit message:
WheelchairLogicv5

Changed in this revision

23-WheelchairLogicv5-test-version.lib Show diff for this revision Revisions of this file
main.cpp Show annotated file Show diff for this revision Revisions of this file
--- a/23-WheelchairLogicv5-test-version.lib	Thu Nov 04 20:02:56 2021 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,1 +0,0 @@
-https://os.mbed.com/users/thevic16/code/20-WheelchairLogicv4/#418ff0ef9463
--- a/main.cpp	Thu Nov 04 20:02:56 2021 +0000
+++ b/main.cpp	Fri Nov 05 00:26:15 2021 +0000
@@ -16,9 +16,11 @@
 Thread Thread3; // Tercer hilo para sensor de proximidad.
 Thread Thread4; // Cuarto hilo para sensor de proximidad.
 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.
+Thread Thread6; // Hilo para manejar la recepcion de caracteres.
+Thread Thread7; // Hilo para manejar la condicion de parada de los comandos de voz.
+Thread Thread8; // Hilo para manejar los comandos de voz recibidos por la Raspberry PI.
+Thread Thread9; // Hilo para manejar la selección de modo de la silla.
+Thread Thread10; // 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.
@@ -33,12 +35,17 @@
 DigitalIn modo3(D10); // Modo por comandos de voz.
 DigitalIn modo4(D11); // Modo por rutas autónomas
 
-//Variables modos globales
-int Modo1 =0;
-int Modo2 =0;
-int Modo3 =0;
-int Modo4 =0;
+// Variables modos globales.
+int Modo1 = 0;
+int Modo2 = 0;
+int Modo3 = 0;
+int Modo4 = 0;
 
+// Variables de orientación de movimiento de la silla. (Para saber a dónde se mueve la silla en cada momento.)
+int Orientacion_Adelante = 0;
+int Orientacion_Atras = 0;
+int Orientacion_Izquierda = 0;
+int Orientacion_Derecha = 0;
 
 // Interfaz serial para comunicación con la Raspberry PI.
 Serial PC(USBTX,USBRX); // Por aquí se reciben caracteres que el miprocesador interpreta para ejecutar una acción, como los comandos de voz o alguna alerta.
@@ -55,6 +62,9 @@
 // Objeto manejador del sensor acelerómetro y giroscopio.
 MPU6050 MPUsensor(PB_11,PB_10);
 
+//Variable global para los comandos de voz recibidos desde la raspberry PI.
+char c;
+
 // Función para reproducir un sonido del buzzer cuando se detecta un movimiento brusco.
 void Reproducir_Buzzer_Caidas()
 {
@@ -76,8 +86,8 @@
 {
     while(1)
     {
-        float Acelerometro[3]; // Acelerometro[0] = X, Acelerometro[1] = Y, Acelerometro[2] = Z
-        MPUsensor.getAccelero(Acelerometro); // Obtener lectura del sensor
+        float Acelerometro[3]; // Acelerometro[0] = X, Acelerometro[1] = Y, Acelerometro[2] = Z.
+        MPUsensor.getAccelero(Acelerometro); // Obtener lectura del sensor.
         if(Acelerometro[0] >= 3)
         {
             //printf("Sensor de aceleracion: Movimiento brusco a la derecha.\n\r");
@@ -85,8 +95,8 @@
             //printf("Acelerometro en y: %f \n\r",Acelerometro[1]);
             //printf("Acelerometro en z: %f \n\r",Acelerometro[2]);
 
-            PC.printf("Fall Event \n");
-            Reproducir_Buzzer_Caidas();
+            PC.printf("Fall Event \n"); // Evento de caída detectado.
+            Reproducir_Buzzer_Caidas(); // Reproducir sonido de aviso.
         }
         if(Acelerometro[0] <= -3)
         {
@@ -95,8 +105,8 @@
             //printf("Acelerometro en y: %f \n\r",Acelerometro[1]);
             //printf("Acelerometro en z: %f \n\r",Acelerometro[2]);
             
-            PC.printf("Fall Event \n");
-            Reproducir_Buzzer_Caidas();
+            PC.printf("Fall Event \n"); // Evento de caída detectado.
+            Reproducir_Buzzer_Caidas(); // Reproducir sonido de aviso.
            
         }
         if(Acelerometro[1] >= 1)
@@ -106,8 +116,8 @@
             //printf("Acelerometro en y: %f \n\r",Acelerometro[1]);
             //printf("Acelerometro en z: %f \n\r",Acelerometro[2]);
         
-            PC.printf("Fall Event \n");
-            Reproducir_Buzzer_Caidas();
+            PC.printf("Fall Event \n"); // Evento de caída detectado.
+            Reproducir_Buzzer_Caidas(); // Reproducir sonido de aviso.
             
         }
         if(Acelerometro[1] <= -6)
@@ -117,8 +127,8 @@
             //printf("Acelerometro en y: %f \n\r",Acelerometro[1]);
             //printf("Acelerometro en z: %f \n\r",Acelerometro[2]);
             
-            PC.printf("Fall Event \n");
-            Reproducir_Buzzer_Caidas();
+            PC.printf("Fall Event \n"); // Evento de caída detectado.
+            Reproducir_Buzzer_Caidas(); // Reproducir sonido de aviso.
         }
         if(Acelerometro[2] <= -8)
         {
@@ -127,11 +137,11 @@
             //printf("Acelerometro en y: %f \n\r",Acelerometro[1]);
             //printf("Acelerometro en z: %f \n\r",Acelerometro[2]);
             
-            PC.printf("Fall Event \n");
-            Reproducir_Buzzer_Caidas();
+            PC.printf("Fall Event \n"); // Evento de caída detectado.
+            Reproducir_Buzzer_Caidas(); // Reproducir sonido de aviso.
             
         }
-        thread_sleep_for(200);
+        thread_sleep_for(200); // Delay.
     }
 }
 
@@ -141,97 +151,122 @@
    Timer BuzzTime;
    BuzzTime.reset();
    BuzzTime.start();
-   while(BuzzTime.read_us() < 1000000) // Ejecutar sonido del buzzer por 3 segundos.
+   while(BuzzTime.read_us() < 1000000) // Ejecutar sonido del buzzer por 1 segundo.
    {
         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.write(0.5); // Duty cycle.
+        thread_sleep_for(200); // Delay.
    }
+   // Deteniendo el buzzer.
    Buzzer.write(0);
    BuzzTime.stop();
 }
 
-// Función para limpiar caracteres presentes en el buffer de la interfaz serial.
-void LimpiarSerialBuffer()
-{
-    char char1 = 0;
-    while(PC.readable())
-    {
-        char1 = PC.getc();
-    }
-    return;
-}
-
-// Función para moder la silla hacia adelante.
+// Función para mover la silla hacia adelante.
 void Mover_Hacia_Adelante(int Tiempo)
 {
     Direccion1 = 0; // En dirección de las manecillas del reloj.
     Direccion2 = 0; // En dirección de las manecillas del reloj.
 
     PWM_Velocidad1.period(0.0003f); // Declaramos el período.
-    PWM_Velocidad1.write(0.6f); // %15 del duty cicle.
+    PWM_Velocidad1.write(0.6f); // Duty cycle.
 
     PWM_Velocidad2.period(0.0003f); // Declaramos el período.
-    PWM_Velocidad2.write(0.6f); // %15 del duty cicle.
+    PWM_Velocidad2.write(0.6f); // Duty cycle.
 
     thread_sleep_for(Tiempo);
 
     PWM_Velocidad1.write(0.0f);
     PWM_Velocidad2.write(0.0f);
+
+    Orientacion_Adelante = 0;
+    Orientacion_Atras = 0;
+    Orientacion_Izquierda = 0;
+    Orientacion_Derecha = 0;
 }
 
-// Función para moder la silla hacia atrás.
+// Función para mover la silla hacia atrás.
 void Mover_Hacia_Atras(int Tiempo)
 {
     Direccion1 = 1; // En dirección contraria a las manecillas del reloj.
     Direccion2 = 1; // En dirección contraria a las manecillas del reloj.
 
     PWM_Velocidad1.period(0.0003f); // Declaramos el período.
-    PWM_Velocidad1.write(0.6f); // %15 del duty cicle.
+    PWM_Velocidad1.write(0.6f); // Duty cycle.
     
     PWM_Velocidad2.period(0.0003f); // Declaramos el período.
-    PWM_Velocidad2.write(0.6f); // %15 del duty cicle.
+    PWM_Velocidad2.write(0.6f); // Duty cycle.
 
     thread_sleep_for(Tiempo); 
 
     PWM_Velocidad1.write(0.0f);
     PWM_Velocidad2.write(0.0f);
+
+    Orientacion_Adelante = 0;
+    Orientacion_Atras = 0;
+    Orientacion_Izquierda = 0;
+    Orientacion_Derecha = 0;
 }
 
-// Función para moder la silla hacia la izquierda.
+// Función para mover la silla hacia la izquierda.
 void Mover_Hacia_Izquierda(int Tiempo)
 {
     Direccion1 = 0; // En dirección contraria a las manecillas del reloj.
     Direccion2 = 1; // En dirección de las manecillas del reloj.
 
     PWM_Velocidad1.period(0.0003f); // Declaramos el período.
-    PWM_Velocidad1.write(0.6f); // %25 del duty cicle.
+    PWM_Velocidad1.write(0.6f); // Duty cycle.
 
     PWM_Velocidad2.period(0.0003f); // Declaramos el período.
-    PWM_Velocidad2.write(0.6f); // %15 del duty cicle.
+    PWM_Velocidad2.write(0.6f); // Duty cycle.
 
     thread_sleep_for(Tiempo); 
 
     PWM_Velocidad1.write(0.0f);
     PWM_Velocidad2.write(0.0f);
+
+    Orientacion_Adelante = 0;
+    Orientacion_Atras = 0;
+    Orientacion_Izquierda = 0;
+    Orientacion_Derecha = 0;
 }
 
-// Función para moder la silla hacia la derecha.
+// Función para mover la silla hacia la derecha.
 void Mover_Hacia_Derecha(int Tiempo)
 {
     Direccion1 = 1; // En dirección de las manecillas del reloj.
     Direccion2 = 0; // En dirección contraria a las manecillas del reloj.
 
     PWM_Velocidad1.period(0.0003f); // Declaramos el período.
-    PWM_Velocidad1.write(0.6f); // %15 del duty cicle.
+    PWM_Velocidad1.write(0.6f); // Duty cycle.
 
     PWM_Velocidad2.period(0.0003f); // Declaramos el período.
-    PWM_Velocidad2.write(0.6f); // %25 del duty cicle.
+    PWM_Velocidad2.write(0.6f); // Duty cycle.
 
-    thread_sleep_for(Tiempo); 
+    thread_sleep_for(Tiempo);
 
     PWM_Velocidad1.write(0.0f);
     PWM_Velocidad2.write(0.0f);
+
+    Orientacion_Adelante = 0;
+    Orientacion_Atras = 0;
+    Orientacion_Izquierda = 0;
+    Orientacion_Derecha = 0;
+}
+
+// Función para detener la silla.
+void Detener(int Tiempo)
+{
+    PWM_Velocidad1.write(0.0f); // Duty cicle.
+    PWM_Velocidad2.write(0.0f); // Duty cicle.
+
+    printf("    Deteniendo silla. \n\r");
+    thread_sleep_for(Tiempo);
+
+    Orientacion_Adelante = 0;
+    Orientacion_Atras = 0;
+    Orientacion_Izquierda = 0;
+    Orientacion_Derecha = 0;
 }
 
 // Función para leer el sensor de proximidad 1. ADELANTE
@@ -249,7 +284,7 @@
     };
     Sonar.stop();
     Correccion = Sonar.read_us();
-    printf("Sensor de proximidad 1: El retardo aproximado del temporizador de sobrecarga del software es %d uS\n\r",Correccion);
+    printf("    Sensor de proximidad 1: El retardo aproximado del temporizador de sobrecarga del software es %d uS\n\r",Correccion);
     while(1)
     {
         Trigger = 1;
@@ -267,12 +302,16 @@
         };
         Sonar.stop();
         Distance1 = (Sonar.read_us()-Correccion)/58.0;
-        //printf("Sensor de proximidad 1 (Adelante): %d cm \n\r",Distance1);
+        if(Distance1 < DistanceLimit && Orientacion_Adelante == 1)
+        {
+            Detener(1000);
+            printf("    Sensor de proximidad 1 (Adelante): %d cm \n\r",Distance1);
+        }
         thread_sleep_for(1000);
     }
 }
 
-// Función para leer el sensor de proximidad 2. //ATRAS
+// Función para leer el sensor de proximidad 2. // ATRÁS
 void Thread2_HCSR04()
 {
     DigitalOut Trigger(D2);
@@ -287,7 +326,7 @@
     };
     Sonar.stop();
     Correccion = Sonar.read_us();
-    printf("Sensor de proximidad 2: El retardo aproximado del temporizador de sobrecarga del software es %d uS\n\r",Correccion);
+    printf("    Sensor de proximidad 2: El retardo aproximado del temporizador de sobrecarga del software es %d uS\n\r",Correccion);
     while(1)
     {
         Trigger = 1;
@@ -305,12 +344,17 @@
         };
         Sonar.stop();
         Distance2 = (Sonar.read_us()-Correccion)/58.0;
-        //printf("Sensor de proximidad 2 (Atras): %d cm \n\r",Distance2);
+
+        if(Distance2 < DistanceLimit && Orientacion_Atras == 1)
+        {
+            Detener(1000);
+            printf("    Sensor de proximidad 2 (Atras): %d cm \n\r",Distance2);
+        }
         thread_sleep_for(1000);
     }
 }
 
-// Función para leer el sensor de proximidad 3. //IZQUIERDA
+// Función para leer el sensor de proximidad 3. // IZQUIERDA
 void Thread3_HCSR04()
 {
     DigitalOut Trigger(D4);
@@ -325,7 +369,7 @@
     };
     Sonar.stop();
     Correccion = Sonar.read_us();
-    printf("Sensor de proximidad 3: El retardo aproximado del temporizador de sobrecarga del software es %d uS\n\r",Correccion);
+    printf("    Sensor de proximidad 3: El retardo aproximado del temporizador de sobrecarga del software es %d uS\n\r",Correccion);
     while(1)
     {
         Trigger = 1;
@@ -343,12 +387,16 @@
         };
         Sonar.stop();
         Distance3 = (Sonar.read_us()-Correccion)/58.0;
-        //printf("Sensor de proximidad 3 (Izquierda): %d cm \n\r",Distance3);
+        if(Distance3 < DistanceLimit && Orientacion_Izquierda == 1)
+        {
+            Detener(1000);
+            printf("    Sensor de proximidad 3 (Izquierda): %d cm \n\r",Distance3);
+        }
         thread_sleep_for(1000);
     }
 }
 
-// Función para leer el sensor de proximidad 4. //DERECHA
+// Función para leer el sensor de proximidad 4. // DERECHA
 void Thread4_HCSR04()
 {
     DigitalOut Trigger(D6);
@@ -363,7 +411,7 @@
     };
     Sonar.stop();
     Correccion = Sonar.read_us();
-    printf("Sensor de proximidad 4: El retardo aproximado del temporizador de sobrecarga del software es %d uS\n\r",Correccion);
+    printf("    Sensor de proximidad 4: El retardo aproximado del temporizador de sobrecarga del software es %d uS\n\r",Correccion);
     while(1)
     {
         Trigger = 1;
@@ -381,7 +429,11 @@
         };
         Sonar.stop();
         Distance4 = (Sonar.read_us()-Correccion)/58.0;
-        //printf("Sensor de proximidad 4 (Derecha): %d cm \n\r",Distance4);
+        if(Distance4 < DistanceLimit && Orientacion_Derecha == 1)
+        {
+            Detener(1000);
+            printf("    Sensor de proximidad 4 (Derecha): %d cm \n\r",Distance4);
+        }
         thread_sleep_for(1000);
     }
 }
@@ -407,164 +459,213 @@
             {
                 if(Distance2 > DistanceLimit)
                 {
-                    printf("Comandos del joystick: Hacia atras. \r \n");
-                    printf("Distancia medida por sensor atras:%d cm \r \n",Distance2);
-                    Mover_Hacia_Atras(3000);
+                    Orientacion_Atras = 1;
+                    printf("    Comandos del joystick: Hacia atras. \r \n");
+                    printf("    Distancia medida por sensor atras: %d cm \r \n",Distance2);
+                    Mover_Hacia_Atras(2000);
                 }
                 else
                 {
-                    printf("Comandos del joystick: Obstaculo hacia atras. \r \n");
-                    printf("Distancia medida por sensor atras:%d cm \r \n",Distance2);
+                    printf("    Comandos del joystick: Obstaculo hacia atras. \r \n");
+                    printf("    Distancia medida por sensor atras: %d cm \r \n",Distance2);
+                    Detener(1000);
                     //Reproducir_Buzzer_Proximidad();
                 }
-                //thread_sleep_for(500);
             }
             if(X >= -0.70f && X <= 0.70f && Y <= -0.90f && Y >= -1.00f)
             {   
                 if(Distance1 > DistanceLimit)
                 {
-                    printf("Comandos del joystick: Hacia adelante. \r \n");
-                    printf("Distancia medida por sensor adelante:%d cm \r \n",Distance1);
-                    Mover_Hacia_Adelante(3000);
+                    Orientacion_Adelante = 1;
+                    printf("    Comandos del joystick: Hacia adelante. \r \n");
+                    printf("    Distancia medida por sensor adelante: %d cm \r \n",Distance1);
+                    Mover_Hacia_Adelante(2000);
                 }
                 else
                 {
-                    printf("Comandos del joystick: Obstaculo hacia adelante. \r \n");
-                    printf("Distancia medida por sensor adelante:%d cm \r \n",Distance1);
+                    printf("    Comandos del joystick: Obstaculo hacia adelante. \r \n");
+                    printf("    Distancia medida por sensor adelante: %d cm \r \n",Distance1);
+                    Detener(1000);
                     //Reproducir_Buzzer_Proximidad();
                 }
-                //thread_sleep_for(500);
             }
             if(Y >= -0.70f && Y <= 0.70f && X <= -0.90f && X >= -1.00f)
             
             {
                 if(Distance4 > DistanceLimit)
                 {
-                    printf("Comandos del joystick: Hacia la derecha. \r \n");
-                    printf("Distancia medida por sensor derecha:%d cm \r \n",Distance4);
-                    Mover_Hacia_Derecha(3000);
+                    Orientacion_Derecha = 1;
+                    printf("    Comandos del joystick: Hacia la derecha. \r \n");
+                    printf("    Distancia medida por sensor derecha: %d cm \r \n",Distance4);
+                    Mover_Hacia_Derecha(2000);
                 }
                 else
                 {
-                    printf("Comandos del joystick: Obstaculo hacia la derecha. \r \n");
-                    printf("Distancia medida por sensor derecha:%d cm \r \n",Distance4);
+                    printf("    Comandos del joystick: Obstaculo hacia la derecha. \r \n");
+                    printf("    Distancia medida por sensor derecha: %d cm \r \n",Distance4);
+                    Detener(1000);
                     //Reproducir_Buzzer_Proximidad();
                 }
-                //thread_sleep_for(500);
             }
             if(Y >= -0.70f && Y  <= 0.70f && X >= 0.90f && X <= 1.00f)
             {
      
                 if(Distance3 > DistanceLimit)
                 {
-                    printf("Comandos del joystick: Hacia la izquierda. \r \n");
-                    printf("Distancia medida por sensor izquierda:%d cm \r \n",Distance3);
-                    Mover_Hacia_Izquierda(3000);
+                    Orientacion_Izquierda = 1;
+                    printf("    Comandos del joystick: Hacia la izquierda. \r \n");
+                    printf("    Distancia medida por sensor izquierda: %d cm \r \n",Distance3);
+                    Mover_Hacia_Izquierda(2000);
                 }
                 else
                 {
-                    printf("Comandos del joystick: Obstaculo hacia la izquierda. \r \n");
-                    printf("Distancia medida por sensor izquierda:%d cm \r \n",Distance3);
+                    printf("    Comandos del joystick: Obstaculo hacia la izquierda. \r \n");
+                    printf("    Distancia medida por sensor izquierda: %d cm \r \n",Distance3);
+                    Detener(1000);
                     //Reproducir_Buzzer_Proximidad();
                 }
-                //thread_sleep_for(500);
             }
             thread_sleep_for(5);
         }
     }
 }
 
+
+void Thread6_RecepcionCaracteresComandovoz()
+{
+
+    while(1)
+    {   
+        while(PC.readable()) { // Para saber si hay algo que recibir en el puerto serial. 
+            c = PC.getc();
+            printf("    Datos recibidos: %c \r\n",c);
+        }
+            
+    }
+}
+
+void Thread7_ParadaComandoVoz()
+{
+
+    while(1)
+    {
+        if(c == 'x')
+        {
+            if(!Modo1 && !Modo2 && Modo3 && !Modo4)
+            {
+                printf("    Comandos de voz: Detenerse. \r \n");
+                Detener(1000);
+                c = ' ';
+            }
+        }
+    }
+}
+
+
 // Función para leer datos del serial con caracteres de comandos de voz y ejecutar instrucciones.
-void Thread6_ComandosVoz()
+void Thread8_ComandosVoz()
 {
+    int Tiempo_Lineal = 60000;
+    int Tiempo_Lateral = 3000;
+    
     while(1)
     {
         if(!Modo1 && !Modo2 && Modo3 && !Modo4)
         {
-            //LimpiarSerialBuffer(); //Si activamos esto el .readable no funciona. 
-            char c;
-            
-            while(PC.readable()) { // Para saber si hay algo que recibir en el puerto serial. 
-                c = PC.getc();
-                printf("Datos recibidos: %c \r\n",c);
-            }
             
             if(c == 'w')
             {
-                printf("Distance1 - %d \r \n",Distance1);
+                printf("    Distance1 - %d cm \r \n",Distance1);
                 if(Distance1 > DistanceLimit)
                  {
-                    printf("  Comandos de voz: Hacia adelante. \r \n");
-                    Mover_Hacia_Adelante(3000);
+                    Orientacion_Adelante = 1;
+                    printf("    Comandos de voz: Hacia adelante. \r \n");
+                    
+                    Mover_Hacia_Adelante(Tiempo_Lineal);
+                    thread_sleep_for(200);
                  }
                 else
                 {
-                    printf("Comandos de voz: Obstaculo! No se puede ir hacia adelante. \r \n");
-                    Reproducir_Buzzer_Proximidad();
+                    printf("    Comandos de voz: Obstaculo! No se puede ir hacia adelante. \r \n");
+                    Detener(1000);
+                    //Reproducir_Buzzer_Proximidad();
                 }
-                //thread_sleep_for(1000);
+                c = ' ';
             }
             if(c == 's')
             {
-                printf("Distance2 - %d \r \n",Distance2);
+                printf("    Distance2 - %d cm \r \n",Distance2);
                 if(Distance2 > DistanceLimit)
                 {
-                    printf("  Comandos de voz: Hacia atras. \r \n");
-                    Mover_Hacia_Atras(3000);
+                    Orientacion_Atras = 1;
+                    printf("    Comandos de voz: Hacia atras. \r \n");
+                    
+                    Mover_Hacia_Atras(Tiempo_Lineal);
+                    thread_sleep_for(200);
                 }
                 else
                 {
-                    printf("Comandos de voz: Obstaculo! No se puede ir hacia atras. \r \n");
-                    Reproducir_Buzzer_Proximidad();
+                    printf("    Comandos de voz: Obstaculo! No se puede ir hacia atras. \r \n");
+                    Detener(1000);
+                    //Reproducir_Buzzer_Proximidad();
                 }
-                    
+                c = ' '; 
             }
             if(c == 'a')
             {
-                printf("Distance3 - %d \r \n",Distance3);
+                printf("    Distance3 - %d cm \r \n",Distance3);
                 if(Distance3 > DistanceLimit)
                 {
-                    printf("  Comandos de voz: Hacia la izquierda. \r \n");
-                    Mover_Hacia_Izquierda(3000);
+                    Orientacion_Izquierda = 1;
+                    printf("    Comandos de voz: Hacia la izquierda. \r \n");
+                    
+                    Mover_Hacia_Izquierda(Tiempo_Lateral);
+                    thread_sleep_for(200);
                 }
                 else
                 {
-                    printf("Comandos de voz: Obstaculo! No se puede ir hacia la izquierda. \r \n");
+                    printf("    Comandos de voz: Obstaculo! No se puede ir hacia la izquierda. \r \n");
+                    Detener(1000);
                     //Reproducir_Buzzer_Proximidad();
                 }
-                
+                c = ' ';
             }
             if(c == 'd')
             {
-                printf("Distance4 - %d \r \n",Distance4);
+                printf("    Distance4 - %d cm \r \n",Distance4);
                 if(Distance4 > DistanceLimit)
                 {
-                    printf("  Comandos de voz: Hacia la derecha. \r \n");
-                    Mover_Hacia_Derecha(3000);
+                    Orientacion_Derecha = 1;
+                    printf("    Comandos de voz: Hacia la derecha. \r \n");
+                    
+                    Mover_Hacia_Derecha(Tiempo_Lateral);
+                    thread_sleep_for(200);
                 }
                 else
                 {
-                    printf("Comandos de voz: Obstaculo! No se puede ir hacia la derecha. \r \n");
+                    printf("    Comandos de voz: Obstaculo! No se puede ir hacia la derecha. \r \n");
+                    Detener(1000);
                     //Reproducir_Buzzer_Proximidad();
                 }
-                    //thread_sleep_for(1000);
+                c = ' ';
             }
             
-            c = ' ';
-            thread_sleep_for(50);
         }
     }
 }
 
+
+
+
+
 // Función para seleccionar el modo de operación de la silla.
-void Thread7_IndicarModo()
+void Thread9_IndicarModo()
 {
     bool EstadoModo1 = false;
     bool EstadoModo2 = false;
     bool EstadoModo3 = false;
     bool EstadoModo4 = false;
-    
-    
+
     while(true)
     {
         
@@ -592,11 +693,10 @@
         } else {
             Modo4 = 0;
         }
-        
-        
+
         if(Modo1 && !Modo2 && !Modo3 && !Modo4 && !EstadoModo1)
         {
-            printf("Operando: Modo manual. \r \n");
+            printf("    Operando: Modo manual. \r \n");
             EstadoModo1 = true;
             EstadoModo2 = false;
             EstadoModo3 = false;
@@ -604,7 +704,7 @@
         }
         if(!Modo1 && Modo2 && !Modo3 && !Modo4 && !EstadoModo2)
         {
-            printf("Operando: Modo de comandos de joystick. \r \n");
+            printf("    Operando: Modo de comandos de joystick. \r \n");
             EstadoModo1 = false;
             EstadoModo2 = true;
             EstadoModo3 = false;
@@ -612,7 +712,7 @@
         }
         if(!Modo1 && !Modo2 && Modo3 && !Modo4 && !EstadoModo3)
         {
-            printf("Operando: Modo de comandos de voz. \r \n");
+            printf("    Operando: Modo de comandos de voz. \r \n");
             EstadoModo1 = false;
             EstadoModo2 = false;
             EstadoModo3 = true;
@@ -620,15 +720,12 @@
         }
         if(!Modo1 && !Modo2 && !Modo3 && Modo4 && !EstadoModo4)
         {
-            printf("Operando: Modo de rutas autonomas. \r \n");
+            printf("    Operando: Modo de rutas autonomas. \r \n");
             EstadoModo1 = false;
             EstadoModo2 = false;
             EstadoModo3 = false;
             EstadoModo4 = true;
         }
-        
-        
-        //thread_sleep_for(1000);
     }
 }
 
@@ -643,12 +740,23 @@
     thread_sleep_for(200);
     Thread4.start(Thread4_HCSR04);
     thread_sleep_for(200);
-    Thread7.start(Thread7_IndicarModo);
+    
+    Thread6.start(Thread6_RecepcionCaracteresComandovoz);
+    thread_sleep_for(200);
+    
+    Thread7.start(Thread7_ParadaComandoVoz);
+    thread_sleep_for(200);
+    
+    
+    Thread9.start(Thread9_IndicarModo);
     thread_sleep_for(200);
     Thread5.start(Thread5_Joystick);
     thread_sleep_for(200);
-    Thread6.start(Thread6_ComandosVoz);
+    Thread8.start(Thread8_ComandosVoz);
     thread_sleep_for(200);
+    
+    
+    
     //Thread8.start(Thread8_MPU6050);
     //thread_sleep_for(200);
 }