Gafas Ultrasónicas

Autores: Andrea Claramunt Peña, Álvaro Pascual González, Jiajie Ni

Grupo 8 / 2022 – 2023

Introducción

Para este proyecto hemos realizado unas gafas con ultrasonidos y motores de vibración que, dependiendo de la distancia, desde el ultrasonido hasta un obstáculo se producirá un sonido y una vibración teniendo en cuenta diferentes umbrales

Evolución

Esta no fue nuestra primera opción. Nuestra primera opción era unas gafas de estilo espía que pudieran sacar fotos y tener distintas funcionalidades. Debido a errores y librerías incompatibles con Arduino uno no pudimos avanzar demasiado. Con lo cual después de echar horas y horas en el proyecto no veíamos resultados y tuvimos que tomar la decisión de cambiar el proyecto, pero manteniendo la base que teníamos, las gafas, con una nueva idea de funcionalidad.

El proyecto final fueron las gafas ultrasónicas, donde a lo largo de la memoria se contará en detalle su implementación. La idea del diseño del proyecto es la mostrada en la imagen.

Hardware

Entrando en detalle sobre la parte hardware. Para esta práctica se han usado los materiales que se nos dieron en la caja, los cuales se especifican a continuación:

COMPONENTESPINES
1 x Arduino UNO
1 x Protoboard
2 x Ultrasonidos– Trigger1: D10
– Echo1: D9
– Trigger2: D11
– Echo2: D12
1 x Buzzer– D2
1 x Adaptador de pila
1 x Pila de 9v
2 x Resistencias de 1k– Conectado a GND
– Conectado a cada botón cada una
2 x Botones– D3
– D4
2 x Motor de vibración– D6
– D5

La siguiente tabla contiene los materiales de decoración junto con los materiales comprados y sus respectivas precios:

MATERIALESPRECIOS
1 x Caja de madera 19x11x8,24,50 €
1 x Bobina de hilo negro1,95 €
1 x Cinta aislante negra 0,90 €
1 x Pegamento líquido2,50 €
1 x Esterilla de bambú2,50 €
1 x Gafas de sol 2,00 €
1 x Tubo elástico0,80 €
1 x Pila de 9v3,50 €
2 x Motor de vibración3,30 €
TOTAL24,95 €

En la imagen siguiente se observa el circuito resumido en Tinkercad. El circuito está dividido en 5 secciones: uno con la pila conectada al Arduino, otro con los ultrasonidos, otro con un buzzer, otro con dos motores de vibración y por último otro con dos botones. Al final cada componente debe tener un circuito cerrado. Al juntarse todas las secciones hace que nuestro proyecto funcione perfectamente.

Problemas

Entre los problemas que hemos tenido durante el desarrollo en primer lugar ha sido la cámara del proyecto inicial. Probamos distintas librerías y ninguna dio resultados positivos. Teníamos incompatibilidades de arquitectura con Arduino uno, actualizaciones de componentes y no sabíamos exactamente por qué no funcionaban, porque en la documentación que leíamos supuestamente era compatible. Y dada la falta de tiempo de entrega se cambió el proyecto.

En el proyecto final, tuvimos bastantes problemas con los motores de vibración, ya que por el tamaño que tienen, la conexión con los cables costó mucho, entonces cada vez que se movía el proyecto se desconectaban y esto provocó que los cables se rompieran de varios motores.

Un último problema que tuvimos fue con los sensores ultrasónicos y es que, si la onda que lanza sale de su rango máximo, el sensor puede dar valores falsos o inexactos. Y tardamos en averiguar esto, porque a veces sonaba sin motivo, el cual desconocíamos. La solución fue adaptar el entorno a los sensores, dada las limitaciones que tiene.

Software

//ZONA DECLARACION VARIBLES Y PINES
/*ZONA IZQUIERDA*/
int trigger1 = 10;            
int echo1 = 9;              
int distancia1;              
int duracion1;
int motor1 = 6;  

/*ZONA DERECHA*/
int trigger2 = 11;            
int echo2 = 12;              
int distancia2;              
int duracion2;
int motor2 = 5;

/*CASO DE USO 1: DISTANCIAS CORTAS*/
int pinBoton1 = 3;
int estadoBoton1 = 0;

/*CASO DE USO 2: DISTANCIAS LARGAS*/
int pinBoton2 = 4;
int estadoBoton2 = 0;

int lectura;
int modo1 = 0;
int modo2 = 0;


