CoDeck: teclado de macros
Evolución
El proyecto partía de la idea de construir un teclado de atajos, es decir un pequeño teclado para el que el usuario puede asignar un atajo de teclado a cada una de las teclas. Por ejemplo, que al pulsar la tecla 1 se ejecutase un Ctrl+C, al pulsar la tecla 2 un Alt+F4, etc.
Inicialmente pensamos en utilizar únicamente el entorno de Arduino para llevar a cabo el trabajo. Por ello el primer paso fue encontrar un modo de mapear el input de los botones a pulsaciones del teclado del ordenador, de este modo descubrimos la librería keyboard.h que emula un teclado mediante Arduino.
Además del uso de esta librería necesitábamos un programa externo que funcionase a modo de keylogger y que estuviese siempre atento a las pulsaciones mapeadas por keyboard.h para ejecutar el atajo determinado, esta solución ya nos añadía una dependencia constante a un programa externo, algo que no nos convencía del todo.
El principal problema vino al comprobar que la librería keyboard.h no era compatible con el procesador incluido en el kit provisto por la universidad, ante este obstáculo decidimos comprar un procesador Arduino Mini que sí era compatible con la librería.
Una vez llegó el procesador Arduino Mini nos pusimos manos a la obra, debido a su reducido tamaño teníamos que soldar los pines de los componentes que fueran a ser conectados a él. Encontramos muchas dificultades a la hora de unirlo todo y no conseguimos hacer una soldadura funcional, por lo que también tuvimos que descartar esta opción.
Llegados a este punto no sabíamos cómo continuar el proyecto, hasta que se nos ocurrió la idea de escribir las pulsaciones de las teclas en el puerto serial y que un programa externo escrito en Python leyese del puerto.
Conseguimos hacer una conexión funcional y ahora que teníamos Python a nuestra disposición se nos abrió un mundo de posibilidades. Reformulamos el proyecto y dado que Python tiene librerías para la ejecución de programas, comandos, navegadores, atajos, etc, decidimos que el proyecto pasaría a ser un teclado en el que cada tecla pudiese ejecutar un script de Python.
A partir de ahí hicimos un primer prototipo que al pulsar una tecla del teclado se escribiese el número de la tecla en el puerto serial, un código en Python lo leyera y dependiendo del valor se ejecutase un script u otro.
Para obtener el resultado final añadimos al prototipo dos componentes, por un lado una interfaz escrita en Tkinter que es una librería de Python para el desarrollo de interfaces gráficas, con ella el usuario podría asignar a cada uno de los botones el script que desee que ejecuten, pudiendo escribir la ruta a éste de manera manual o a través de un buscador de archivos. Por otro lado se añadió una base de datos SQLite que es una base de datos local para múltiples lenguajes y compatible con Python, en ella se escribiría la ruta al script asignada a cada botón y cuando el usuario pulse una tecla se leería de ella dicha ruta.
Finalmente con todo esto creamos CoDeck: un teclado que ejecuta scripts acompañado de una interfaz para que el usuario lo mapee como desee y una base de datos para la persistencia de la información.
Hardware
En cuanto a la parte de hardware, hay que resaltar principalmente 2 apartados: el circuito y la estructura creada para el proyecto.
Para el circuito se han tenido que soldar todas las conexiones que había que hacer con los switches ya que era imposible que las conexiones se mantuvieran fijas con los cables sin soldarlas.
En cuanto a la estructura, se ha optado por utilizar una impresora 3D para poder diseñarla con las preferencias que se tenían para este proyecto, ya que el objetivo era tener una caja con forma ligeramente diagonal y con un tamaño compacto.
- Materiales utilizados
Los materiales empleados para este proyecto son:
- Proporcionados por la universidad:
- Elego Uno R3.
- Cables hembra-macho.
- Materiales de los que ya se disponía y no han supuesto coste adicional:
- Soldador.
- Estaño.
- Flux: pasta que se aplica a los cables soldados para mejorar la conectividad en la soldadura y eliminar posibles óxidos.
- Tubos termorretractiles: tubos que se aplican en la zona soldada y posteriormente se calientan para que se adapten a la forma de la zona, con el objetivo de proteger la soldadura de posibles cortocircuitos con otros cables.
- Soporte para soldadura: para sujetar los cables y otras piezas y facilitar el proceso de soldadura.
- Pequeño ventilador para soldar.
- Materiales comprados:
- 20 switches mecánicos (blue switch): 10 euros.
- Circuito y soldadura
El circuito que se ha utilizado es bastante sencillo ya que, como ya se ha comentado, se han soldado todos los cables, por lo tanto, se ha buscado una forma sencilla de conectar los 12 switches para hacer el proceso de soldadura más simple.
La conexión de cada switch consiste en sacar conectar un pin con una conexión del switch y después llevar la salida del switch a tierra.
Sin embargo, el circuito tiene dos peculiaridades. La primera es que el circuito está invertido. Esto significa que en estado de reposo (sin el switch activo) pasa corriente por el circuito. Cuando se activa el switch, el circuito se abre y deja de pasar corriente, por lo tanto, en el código se tendrá que detectar LOWs en vez de HIGHs.
La otra peculiaridad es que no se observan resistencias en el circuito. Eso se debe a que se están utilizando las resistencias internas que tiene cada pin de 20k ohmios. Más adelante, en el apartado de código, veremos cómo se activan.
Para la soldadura del circuito se han utilizado los materiales antes mencionados. A continuación, se muestran algunas fotos del proceso y los materiales:
Y este es el resultado del circuito una vez soldado:
- Estructura
Para la estructura se diseñó un modelo 3D de la caja que se quería utilizar en nuestro proyecto. Se realizó a través de Blender y se tomó como referencia algunos otros proyectos de Thingiverse. A continuación de muestran fotos de las estructuras: la caja principal, el frontal y la tapa:
Y a continuación el proyecto terminado:
Código
Todo el código referente al proyecto puede visualizarse desde el siguiente repositorio de código
https://github.com/jj-tena/Practica-Sistemas-Empotrados
Estructura del proyecto
La estructura del proyecto a nivel de código puede dividirse en 2 grandes bloques, denominados Sender y Receiver.
El bloque Sender es el encargado de enviar las pulsaciones recibidas al Receiver, mientras que el Receiver es el encargado de recibirlas y actuar en consecuencia.
Arduino
Sender
La función del Sender es mandar un código específico hacia el Receiver mediante el puerto Serial. El puerto Serial sirve para comunicar dispositivos digitales.
Para ello los pines correspondientes se configuran como entradas, activando las resistencias internas para así simplificar la circuitería. A su vez, cada pin tiene asociado un código, que es el que será mandado hacia el Receiver en caso de que uno de los switches se active.
Python
Receiver
El Receiver es el encargado de leer los códigos mandados por el Receiver en referencia a cada botón desde el puerto Serial, para así ejecutar los Scripts asignados a dichos botones.
Para ello se configura la lectura en el puerto, quedando el Receiver esperando a que una código de operación sea recibido.
Una vez que el código es identificado y casteado correctamente, se obtiene el path de la base de datos al script correspondiente y éste ejecuta.
Interface
El código referente a la interfaz se ha realizado utilizando la librería Tkinter de Python, la cual es la librería estándar para la creación de interfaces. Cada método se encarga de crear un componente específico de la interfaz, creando alguno de ellos componentes compuestos, para al final construir la interfaz completa en el main.
Database
El archivo encargado de realizar operaciones CRUD con la base de datos, está compuesto por los métodos necesarios para poder operar con ella.