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:
COMPONENTES | PINES |
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:
MATERIALES | PRECIOS |
1 x Caja de madera 19x11x8,2 | 4,50 € |
1 x Bobina de hilo negro | 1,95 € |
1 x Cinta aislante negra | 0,90 € |
1 x Pegamento líquido | 2,50 € |
1 x Esterilla de bambú | 2,50 € |
1 x Gafas de sol | 2,00 € |
1 x Tubo elástico | 0,80 € |
1 x Pila de 9v | 3,50 € |
2 x Motor de vibración | 3,30 € |
TOTAL | 24,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:
- 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.
- 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.
- 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.
- 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.
- 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: