Robot Butia como Tecnología de Asistencia

De Proyecto Butiá
Saltar a: navegación, buscar

Motivación

Al momento de su invención, el código Morse cambió definitivamente la forma en que nos comunicamos. Históricamente se ha utilizado en la navegación náutica, desde la aviación hasta la radio, pero aun así es fácil de aprender y su naturaleza universal lo convierte en un excelente método de entrada de datos para ser utilizado como tecnología de asistencia.

El código Morse tiene una serie de ventajas sobre otras estrategias alternativas de acceso a la computadora. Por lo general, es más rápido y requiere un control motor menos fino. Quizás su ventaja más importante es su capacidad para convertirse en un proceso sub cognitivo. Después de usar el código por un período de tiempo, el usuario del código Morse ya no piensa en el código que está ingresando. Este es el mismo proceso que utilizan los mecanógrafos y tiene un impacto significativo en la velocidad, la precisión y la calidad del trabajo que se produce. Velocidades de entre 15 y 30 palabras por minuto son comunes y se pueden alcanzar velocidades de más de 60 palabras por minuto, convirtiéndolo en una alternativa de ingreso de datos muy eficiente.

Actualmente, esta tecnología es muy usada en el área de tecnología de asistencia, algunos celulares incluso soportan de forma nativa la entrada de datos a partir de código Morse, pero sin duda la opción más utilizada hoy en dia es el teclado de Google (Gboard). El mismo proporciona un método de entrada de datos a partir de código Morse y permite control total del dispositivo a partir del mismo. Google incluso tiene una coleccion de experimentos, conocidos como Hello Morse, donde incentiva a los usuarios a realizar dispositivos para potenciar el uso del codigo Morse como tecnología de asistencia.

Descripción del proyecto

Se recomienda ver la siguiente presentacion para obtener un breve pantallaso de lo que trata este proyecto.

La idea de este proyecto es aprovechar el uso de código Morse como una alternativa al teclado de la computadora, y junto a los sensores de contacto del robot Butiá desarrollar una aplicación que permita tener acceso a ciertas funcionalidades de la computadora (potencialmente lograr tener acceso total a la misma). El diferencial de este proyecto radica en la capacidad de poder disponer los botones de la forma que les sea mas conveniente, pudiendo incluso construir algún tipo de dispositivo con dichos botones, y adaptarlo a las necesidades de cada uno.

La idea general del proyecto consiste en 2 aplicaciones: una aplicación en Python y una aplicación web que nos proporciona una interfaz gráfica a la aplicación.

Aplicación Python

El backend está desarrollado en Python, para lo cual se tiene una aplicación corriendo en 2do plano traduciendo las pulsaciones de los botones en el robot butiá en eventos del teclado. Hay 2 modos de entrada de datos:

  • Modo Navegación: cuando este modo esté activado, las pulsaciones se traducen en eventos del teclado referentes a la navegación dentro de la página web (un botón que se traduce en un TAB para navegar al siguiente elemento de la página, otro que se traduce a SHIFT+TAB que se utiliza para navegar al elemento anterior dentro de la página y otro botón que se traduce en un enter). Potencialmente se podrían configurar más atajos que permitan mayor navegabilidad dentro del navegador. Si bien con los controles básicos mencionados se podría entrar a otros sitios web, se podrían agregar mas comandos que permitan realizar acciones como abrir/cerrar pestañas nuevas, lo cual proporciona mayor navegabilidad al momento de ingresar a otros sitios web.
  • Modo escritura: se cuenta con 2 botones que se mapean uno con él . y otro con - como se establece en el código morse. Luego se mapean las secuencias de . y - a eventos del teclado correspondientes a la letra que representa dicha secuencia en código Morse. A su vez se hace uso de un 3er botón encargado de disparar el evento de la barra espaciadora.


Interfaz Web

Esta aplicación proporciona una interfaz amigable para el usuario a través de una aplicación de escritorio desarrollada con ElectronJS (la cual de fondo está basada en una aplicación web). Actualmente, los navegadores cuentan con atajos del teclado para poder navegar dentro del mismo completamente a través del teclado. Por supuesto, dicha funcionalidad solo es útil si la página web que se está visitando es compatible con dichas funcionalidades de accesibilidad. Para esto, se siguen ciertos lineamiento ses establecidos globalmente que permiten, entre otras cosas, la navegación dentro de una página web completamente a través del teclado (que en nuestro caso es a través de los botones del butiá los cuales son traducidos a eventos del teclado). Las funcionalidades desarrolladas fueron las siguientes:

  • Mandar mails (se realiza en conjunto con un script en Python que es el encargado de mandar el mail con el contenido que se ingresó en la app web)
  • Procesamiento de voz a partir de la escritura (también se realiza junto con un script en python que utiliza la librería GTTS para generar un audio a partir del string que se ingrese en la app web por medio de los botones del Butiá en código morse, luego reproduce automáticamente dicho audio y finalmente lo elimina)
  • Una sección para realizar configuraciones generales, como ser la velocidad de escritura, setear el email y contraseña de nuestra casilla de correo para utilizar la funcionalidad de mandar mails
  • Una sección interactiva para aprender código Morse.
  • Sistema de respuesta auditiva tanto al momento de cambiar el modo de los botones (se reproduce un audio indicando el nuevo modo en el que nos encontramos) y también al momento de escribir en código morse. Para esto, en el momento que la aplicación traduce una secuencia de caracteres (conformada por puntos y guiones) en un evento del teclado no solo dispara el evento correspondiente sino que también reproduce el sonido de una pulsación para dar nocion al usuario de que dicha secuencia fue ingresada con éxito. En el caso que se ingrese una secuencia que no se corresponde con ningún caracter reconocido por el programa, no se generara ningún evento del teclado ni el sonido de ninguna pulsación.

Público Objetivo

Para llevar a cabo el proyecto se necesitará cierto manejo de la tecnología, no tanto para el armado del robot, ya que el mismo es bastante simple de montar, pero sí se requerirán ciertos conocimientos básicos, sobre todo nociones básicas del uso de la terminal, que se utilizará para instalar los elementos necesarios y levantar el programa. Se entregará un descargable que permitirá a los usuarios tener la aplicación funcionando de forma rápida y sencilla, permitiendo que personas sin mucho conocimientos de programación puedan lograr levantar el programa de forma fácil ya que el mismo contará con una arquitectura un poco compleja. Es por esto que si bien no se requerirán muchos conocimientos de programación ni de robótica en general, sí se necesitará tener nociones básicas del uso de la terminal para poner en funcionamiento el mismo.

Armado del Robot

En la actualidad se admiten varios tipos de entrada Morse:

  • Interruptor simple, donde un guión se diferencia de un punto al mantener el interruptor presionado durante un período de tiempo más largo
  • Interruptor doble donde un interruptor se usa para ingresar puntos mientras que el otro se usa para guiones
  • Interruptor triple, donde un interruptor se usa para ingresar un punto, uno para un guión y el tercero para indicar el final del carácter o comando realizado.

En este proyecto se utiliza este ultimo metodo, donde para la traducción de código morse se utilizan 3 interruptores, a su vez también se agregó un cuarto interruptor para facilitar las funcionalidades de navegación.

Materiales del kit

  • Placa USB4butia
  • 4 botones pulsadores
  • 4 cables Sensores RJ45
  • 1 cable USB
  • Cinta doble faz (opcional para el montado de los botones)

Para armar el robot lo único que se debe hacer es conectar los sensores botón a la placa Butia como podemos ver en el siguiente video. En este caso simplemente se pegan los botones a la placa con cinta doble faz, pero la idea es que cada uno lo adapte según sus necesidades. La versatilidad de los 4 botones permite que los mismos se dispongan de forma la forma más conveniente para cada uno.

Instalación

Requisitos previos

Antes de correr el programa se deberá instalar lo siguiente desde la línea de comandos. En este caso se hizo desde el sistema operativo macOS, pero esto no debería ser un problema ya que todos los paquetes utilizadas están también disponibles tanto en para linux como para Windows:


Instructions-11.png

Instalación del Proyecto

Una vez instalados los paquetes previamente mencionados proseguimos a la instalación del proyecto. Para ellos tendremos que primero clonar el siguiente repositorio, el cual lo haremos con el siguiente comando en la consola:


$giT clone https://github.com/noebassagoda/assistive-technology-morse-code.git

Una vez descargado el repositorio proseguimos a movernos dentro de la carpeta del mismo desde la consola, crear un entorno virtual de python, activarlo e instalar los paquetes a utilizar (los mismos están especificados en el archivo requirements.txt y los instalaremos todos juntos desde la línea de comandos como mostramos en la siguiente imagen). Los entornos virtuales se utilizan para poder aislar el entorno de desarrollo de un proyecto del resto de las librerías instaladas en el sistema y así poder asegurarse de que todas las personas que deseen instalar un proyecto compartan el mismo entorno de desarrollo. Cada entorno virtual tiene su propio binario de Python (que coincide con la versión del binario que se utilizó para crear este entorno, en este caso estaremos utilizando Python 2.7) y puede tener su propio conjunto independiente de paquetes de Python instalados en sus directorios de sitio. Para esto ejecutaremos los siguientes comandos en la consola:


$cd assistive-technology-morse-code
$pythoN -m virtualenv env
$sourcE env/bin/activate
$pip install -r requirements.txt

Por último nos falta instalar los módulos de node utilizados en la aplicación web. Para ello procedemos a ejecutar el siguiente comando desde la consola:


$npm install

Una vez instalado esto estamos prontos para poner en funcionamiento la aplicación. Para esto tendremos que ejecutar la app web. Una vez que corramos el siguiente comando, la aplicación se abrirá automáticamente desplegando ante nosotros la aplicación de escritorio:


$npm start

Por último, abrimos otra pestaña en la consola, nos paramos en la carpeta del proyecto y procedemos a ejecutar la app de python que correrá en segundo plano, lo cual haremos de la siguiente forma:


$cd engine
$pythoN main.py

Requisitos adicionales

Si está utilizando mac OS Mojave o más reciente, hay una nueva característica de seguridad donde se debe permitir explícitamente a las aplicaciones para poder hacer uso del mouse / teclado desde las mismas (en nuestro caso, queremos disparar eventos del teclado desde la línea de comandos). Para habilitar esto, debemos ir a Preferencias de seguridad > Seguridad y privacidad > Privacidad > Accesibilidad y elegir desde ahí a la aplicación de la línea de comandos. A Continuación se muestra como realizarlo:


Instructions1.png Instructions2.png

Funcionamiento

Como se menciona al comienzo de la guia, el robot cuenta con 4 botones, los cuales tendrán distintas funcionalidades dependiendo del modo en el cual nos encontremos. A Continuación se deja una imagen explicativa de la disposición de los botones junto con la funcionalidad que tendrá según el modo en el que se encuentre y el puerto correspondiente.

Circuito-descripcion.png]

Demos

Sección de Configuraciones

Lo primero que se recomienda hacer es configurar los permisos y credenciales del mail para asi poder hacer uso de dicha funcionalidad desde la aplicación. Lo primero va a ser habilitar a que aplicaciones de terceros puedan enviar emails en tu nombre (en nuestro caso, estaremos enviando emails desde un script de python). Este paso puede que no sea necesario dependiendo del servicio de correo electrónico que se use, por ejemplo en el caso de gmail se puede hacer de la siguiente forma:



Luego, una vez dentro de nuestra aplicación iremos a la sección de configuración donde se nos da la opción de ingresar las credenciales de nuestro mail y contraseña (opcionalmente podemos ingresarlos manualmente en el archivo config.txt). Una vez ingresado esto no tendrás que volver a hacerlo (al guardar la configuracion, las credenciales se guardan en el archivo antes mencionado y cada vez que se vaya a manda un email se utilizaran dichas credenciales). Cabe destacar que la aplicación corre localmente, por lo que no conlleva riesgos de seguridad a la hora de ingresar las credenciales mencionadas previamente. A Continuación se deja una demo de como configurar nuestro email y contraseña, y como pueden ver en el video, al cargar la página inicialmente ya estan cargadas las credenciales guardadas anteriormente. Nótese que en esta sección también se puede configurar la velocidad de escritura en código morse.


Enviar Emails

Una vez configurado todo podemos proceder a enviar mails desde la aplicación como vemos a continuación:



Procesamiento de Voz

A Continuación se muestra una pequeña demo de la funcionalidad del procesamiento de voz:



Sección Interactiva

Por ultimo tenemos una pequeña demo de la sección interactiva donde podemos encontrar un sencillo juego que tiene como finalidad ayudarnos a aprender a escribir en codigo morse a través de los botones pulsadores.


Trabajo a Futuro

Adaptación Para que sea Compatible con Otros Dispositivos

Este proyecto es muy versátil y puede adaptarse a las necesidades propias de cada uno. En particular, la aplicacion esta lo suficientemente modulada como para poder conectarlo no solo con el Robot Butiá sino que con cualquier placa o dispositivo con el cual se quiera sensar. Para ello no lo unico que se tiene que cambiar es lo siguiente en el archivo assistive-technology-morse-code/engine/util/buttons_helper.py;


...

BUTTON_PORT_LEFT  = 5
BUTTON_PORT_RIGHT = 3
BUTTON_PORT_AUX   = 4
BUTTON_PORT_STATE = 6

class ButtonsHelper:
  def __init__(self):
    self.__robot = USB4Butia()

  ...
  
  def state_button(self):
    return self.__sense_button(BUTTON_PORT_STATE)
    
  def __left_button(self):
    return self.__sense_button(BUTTON_PORT_LEFT)

  def __right_button(self):
    return self.__sense_button(BUTTON_PORT_RIGHT)
    return 0

  def __aux_button(self):
    return self.__sense_button(BUTTON_PORT_AUX)

  def __button_pressed(self, button):
    return self.__robot.getButton(button) > 0

  ...

Como pueden ver, en este archivo primero se especifican los puertos de donde se estarán sensando los botones, luego se inicializa el robot de esta forma self.__robot = USB4Butia() y por ultimo, en la función __button_pressed se esta evaluando si el botón especificado como button (que toma uno de los valores de los puertos a utilizar declarados previamente 3,4,5 o 6) esta o no apretado. Esto es facilmente adaptable a cualquier otro dispositivo de sensado que queramos utilizar, por ejemplo si en vez de los botones conectados al USB4Butia, se quisiera utilizar otra placa con otros botones, o incluso si se quisieran utilizar 4 botones del teclado, se podría adaptar el código en esa función para incorporar el mecanismo de sensado que les sea mas conveniente. Por ejemplo, un ejemplo sencillo podría ser el siguiente, eligiendo como botones las letras A S K y "L" del teclado, se adaptaría el codigo de la siguiente forma donde button ahora tomara uno de los valores A S K o L:


...
import keyboard

BUTTON_LEFT  = "S"
BUTTON_RIGHT = "K"
BUTTON_AUX   = "L"
BUTTON_STATE = "A"

class ButtonsHelper:
  def __init__(self):
    self.__robot = USB4Butia()

  def state_button(self):
    return self.__sense_button(BUTTON_STATE)

  def __left_button(self):
    return self.__sense_button(BUTTON_LEFT)

  def __right_button(self):
    return self.__sense_button(BUTTON_RIGHT)

  def __aux_button(self):
    return self.__sense_button(BUTTON_AUX)

  def __button_pressed(self, button):
    return keyboard.is_pressed(button)

  ...