void setup() {
  //Configuro ultrasonido 1
  pinMode(trigger1, OUTPUT);
  pinMode(echo1, INPUT);
 
  //Configuro ultrasonido 2
  pinMode(trigger2, OUTPUT);
  pinMode(echo2, INPUT);

  //Configuro motores de vibración
  pinMode(motor1, OUTPUT);
  pinMode(motor2, OUTPUT);

}

void loop() {


//*********************************** MODO 1: DISTANCIAS CORTAS *****************************************
  if (modo2 == 0) {                                         //Compruebo que el modo 2 no este activado
    if (estadoBoton1 == LOW) {                              //********BOTÓN DESACTIVADO*****************
      lectura = digitalRead(pinBoton1);
      if (lectura != estadoBoton1) {
        modo1 = 1;
        estadoBoton1 = lectura;
        tone(2, 450);                                     //Suena el sonido de encendido
        delay(300);
        noTone(2);
        delay(200);
        tone(2, 600);
        delay(300);
        noTone(2);
        delay(200);
        tone(2, 760);
        delay(300);
        noTone(2);
       
        //Lanzo onda del ultrasonido 1
        digitalWrite(trigger1, HIGH);                     //Lanza pulso
        delay(1);                          
        digitalWrite(trigger1, LOW);        

       
        duracion1 = pulseIn(echo1, HIGH);               //Calculo tiempo que tarda la onda en volver      
        distancia1 = (duracion1 * 0.0343) / 2;   //Calculo distancia objeto --> s=(t * v)/2 (ida y vuelta)


        //Lanzo onda del ultrasonido 1
        digitalWrite(trigger2, HIGH);
        delay(1);
        digitalWrite(trigger2, LOW);

        delay(200);          

        duracion2 = pulseIn(echo2, HIGH);                //Calculo tiempo que tarda la onda en volver      
        distancia2 = (duracion2 * 0.0343) / 2;    //Calculo distancia objeto --> s=(t * v)/2 (ida y vuelta)

        delay(200);

        //UMBRAL CERCANO
        if (((distancia1 >= 0) && (distancia1 <= 28)) || ((distancia2 >= 0) && (distancia2 <= 28))) {               
          digitalWrite(motor1, HIGH);                     //Activo motor vibracion 1
          digitalWrite(motor2, HIGH);                     //Activo motor vibracion 2
          tone(2, 500);                                  //Aviso sonoro
          if(distancia1 <= distancia2) {                
            delay(distancia1*10);
          } else {
            delay(distancia2*10);
          }  
          digitalWrite(motor1, LOW);                      //Desactivo motor vibracion 1
          digitalWrite(motor2, LOW);                      //Desactivo motor vibracion 2
          noTone(2);                                      //Desactivo buzzer
        // UMBRAL INTERMEDIO
        } else if (((distancia1 > 28) && (distancia1 <= 56)) || ((distancia2 > 28) && (distancia2 <= 56))){       
          if(distancia1 <= distancia2) {    //En función del ultrasonido que detecte objetos más cercanos
            digitalWrite(motor1, HIGH);                   //Activo motor vibración izquierda
            tone(2, 2093);                                //Aviso sonoro
            delay(distancia1*10);
            digitalWrite(motor1, LOW);                    //Desactivo motor vibración izquierda
          } else {      
            digitalWrite(motor2, HIGH);                   //Activo motor vibración derecha
            tone(2, 2093);                                //Aviso sonoro
            delay(distancia2*10);
            digitalWrite(motor2, LOW);                    //Desactivo motor vibración derecha
          }  
          noTone(2);                                      //Desactivo sonido
        // UMBRAL LEJANO
        } else if (((distancia1 > 56) && (distancia1 <= 85)) || ((distancia2 > 56) && (distancia2 <= 85))){    
          if(distancia1 <= distancia2) {     //En función del ultrasonido que detecte objetos más cercanos
            digitalWrite(motor1, HIGH);                   //Activo motor vibración izquierda
            delay(distancia1*10);
            digitalWrite(motor1, LOW);                    //Desactivo motor vibración izquierda
          } else {  
            digitalWrite(motor2, HIGH);                   //Activo motor vibración derecha
            delay(distancia2*10);
            digitalWrite(motor2, LOW);                    //Desactivo motor vibración derecha
          }  
        }
      }
    } else {                                //**************BOTÓN ACTIVADO********************
      lectura = digitalRead(pinBoton1);    
      if (lectura == HIGH) {      //Si el botón se pulsa se desactivará el modo y sonará el tono de apagado
        estadoBoton1 = LOW;
        modo1 = 0;                                                        
        tone(2, 760);
        delay(300);
        noTone(2);
        delay(200);
        tone(2, 600);
        delay(300);
        noTone(2);
        delay(200);
        tone(2, 450);
        delay(300);
        noTone(2);
        delay(5000);
      } else {
        //Lanzo onda del ultrasonido 1
        digitalWrite(trigger1, HIGH);                         //Lanza pulso
        delay(1);                          
        digitalWrite(trigger1, LOW);        

       
        duracion1 = pulseIn(echo1, HIGH);                     //Calculo tiempo que tarda la onda en volver    
        distancia1 = (duracion1 * 0.0343) / 2;    //Calculo distancia objeto --> s=(t * v)/2 (ida y vuelta)


        //Lanzo onda del ultrasonido 2
        digitalWrite(trigger2, HIGH);                         //Lanza pulso
        delay(1);
        digitalWrite(trigger2, LOW);

        duracion2 = pulseIn(echo2, HIGH);                     //Calculo tiempo que tarda la onda en volver
        distancia2 = (duracion2 * 0.0343) / 2;    //Calculo distancia objeto --> s=(t * v)/2 (ida y vuelta)

        delay(200);

        // UMBRAL CERCANO
        if (((distancia1 >= 0) && (distancia1 <= 28)) || ((distancia2 >= 0) && (distancia2 <= 28))) {           
          digitalWrite(motor1, HIGH);                     //Activo motor vibracion 1
          digitalWrite(motor2, HIGH);                     //Activo motor vibracion 2
          tone(2, 500);                                  //Aviso sonoro
          if(distancia1 < distancia2) {
            delay(distancia1*10);
          } else {
            delay(distancia2*10);
          }  
          digitalWrite(motor1, LOW);                      //Desactivo motor vibracion 1
          digitalWrite(motor2, LOW);                      //Desactivo motor vibracion 2
          noTone(2);
        // UMBRAL INTERMEDIO
        } else if (((distancia1 > 28) && (distancia1 <= 56)) || ((distancia2 > 28) && (distancia2 <= 56))){    
          if(distancia1 < distancia2) {      //En función del ultrasonido que detecte objetos más cercanos
            digitalWrite(motor1, HIGH);                   //Activo motor vibración izquierda
            tone(2, 2093);                                //Aviso sonoro
            delay(distancia1*10);
            digitalWrite(motor1, LOW);                    //Desactivo motor vibración izquierda
          } else {
            digitalWrite(motor2, HIGH);                   //Activo motor vibración derecha
            tone(2, 2093);                                //Activo sonido
            delay(distancia2*10);
            digitalWrite(motor2, LOW);                    //Desactivo motor vibración derecha
          }    
          noTone(2);                                      //Desactivo sonido
        // UMBRAL LEJANO
        } else if (((distancia1 > 56) && (distancia1 <= 85)) || ((distancia2 > 56) && (distancia2 <= 85))){  
          if(distancia1 < distancia2) {      //En función del ultrasonido que detecte objetos más cercanos
            digitalWrite(motor1, HIGH);                   //Activo motor vibración izquierda
            delay(distancia1*10);            
            digitalWrite(motor1, LOW);                    //Desactivo motor vibración izquierda
          } else {
            digitalWrite(motor2, HIGH);                   //Activo motor vibración derecha
            delay(distancia2*10);
            digitalWrite(motor2, LOW);                   //Desactivo motor vibración derecha
          }  
        }
      }
    }
  }
 

//**************************** MODO 2: DISTANCIAS LARGAS *****************************************

  if (modo1 == 0) {                                          //Compruebo que el modo 1 no este funcionando
    if (estadoBoton2 == LOW){                        //**************BOTÓN DESACTIVADO********************
      lectura = digitalRead(pinBoton2);
      if (lectura != estadoBoton2) {                                //Activo modo
        modo2 = 1;
        estadoBoton2 = lectura;
        tone(2, 2100);                                              //Aviso sonoro de encendido
        delay(300);
        noTone(2);
        delay(200);
        tone(2, 2250);
        delay(300);
        noTone(2);
        delay(200);
        tone(2, 2400);
        delay(300);
        noTone(2);

        //Lanzo onda del ultrasonido 1
        digitalWrite(trigger1, HIGH);                          //Lanza pulso
        delay(1);                          
        digitalWrite(trigger1, LOW);      

       
        duracion1 = pulseIn(echo1, HIGH);                     //Calculo tiempo que tarda la onda en volver  
        distancia1 = (duracion1 * 0.0343) / 2;    //Calculo distancia objeto --> s=(t * v)/2 (ida y vuelta)

        //Lanzo onda del ultrasonido 2      
        digitalWrite(trigger2, HIGH);                         //Lanza pulso
        delay(1);
        digitalWrite(trigger2, LOW);

        duracion2 = pulseIn(echo2, HIGH);                     //Calculo tiempo que tarda la onda en volver
        distancia2 = (duracion2 * 0.0343) / 2;    //Calculo distancia objeto --> s=(t * v)/2 (ida y vuelta)

        delay(200);

        // UMBRAL CERCANO
        if (((distancia1 >= 0) && (distancia1 <= 67)) || ((distancia2 >= 0) && (distancia2 <= 67))) {           
          digitalWrite(motor1, HIGH);                     //Activo motor vibracion 1
          digitalWrite(motor2, HIGH);                     //Activo motor vibracion 2
          tone(2, 500);                                   //Aviso sonoro
          if(distancia1 < distancia2) {
            delay(distancia1*10);
          } else {
            delay(distancia2*10);
          }  
          digitalWrite(motor1, LOW);                      //Desactivo motor vibracion 1
          digitalWrite(motor2, LOW);                      //Desactivo motor vibracion 2
          noTone(2);
        // UMBRAL INTERMEDIO
        } else if (((distancia1 > 67) && (distancia1 <= 140)) || ((distancia2 > 67) && (distancia2<=140))){    
          if(distancia1 < distancia2) {      //En función del ultrasonido que detecte objetos más cercanos
            digitalWrite(motor1, HIGH);                   //Activo motor vibración izquierda
            tone(2, 2093);                                //Aviso sonoro encendido
            delay(distancia1*10);
            digitalWrite(motor1, LOW);                    //Desactivo motor vibración izquierda
          } else {
            digitalWrite(motor2, HIGH);                   //Activo motor vibración derecha
            tone(2, 2093);                                //Aviso sonoro encendido
            delay(distancia2*10);
            digitalWrite(motor2, LOW);                    //Desactivo motor vibración derecha
          }  
          noTone(2);                                      //Apago sonido
        // UMBRAL LEJANO
        } else if (((distancia1 > 140) && (distancia1 <= 200))||((distancia2 > 140) && (distancia2<=200))){    
          if(distancia1 < distancia2) {      //En función del ultrasonido que detecte objetos más cercanos
            digitalWrite(motor1, HIGH);                  //Activo motor vibración izquierda
            delay(distancia1*10);
            digitalWrite(motor1, LOW);                   //Desactivo motor vibración izquierda
          } else {
            digitalWrite(motor2, HIGH);                  //Activo motor vibración derecha
            delay(distancia2*10);
            digitalWrite(motor2, LOW);                   //Desactivo motor vibración derecha
          }  
        }  
      }
    } else {                                          //**************BOTÓN ACTIVADO********************
      lectura = digitalRead(pinBoton2);    
      if (lectura == HIGH) {                                       //Si el botón se pulsa se desactiva
        estadoBoton2 = LOW;
        tone(2, 2400);                                            //Sonido de apagado del modo
        delay(300);
        noTone(2);
        delay(200);
        tone(2, 2250);
        delay(300);
        noTone(2);
        delay(200);
        tone(2, 2100);
        delay(300);
        noTone(2);

        delay(5000);

        modo2 = 0;
      } else {
        //Lanzo onda del ultrasonido 1
        digitalWrite(trigger1, HIGH);                 //Lanza pulso
        delay(1);                          
        digitalWrite(trigger1, LOW);        

       
        duracion1 = pulseIn(echo1, HIGH);             //Calculo tiempo que tarda la onda en volver
        distancia1 = (duracion1 * 0.0343) / 2;   //Calculo distancia objeto --> s=(t * v)/2 (ida y vuelta)

        //Lanzo onda del ultrasonido 2
        digitalWrite(trigger2, HIGH);                 //Lanza pulso
        delay(1);
        digitalWrite(trigger2, LOW);

        duracion2 = pulseIn(echo2, HIGH);             //Calculo tiempo que tarda la onda en volver
        distancia2 = (duracion2 * 0.0343) / 2;    //Calculo distancia objeto --> s=(t * v)/2 (ida y vuelta)


        delay(200);

        // UMBRAL CERCANO
        if (((distancia1 >= 0) && (distancia1 <= 67)) || ((distancia2 >= 0) && (distancia2 <= 67))) {           
          digitalWrite(motor1, HIGH);                     //Activo motor vibracion 1
          digitalWrite(motor2, HIGH);                     //Activo motor vibracion 2
          tone(2, 500);                                   //Aviso sonoro
          if(distancia1 < distancia2) {
            delay(distancia1*10);
          } else {
            delay(distancia2*10);
          }  
          digitalWrite(motor1, LOW);                      //Desactivo motor vibracion 1
          digitalWrite(motor2, LOW);                      //Desactivo motor vibracion 2
          noTone(2);                                      //Desactivo sonido
        // UMBRAL INTERMEDIO
        } else if (((distancia1 > 67) && (distancia1 <= 140)) || ((distancia2 > 67) && (distancia2<=140))){    
          if(distancia1 < distancia2) {       //En función del ultrasonido que detecte objetos más cercanos
            digitalWrite(motor1, HIGH);                   //Activo motor vibración izquierda
            tone(2, 2093);                                //Aviso sonoro
            delay(distancia1*10);
            digitalWrite(motor1, LOW);                    //Desactivo motor vibración izquierda
          } else {
            digitalWrite(motor2, HIGH);                   //Activo motor vibración derecha
            tone(2, 2093);                                //Aviso sonoro
            delay(distancia2*10);
            digitalWrite(motor2, LOW);                    //Desactivo motor vibración derecha
          }  
          noTone(2);                                      //Desactivo sonido
        // UMBRAL LEJANO
        } else if (((distancia1 > 140) && (distancia1 <= 200))||((distancia2 > 140) && (distancia2<=200))){    
          if(distancia1 < distancia2) {      //En función del ultrasonido que detecte objetos más cercanos
            digitalWrite(motor1, HIGH);                 //Activo motor vibración izquierda
            delay(distancia1*10);
            digitalWrite(motor1, LOW);                  //Desactivo motor vibración izquierda
          } else {
            digitalWrite(motor2, HIGH);                 //Activo motor vibración derecha
            delay(distancia2*10);
            digitalWrite(motor2, LOW);                  //Desactivo motor vibración derecha
          }  
        }      
      }
    }
  }    
}

Mejoras

En cuanto a la mejoras que hemos pensado que puede tener nuestro proyecto son:

  1. Sustituir la pila por otra cargable de manera que el usuario no tenga que ir a comprar una pila cada cierto tiempo y le sea más cómodo.
  2. Mejorar el diseño, nos gustaría de alguna forma hacer que la caja fuese más pequeña de manera que el usuario lleve menos peso, además nos gustaría reducir el número de cables de manera que se pueda ocultar de otro modo.
  3. Mejorar la comodidad debido a que dependiendo del tamaño de la cabeza de la persona puede que el tubo donde están los cables quede más ajustado.
  4. Evolución del proyecto. Nos gustaría sustituir los dos ultrasonidos frontales y colocar solo uno en el medio y dos de forma lateral, de esta manera todo el campo frontal y lateral estarían cubiertos.
  5. Los sensores ultrasónicos que tengan mayor capacidad de alcance, y no el límite actual que son 3-4 metros de rango de la onda, de esta forma se adaptaría mejor al entorno.

Funcionamiento

Entrando en detalle sobre el funcionamiento, las gafas tienen dos modos de uso: para distancias cortas y distancias lejanas. Cada caso de uso tendrá tres umbrales. Para su funcionamiento será mediante los botones, amarillo y rojo respectivamente, que simularán un interruptor.

El primer caso de uso que veremos comenzará cuando pulsemos el botón amarillo. Este detecta una distancia máxima de 85cm aproximadamente. En el momento que entre en el rango un objeto comenzará a vibrar por el lado de las gafas que detecte más cerca, es decir, el sensor de ultrasonidos que detecte un objeto más cercano activará el motor correspondiente. El segundo umbral será entre los 60-30cm, que producirá un sonido y vibrará de forma intermitente en función del lado que detecte más cerca. Y el último umbral será menor a 30cm, donde por ambos lados vibrará y producirá otro sonido más alarmante, igual, de forma intermitente.

En el segundo caso de uso que veremos será cuando pulsemos el botón rojo. Este caso detectará distancias largas de máximo 2m. Los umbrales en este caso cambiarán, siendo el intermedio entre 1,40m-70cm y el umbral cercano menor de 70cm. La funcionalidad dentro de cada uno de los umbrales será igual que en el primer caso de uso. Se observará que según nos vayamos acercando a la pared las gafas empezarán a hacer su función, vibración y/o sonido en función del umbral.

Hay que mencionar que cada botón tiene un sonido distintivo y diferente al otro de encendido y apagado, con lo cual, esto servirá para que no haga falta ver que botón se está pulsando, únicamente con el sonido se podrá diferenciar.

CASO DE USO 1

CASO DE USO 2

Anexo

A continuación, se incluye un anexo de imágenes del proyecto:

También te podría gustar...

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *