Introducción
La ceguera es la perdida de la visión que no se puede corregir con gafas o lentes
de contacto. Puede suceder de manera repentina o con el paso del tiempo.
Existen dos tipos, ceguera parcial y ceguera completa.
En el mundo existen entre 40 y 45 millones de ciegos y 135 millones de débiles
visuales. Sin embargo, en el 80 % de los casos, la perdida de visión se puede
prevenir o curar, según la Organización Mundial de la Salud (OMS) y el Organismo
Internacional de Prevención de la Ceguera.
El bastón convencional para ciegos es una prolongación de su cuerpo. Es una
herramienta táctil, fabricada de aluminio normalmente, guía los pasos del
invidente, proporcionando información sobre la superficie donde camina y
ubicación, pero no información sobre algún obstáculo como medidores de luz,
plumas de estacionamiento o extinguidores.
De acuerdo a estudios por el INEGI, 1 de cada 1000 habitantes son ciegos; de los
cuales, el 97 % de ellos son de escasos recursos económicos. Esto imposibilita la
adquisición de un bastón inteligente. La construcción de un bastón blanco
inteligente concreta las ideas, teorías, esfuerzos, opiniones y anhelos presentados
por el autor.
El objetivo consistió en elaborar un bastón inteligente para personas invidentes en
México, con la capacidad de detectar obstáculos alrededor del cuerpo del usuario,
como pueden ser medidores de luz, extinguidores, alacenas, plumas de
estacionamiento, arboles, cajas de teléfonos, escalones, ramas de árboles,
automóviles estacionados y ventanas.
Justificación
En el mundo existen alrededor 45 millones de invidentes y 135 millones con
debilidad visual. Esta cifra la proporciona la Organización Mundial de la Salud
(OMS) y el Organismo Internacional de prevención de la Ceguera. El INEGI
reporta que 1 de cada 1000 habitantes son ciegos, de los cuales el 97 % de ellos
son de escasos recursos económicos. Los sistemas inteligentes para invidentes
en el mercado internacional son muy costosos.
En México los ciegos son incapaces de adquirir un bastión inteligente para realizar
sus actividades cotidianas. Incluso, obtener un bastón convencional es complicado
para un cuantioso número de ellos. Esto crea la necesidad de desarrollar e
implementar un prototipo inteligente para personas invidentes, con un costo
accesible, a causa de los precios elevados de los bastones inteligentes en el
mercado.
Objetivo
Diseñar y manufacturar con dispositivos de bajo costo, un bastión inteligente para
personas invidentes de escasos recursos económicos, con el cual se busca
recuperar libertad de los débiles visuales
Desarrollo del Proyecto
Para el desarrollo del proyecto se necesitaron los siguientes materiales:
1 Protoboard
1 Arduino UNO
1 Buzzer 5v
5 Sensores Ultrasónicos HC SR04
3 Capacitor cerámico de 0.1Uf
3 Diodos 1N4001
3 Transistores NPN 2N2222
3 Resistencias de 1k Ω
3 Micro motores moneda de 3.3V
1 Placa fenólica perforada
1 Caja de cartón pequeña
1 Paquete de Jumpers de 20 cm
El bastón consiste en tener 5 sensores ultrasónicos, 2 de ellos apuntan hacia
adelante para ampliar el rango del área de la distancia de los objetos ya que estos
sensores pueden detectar a una apertura ± 22°, uno más apunta hacia arriba y
otro hacia abajo para poder detectar obstáculos cerca de la cabeza y de los pies
respectivamente.
Al detectar un obstáculo por uno de los sensores el buzzer empezara a sonar cada
vez con más intensidad y más rápido si el objeto continua acercándose al usuario
hasta que los motores que están conectados al mango vibren indicando que un
obstáculo está más cerca o más lejos.
Para el desarrollo de este proyecto se implemento el uso de este código en un
Arduino UNO:
int vibrador = 5;
int vibrador2 = 4;
int vibrador3 = 3;
//Sensores de ultrasonido
const int pingPin = 12;
const int pingPine = 11;
const int pingPin2 = 10;
const int pingPin2e = 9;
const int pingPin3 = 8;
const int pingPin3e = 7;
//Zumbador
int zumbador = 6;
void setup()
// Iniciamos la comunicación por serial:
[Link](14400);
//Especificamos el zumbador como salida de datos
pinMode(zumbador, OUTPUT);
//Especificamos los vibradores como salida de datos
pinMode(pingPine,INPUT);
pinMode(pingPin2e,INPUT);
pinMode(pingPin3e,INPUT);
pinMode(vibrador,OUTPUT);
pinMode(vibrador2,OUTPUT);
pinMode(vibrador3,OUTPUT);
void loop()
/* Establecemos variables para la duración del ping
y mostramos el resultado de la distancia en centímetros*/
//Distancia espacio/tiempo
long duration, duration2, duration3, cm, cm2, cm3;
/*Dentro del Loop vamos a activar los vibradores
en las distancias correspondientes */
// ----------PING 1-------
// The PING))) envia un pulso alto (HIGH) con duracion de 2 microsegundos.
// Luego envia un pulso bajo (LOW) para hacer una limpieza del pulso alto (LOW)
pinMode(pingPin, OUTPUT);
digitalWrite(pingPin, LOW);
delayMicroseconds(2);
digitalWrite(pingPin, HIGH);
delayMicroseconds(5);
digitalWrite(pingPin, LOW);
//Especificamos los sensores como entrada de datos
pinMode(pingPin,INPUT);
duration = pulseIn(pingPin,HIGH);
cm = microsecondsToCentimeters(duration);
// ----------PING 2-------
// The PING))) envia un pulso alto (HIGH) con duracion de 2 microsegundos.
// Luego envia un pulso bajo (LOW) para hacer una limpieza del pulso alto (LOW)
pinMode(pingPin2, OUTPUT);
digitalWrite(pingPin2, LOW);
delayMicroseconds(2);
digitalWrite(pingPin2, HIGH);
delayMicroseconds(5);
digitalWrite(pingPin2, LOW);
//Especificamos los sensores como entrada de datos
pinMode(pingPin2,INPUT);
duration2 = pulseIn(pingPin2, HIGH);
cm2 = microsecondsToCentimeters2(duration2);
// ----------PING 3-------
// The PING))) envia un pulso alto (HIGH) con duracion de 2 microsegundos.
// Luego envia un pulso bajo (LOW) para hacer una limpieza del pulso alto (LOW)
pinMode(pingPin3, OUTPUT);
digitalWrite(pingPin3, LOW);
delayMicroseconds(2);
digitalWrite(pingPin3, HIGH);
delayMicroseconds(5);
digitalWrite(pingPin3, LOW);
//Especificamos los sensores como entrada de datos
pinMode(pingPin3,INPUT);
duration3 = pulseIn(pingPin3, HIGH);
cm3 = microsecondsToCentimeters3(duration3);
//----------------------------------------
// VIBRADOR 1 (DELANTERO)
//----------------------------------------
//Si Sensor 1 es menor a 50cm y mayor a 10cm activamos Vibrador 1.
//Si esta entre 10cm y 60cm
if((cm>=10)&&(cm<=60))
// Si esta entre 25cm y 60cm
if((cm>=25)&&(cm<=60))
else //Si esta entre 45cm y 60cm
if((cm>=45)&&(cm<=60))
for(int fadeValue = 0 ; fadeValue <= 64; fadeValue +=5)
analogWrite(vibrador, fadeValue);
analogWrite(zumbador, fadeValue);
digitalWrite(zumbador, HIGH); // enciende el zumbador (on)
delay(40); // espera 0,4seg.
digitalWrite(zumbador, LOW); // apaga el zumbador (off)
delay(40); // espera 0,4seg
}
else
//Si NO esta entre 10cm y 60cm, esta a menos de 10cm o a mas de 60cm, APAGAMOS
vibrador.
for(int fadeValue = 0 ; fadeValue <= 0; fadeValue +=5)
analogWrite(vibrador, fadeValue);
analogWrite(zumbador, fadeValue);
//----------------------------------------
// VIBRADOR 2 (DERECHO)
//----------------------------------------
//Si Sensor 1 es menor a 50cm y mayor a 10cm activamos Vibrador 1.
if((cm2>=10)&&(cm2<=60))
// Si esta entre 25cm y 60cm
if((cm2>=25)&&(cm2<=60))
//Si esta entre 45cm y 60cm
if((cm2>=45)&&(cm2<=60))
for(int fadeValue = 0 ; fadeValue <= 64; fadeValue +=5)
analogWrite(vibrador2, fadeValue);
analogWrite(zumbador, fadeValue);
digitalWrite(zumbador, HIGH); // enciende el zumbador (on)
delay(40); // espera 0,4seg.
digitalWrite(zumbador, LOW); // apaga el zumbador (off)
delay(40); // espera 0,4seg
else
else
{ //Si NO esta entre 45cm y 60cm, esta entre 25cm y 45cm
for(int fadeValue = 0 ; fadeValue <= 127; fadeValue +=5)
analogWrite(vibrador3, fadeValue);
analogWrite(zumbador, fadeValue);
digitalWrite(zumbador, HIGH); // enciende el zumbador (on)
delay(20); // espera 0,2seg.
digitalWrite(zumbador, LOW); // apaga el zumbador (off)
delay(20); // espera 0,2seg.
else
//Si NO esta entre 25cm y 60cm, esta entre 10cm y 25cm
for(int fadeValue = 0 ; fadeValue <= 255; fadeValue +=5)
analogWrite(vibrador3, fadeValue);
analogWrite(zumbador, fadeValue);
digitalWrite(zumbador, HIGH); // enciende el zumbador (on)
delay(10); // espera 0,1seg.
digitalWrite(zumbador, LOW); // apaga el zumbador (off)
delay(10); // espera 0,1seg.
}
else
//Si NO esta entre 25cm y 60cm, esta entre 10cm y 25cm
for(int fadeValue = 0 ; fadeValue <= 255; fadeValue +=5)
analogWrite(vibrador3, fadeValue);
analogWrite(zumbador, fadeValue);
digitalWrite(zumbador, HIGH); // enciende el zumbador (on)
delay(10); // espera 0,1seg.
digitalWrite(zumbador, LOW); // apaga el zumbador (off)
delay(10); // espera 0,1seg.
} }}
else{
//Si NO esta entre 10cm y 60cm, esta a menos de 10cm o a mas de 60cm, APAGAMOS
vibrador.
for(int fadeValue = 0 ; fadeValue <= 0; fadeValue +=5)
analogWrite(vibrador3, fadeValue);
} //Cerramos el LOOP
//Convertimos las medidas de microsegundos a centimetros
long microsecondsToCentimeters(long microseconds)
{}
long microsecondsToCentimeters2(long microseconds)
return microseconds / 29 / 2;}
long microsecondsToCentimeters3(long microseconds)
{ return microseconds / 29 / 2;