Prototipo de un bastón para guiar a personas ciegas.
Hace unas semanas terminé lo que sería la primera versión de un prototipo de un bastón para guiar a personas con discapacidades visuales que. Este artilugio fue construído para superar la parte práctica de la asignatura de Descripción de Sistemas Hardware, correspondiente al Máster en Ingeniería Informática que estoy estudiando. Además, podría decirse que sería una extensión de www.sinbarrera.es, la aplicación web orientada a la accesiblidad que hice también hace tiempo.
1. OBJETIVO.
El objetivo era realizar un primer prototipo de un bastón para personas discapacitadas el cual lleva incorporado sensores para facilitar la detección de obstáculos. La distancia hasta los obstáculos será enviada hacia un dispositivo móvil como un smartphone y será este el que avise de alguna forma al usuario.
2. IMPLEMENTACIÓN.
2.1. Elementos y dispositivos.
Bastón: Un bastón de senderismo desplegable. A él irán acoplados varios dispositivos.
Arduino Uno: Arduino es una plataforma de electrónica abierta para la creación de prototipos basada en software y hardware flexibles y fáciles de usar.
Sensor de distancia HC-SR04: El HC-SR04 es un sensor de distancia que funciona por ultrasonido. Básicamente lo que hace es enviar un pulso llamado trigger, inaudible para cualquier ser humano, rebotar en algún objeto y recibirlo (eco). Con este principio es posible medir distancias sabiendo que la velocidad del sonido es de 345m/s.
Este sensor es utilizado para detectar objetos y enviar la distancia a la que se
encuentra de dichos objetos al Arduino.
Bluetooth RS232 TTL: Este pequeño módulo transmisor/receptor Bluetooth TTL permite comunicar bidireccionalmente sus dispositivos sin necesidad de cable serie. Los datos TTL se transmiten a un dispositivo Bluetooth host, además es compatible con la mayoría de adaptadores USB Bluetooth para Pc y una velocidad de comunicación por defecto: 9600,8,1,n
Samsung Galaxy Trend: Un smartphone con sistema operativo Android. En este dispositivo se instalará una aplicación nativa programada con Android para recoger los datos enviados por el bastón.
2.2. Conexiones de los dispositivos.
A continuación se presentan imágenes que ilustran el montaje de los distintos elementos y sensores sobre Arduino.
En primer lugar, las conexiones del Arduino Uno junto al sensor de distancia HC-SR04. Las conexiones son sencillas ya que únicamente implican las conexiones de alimentación a 5v, tierra y 2 pines más que son los que nos permitirán obtener los valores para hacer los cálculos para obtener la medición. Estos pines son TRIGGER, indica cuando se ha enviado la señal, y ECHO, cuando se ha detectado el retorno del sonido.
La conexión del Arduino Uno con el Bluetooth tampoco es muy complicada. De igual manera que con el sensor de distancia, tenemos conexiones para la alimentación a 5v y tierra. Luego tenemos los pines propios para la transmisión de datos hacia/desde el Arduino. Hay que tener en cuenta que el pin RX del módulo va conectado al pin TX de la placa y el pin TX del módulo va al RX de la placa, es decir, las conexiones van cruzadas.
Finalmente, la alimentación de la placa Arduino y por tanto del resto de sensores se hace mediante una pila de 9V en este caso.
Una vez montados todos los dispositivos solo quedaba añadirlos al bastón de manera provisional. Para esto me ayudé de bastante cinta aislante. Como se puede apreciar en la siguiente imagen ayudado de una base de madera y cinta aislante conseguí amarrarlo al bastón.
3. CÓDIGO IMPLEMENTADO.
3.1. Arduino.
El código implementado en el Arduino responde a dos necesidades principales. La primera es recoger y procesar los datos obtenidos por los sensores. La segunda, enviar dichos datos cuando corresponda al smartphone.
El pseudocódigo que seguí en la posterior implementación fue el siguiente:
Iniciar variables y constantes
Abrir conexión con el puerto serialMientras no-fin Hacer
Obtener distancia desde el sensor HR-SC04Si hayDatosBluetooh Entonces
Leer datos desde conexión Bluetooth
Si datos = tiempoDormir Entonces
Guardar tiempoDormir
Fin siSi datos = distanciaMinima Entonces
Guardar distanciaMinima
Fin sireconfigurar = 1
Fin siSi reconfigurar Entonces
Reconfigurar distancia mínima
Reconfigurar intervalo tiempo recogida distancia
Fin siSi distanciaDetectada < distanciaMinimaAviso Entonces
Enviar vía bluetooth la distancia
Fin siDormir Arduino
Fin-Mientras
Este código, además, está capacitado para recibir datos vía bluetooth para una mínima configuración desde la aplicación Android implementada para este prototipo. Dicha configuración está compuesta de la velocidad al caminar del usuario en metros por segundo y la distancia mínima a la que se desea se lance un aviso al usuario también.Indicar la velocidad en metros por segundo se necesita para poder estimar y configurar cada cuanto va a ser necesario que Arduino tome datos desde los sensores de distancia, es decir, en un funcionamiento normal, para optimizar el uso de la batería, ni el sensor de distancia ni el módulo de bluetooth tendrían que tener un funcionamiento continuo ya que esto degradaría la vida de la batería de una forma muy rápida.Conociendo la velocidad de desplazamiento y utilizando la conocida fórmula t=e*v siendo t el tiempo, y la distancia y v la velocidad, se puede sacar fácilmente cada cuando tiempo se deben tomar datos desde los sensores. El tiempo entre medias de cada medición, Arduino y los sensores deberían quedar dormidos utilizando el mínimo de energía posible.Por defecto, el tiempo mínimo de tomar datos de los sensores 200 milisegundos, que desde luego, es demasiado poco, pero me ha venido bien para las pruebas. Por defecto, la distancia mínima para la detección es de 100 cms. Esta distancia mínima también es necesaria tenerla ya que solamente se enviará dicha distancia detectada datos por bluetooth cuando la distancia detectada por el sensor a un objeto sea menor que esta distancia mínima configurada. De esta manera, también hacemos un uso menos intensivo de la conexión.Un detalle importante es la utilización de una librería de código libre que existe en internet y la cual funciona muy bien: https://github.com/elrodri/Ultrasonic-HC-SR043.2. AndroidSe ha implementado una aplicación nativa en Java llamada StickEyes. Dicha aplicación
básicamente lo que hace es establecer una conexión vía bluetooth con el módulo de conexión del Arduino.Abre dos sockets, uno de entrada para recibir la distancia detectada por el sensor hr-sc04 y otro de salida para enviar configuración de funcionamiento al Arduino. Cuando recibe datos de Arduino, además de mostrar la distancia a la que se encuentra el objeto que sea, produce una vibración de 300 milisegundos.La aplicación tiene una sola pantalla de funcionamiento y necesita de dos permisos del usuario: uso del bluetooth y vibración.
En dicha pantalla se pueden configurar la velocidad del usuario en metros por segundo y la
distancia mínima a la se desea que se avise de un obstáculo. Existe un botón Reconectar que está pendiente de configurar correctamente, la función de dicho botón era reiniciar la conexión vía bluetooth en caso de perderla.El pseudocódigo de esta aplicación Java es el siguiente:Iniciar variables
Inicializar vista y elementos de vista
Definir funcionamiento botón Guardar Configuración
Definir funcionamiento botón SalirCrear un handler para manejo de entradas vía bluetooth
recibir datos
mostrar por pantalla distancia recibida
vibrar 300 msCrear instancia adaptador bluetooth
Conectar bluetoothMientras no-salir y no-error Hacer
Si recibo distancia Entonces
Mostrar distancia
Vibrar
Fin si
Si configuro arduino Entonces
Enviar configuración
Fin si
Fin Mientras4. FUNCIONAMIENTO.El funcionamiento de todo el prototipo es sencillo y lo podríamos resumir en los siguientes pasos.
- Instalar la aplicación en un teléfono Android que disponga de bluetooth.
- Encender Arduino para que el mismo alimente a los sensores.
- Arrancar la aplicación. La conexión entre el módulo de bluetooth instalado en el bastón y el del teléfono puede tardar un poco.
- Utilizar el bastón. Ahora, cuando se detectara un objeto a menor distancia de la configurada, el teléfono realizará una pequeña vibración mientras nos encontremos por debajo de esa distancia mínima.
- Configurar la aplicación. Es posible poder configurar la velocidad de desplazamiento del usuario y la distancia mínima a la que queremos que nos avise la aplicación.
5. CÓDIGO DE LAS APLICACIONES.Lo más importante de las dos aplicaciones implementadas, Arduino y Android, es que funcionaban. Antes de ponerme con esta práctica no sabía programar nada ni en Arduino y ni en Java para Android, así que el código que podéis ver en los siguientes enlaces a mi repositorio de Github no son gran cosa y desde luego son francamente mejorables.https://github.com/mpijierro/StickEyes6. PROBLEMAS Y DIFICULTADES.En este apartado realizaré un recorrido por los problemas con los que me he ido encontrando y
como se han ido solucionando algunos.Circuito con ArduinoATMEGA328 que me fue facilitado no funcionabaEl circuito que se me fue facilitado no fui capaz de hacerlo funcionar. Tras muchas horas invertidas en investigar cual podía ser la causa, al final decliné hacer uso del Arduino, módulos y sensores con los que venía montado. La verdad que fue poco desesperante todo esto porque la solución todavía se me sigue escapando y no llegué a nada claro.El problema radicaba en que no era capaz de 'subir' programas al Arduino ATMega328. Programas que eran correctos y que subía a mi Arduino Uno no era capaz de subirlos al Mega328. Pregunté en varios foros dedicados a la plataforma Arduino y tampoco supieron darme una explicación clara. Probé sobre Linux, Windows, instalé y reinstalé controladores, cambié configuraciones de puertos serie...y un sinfín de cosas más que ya ni recuerdo para intentar hacerlo funcionar..y nada. Después de bastante tiempo probando, opté por utilizar un Arduino Uno que compré y que no le estaba dando ningún uso. Compré los sensores de distancia y bluetooth.Problema de carga de programas en Arduino UnoUna vez recibido, monté el circuito de manera provisional para hacer pruebas y al menos ya me funcionaba el sensor de distancia, pero había veces que seguía sin cargarme el programa. Algo muy raro estaba pasando ya que volvía a tener el mismo problema que con el ATMega 328. Un día, de casualidad, probando, me di cuenta que cuando no tenía conectado el bluetooth si cargaba los programas...y si lo tenía conectado me daba el error de carga. El motivo no lo conozco, pero tengo la impresión de que era lo que me pasaba con el ATMega328. Al venir este con el módulo de bluetooth soldado no lo podía desconectar y el error de carga del programa me daba siempre error. En mi Arduino, como podía desconectar el bluetooth, entonces si he podido hacer la carga de los programas.Resumiendo, tuve que comprar el sensor de distancia y el módulo bluetooth para montarlo en un Arduino Uno y luego, hacer un truqui cada vez que subo la aplicación al Arduino desconectando el bluetooth, una vez cargado, vuelvo a conectarloDesconocimiento de la plataforma Arduino, programación en Java y AndroidQuizás, desconocer Arduino es lo menos traumático ya que es relativamente sencillo, tanto el uso de los sensores como la plataforma en si. Además, hay mucha documentación en internet para resolver muchos problemas y también existe mucho código del cual se puede 'tirar' en caso de apuro.Lo peor para mi ha sido, y es, no tener experiencia prácticamente con el lenguaje Java y mucho menos con la plataforma Android. Aún así, con el lenguaje Java me he defendido como buenamente he podido ya que el código implementado no es muy complicado y más o menos también buscando en internet se pueden ir sacando cosas. Lo peor de todo ha sido para mi no conocer la plataforma Android para programarla de forma nativa. Aquí si perdí mucho tiempo hasta hacerme con un conocimiento mínimo como para poder realizar la práctica.Aquí la peor parte me ha venido de la conexión bluetooth. Realizar las conexiones vía bluetooth entre dispositivos, crear los sockets...etc, es una tarea bastante complicada para un neófito como yo, ya que como digo no conozco bien los conceptos de Android en esta materia. Menos mal que buscando en la ayuda de Android se puede ir sacando código que poco a poco va funcionando. Aún así, aún queda muy lejos lo que es la programación de la conexión por bluetooth de la aplicación de una forma decente. Seguiré formándome en este área.Uso eficiente del ArduinoAl trabajar Arduino con batería, es un requisito necesario e indispensable que tanto él como los sensores utilicen un mínimo de energía en el funcionamiento. Sobre la placa Arduino Uno no he encontrado gran cosa sobre como hacer que consuma menos energía. Si acaso, utilizando dispositivos físicos que reduzcan o regulen el uso de energía en sí de todo el sistema y mediante una técnica denominada watch dog que permiten 'levantar' un sistema si se cuelga o bloquea. Ambas técnicas se me escapaban al alcance de esta práctica y además, tampoco me convencían.Sin embargo, con el Arduino ATMega328 creo que si es posible controlar mejor el uso de energía ya que es posible programar utilizando interrupciones que 'despiertan' al Arduino después de un tiempo de inactividad. En mi caso, realmente no he podido solucionar esto pero he realizado una 'simulación' de como sería el ahorro de energía. Gracias a la información configurable en la aplicación Android de la velocidad del usuario y la distancia mínima de detección de un objeto, se envía a Arduino el tiempo en segundos que debería quedarse 'dormido' hasta un nuevo uso de los sensores. En el código, está indicado por delay(timeToSleep).7. PRÓXIMAS MEJORAS MÁS IMPORTANTES.Errores que aun siendo prototipo deberían quedar resueltos pronto para tener, honestamente, una calidad digna.Mejorar conexión por bluetoothPor algún extraño motivo, algunas veces se pierde la conexión entre el bluetooth del smartphone y el del Arduino. Como ya comenté anteriormente, debido a mis pocas nociones sobre el manejo de conexiones bluetooth con Android no he conseguido implementar una solución robusta que se sobreponga a este tipo de errores. Además, otras veces parece como si se tupiese la conexión.Mejora en la toma de datos del sensor de distanciaNo sé muy bien por qué, pero parece que el sensor de distancia, cuando no está funcionando el bluetooth, las distancias las mide muy bien, sin apenas errores, muy coherentes y reales. Cuando funciona el bluetooth, los datos de la distancias tomadas varían mucho sin apenas mover el sensor. Retorna secuencias de distancias del tipo: 88,85,43,145,89,93,88,85,180...no creo que se deban a interferencias ya que ambos trabajan en distintas bandas ultrasonidos van a 40Hz y el bluetooth a 2.4Ghz.Configurar parámetrosPoder configurar más parámetros como la duración de la vibración, poder seleccionar avisos sonoros, etc.Ahorro de energíaMover toda la solución dada a un Arduino ATMega328 y aprovechar el uso de interrupciones para la eficiencia energética de todo el dispositivo y los sensores.Instalación más eleganteSalta a la vista que la colocación del dispositivo en el bastón no es muy elegante ni siquiera correcta o estable. Hay que mejorar el siguiente prototipo.Diseño final del primero prototipo del bastón.
Actualización
En su momento, este prototipo saltó a los medios y tuvo cierta repercursión. En aquellos días hablé para periódicos, programas de radio y televisión.
Incluso, tuve una pequeña presentación en un programa de Canal Extremadura Televisión en el que hablaban sobre patentes.
Para ver el programa haz click aquí.