viernes, 17 de agosto de 2018

Forjando mi propio teclado (III): Cableado

Esta es la última parte en lo concerniente al teclado per se. Ya lo tengo, lo he conseguido, funciona. Pero el proyecto está lejos de terminar.

Teoría

Antes de comprar/montar nada cabría esperar que al menos uno tuviera cierta idea de lo que está haciendo y/o va a hacer.

Lecturas recomendadas: (en inglés, lo siento pero no encuentro demasiada (por no decir ninguna) literatura en nuestro idioma)

   -"Quantum hand wiring guide". Una guía "grosso modo" para comprender todo el proceso.
   -"How key matrices works". Esencial para su comprensión. Bien explicado e ilustrado con         gifs.
   -"How to make a keyboard the matrix". Si no te has enterado con el anterior o buscas                  complementar es una lectura interesante.
   -"How keyboards work". Un pequeño resumen sobre el firmware y qué pasa cuando pulsas        una tecla.

Los switches

No entraré a valorar las múltiples marcas y modelos habidos y por haber en el mercado. Aunque me centraré en los MX de Cherry (independientemente su versión/color) no solo por ser los que he empleado. Sino porque son los más comunes y para los que existe una mayor oferta de productos. Un switch (que en castellano entre las diversas acepciones significa interruptor. Y para el caso es la definición que nos conviene) lo único que hace es cerrar un circuito. Del fondo del switch sobresalen dos patillas. Cada una de ellas es la extensión de una pequeña chapa metálica en el interior. 

Pues bien, al presionar el stem (no encuentro traducción que me convenza. Pero diré que es la pieza de plástico que se presiona y se desliza en vertical) lo que ocurre es que debido a la forma de esta pieza los contactos metálicos hacen contacto. ¿Pero de donde viene y a donde va la señal? Ahora llego.

La matriz

Bien, todas las teclas se conectan a un controlador (una pequeña pcb que se se encarga de reconocer la tecla que has pulsado y enviarle el código resultante a nuestro pc) que es el que posee el conector (usb por lo general). Pero claro, un teclado convencional puede contener desde 62 a 105 switches. Podríamos utilizar una placa con el doble de contactos I/O para quitarnos de problemas. Ignoro si eso se ha hecho alguna vez en la historia, pero no debe ser demasiado rentable porque no es lo común.

La solución que se emplea es diseñar una matriz. En la que se se establecen filas y columnas y el nexo es el propio switch. Cada una de estas se conectará a una de las dos patillas de cada switch. Y ahí es donde se cierra el circuito. Lo que se conecta al controlador es cada una de estas filas y columnas. 

En el primer caso necesitaríamos un pcb de (en mi proyecto) 85 contactos mientras que haciendo dicha matriz solo necesitamos 23, una cantidad más asumible. Aquí dejaré mi diseño y hacerlo es importante para el futuro.


Es bastante simple. En cada columna no puede haber más switches que el número de filas y en cada fila no puede haber más que el número de columnas. En ambos casos puede haber menos, y bien veis que así es en la imagen. 

El controlador

En este caso yo me hice con un Teensy 2.0 que me ha costado horrores encontrar. Me consta que existen alternativas mucho más baratas. Pero a causa de mi ingnorancia en el tema, que en los tutoriales empleaban esta y para quitarme de líos elegí la Teensy 2.0.

Una vez programes el firmware (en la que estableces qué columna/fila está conectada a qué contacto y que carácter o función tiene asignada cada tecla) lo que ocurre es que la placa empieza a enviar señales a través de cada fila de forma consecutiva miles de veces por segundo mientras "escucha" por las columnas. Basándonos en mi diseño y haciendo un ejercicio de imaginación pulsaremos la tecla Q (esto se parece bastante al sistema de coorderanas de hundir la flota). Cuando el controlador envíe una señal por fila 3 y la reciba por la columna 2 automaticamente sabrá que se se ha pulsado esa tecla, consultará qué carácter alfanumérico o función tiene asignada la coordenada f3c2 (Por escribirlo de alguna manera) y enviará la información a nuestro sistema operativo. 

Resumiendo, se envían señales de forma contínua por uno de los canales que no van a ninguna parte porque hasta que el usuario cierre el circuito pulsando una tecla, la señal no podrá ser recibida en ninguno de los puertos en el que se la espera. Y es ahí cuando el pequeño procesador hace el trabajo de consultar las tablas (ascii creo) que le hemos dado al programar el firmware.


Diodos

Para evitar "retornos" (esto es que la señal eléctrica circule de vuelta o por lugares no deseados. Si se me permite la analogía, se trataría de un sistema de trinquete llevado a la electrónica) se instalan estas pequeños componentes. Baratos (sobre 9 céntimos/unidad aunque por amistad los conseguí a 3 céntimos) y fáciles de instalar. Permiten presionar teclas de forma simultánea. Sin ellos se podría presionar a la vez todas las de una fila. Pero en cuanto sumamos a la ecuación las de las columnas la cosa empieza a "petardear". En este caso compré diodos 1N4148.

La práctica

Con todos estos conceptos y diseños claros en mente, me puse manos a la obra. Mi principal apoyo para este proyecto fue esta guía. Así que en aras de simplificar lo más posible el relato. Narraré no más que lo necesario.

Guias recomendadas: (inglés de nuevo)

   -"My first keyboard". Por el compañero Simon Brand.
   -"I built a keyboard from scratch". Por el compañero Dave Cooper.
   -"BrownFox step by step". Por el compañero Matt3o y aquí un video subido por él mismo.
   -"A modern handwiring guide - stronger, cleaner, easier". Por el compañero Cribbit. (en la       que más me he inspirado, la mejor para mí)
   -"Building your own keyboard". Una curiosa presentación estilo powerpoint. Que sin ser           de mucha utilidad, es un enfoque algo distinto.
   -"Hand wiring a keyboard". Por el compañero Philip.
   -"Hand wired custom keyboard". Por el compañero David.

PD: Aunque parezca que en todas dicen/hacen lo mismo merece la pena echar un vistazo. Porque de todas se saca alguna idea. Yo mismo he ido cogiendo cositas de aquí y de allá.

Switches

Colocarlos en sus respectivos huecos, no tiene ningún misterio.

Diodos

Para evitar que la señal fuera por donde no tenía que hacerlo, se recurre a los diodos (en concreto los 1N4148) que impiden la circulación en sentido "contrario" de la corriente/señal. Un poco como la uñeta o gatillo en un trinquete. Su instalación es sencilla. Simplemente tuve que preocuparme de orientarlos correctamente.

Aunque os daré un consejo. Aunque pueda pareceros la mejor idea que habéis tenido (el ir haciendo partes completas de una sentada o dos) desechadla de inmediato. Acabaréis pinchándoos en los brazos. Y eso la primera docena de veces pase... pero más no, por Dios. Id por filas y de arriba abajo.

Filas

Ya que las filas en este caso son pocas y rectas. Traté de eliminar la cantidad justa de aislante del cable para su correcta protección de posibles contactos no deseados. Pero esto tiene una desventaja. Y es que al trabajar con márgenes tan pequeños dañé inevitablemente parte de la cubierta. Ya que al trabajar con cables tan largos me resultó complicado deslizar el aislante a lo largo del cable. Pero en una sola sesión lo conseguí.

Columnas

Al contrario que las filas. Esta parte costa de más cables pero mucho más cortos. El problema vino cuando me dí cuenta de que hubiera sido mejor soldar estas antes que las filas. Así que me tocó pasar por debajo los cables. No es tarea fácil teniendo en cuenta que las columnas requieren andar doblando el cable en tortuosos ángulos. Por no hablar que la fricción entre superficies de goma es bastante alta. Por lo tanto deslizarlos uno por debajo de otro no es una tarea demasiado grata. Me llevó varias horas de trabajo repartidas en varios días.

Finalmente lo que acabé haciendo (y esto se aplica tanto a columnas como a filas) fue:
   -Pasar el cable por encima de sus respectivos switches y hacer con un rotulador permanente unas marcas antes y después del pin donde había que aplicar la soldadura.
   -Con un bisturí/cutter hacer sendos cortes por las marcas. De modo que resultara en un fragmento de aislamiento "independiente".
   -Al comenzar a soldar si veía que quedaba expuesto demasiado cable simplemente no eliminaba el fragmento recortado previamente. Y empleaba dicho pedacito de aislante para compensar la contracción de plástico debido al calor emitido por el soldador.

El controlador

Para anclar el controlador "Teensy 2.0" a la plancha metálica le pedí a un compañero de clase que tenía una impresora 3D si me hacía el favor de imprimirme este diseño (aquí tenéis otro, por si queréis una alternativa). Simplemente tuve que pegarlo con cola de contacto al lugar de mi elección.

Ahora tocaba soldar todas las filas/columnas (a las que les había retirado una porción de aislante previamente) al controlador. Simplemente tendréis que anotar en un papel qué columna/fila conectáis a cada contacto (sin algunos en particular, como los GND, etc... en la propia placa ya vienen marcados y si no siempre tendéis la ficha técnica en internet o impresa junto con la placa). Esto es importante a la hora de diseñar el firmware (yo lo hice en esta página, que te asiste de forma sencilla).

Pero si queréis hacerlo desde cero por vosotros mismos. Os dejo un par de lecturas interesantes (en inglés):

   -"How to build your very own keyboard firmware" . De nuevo, por Matt3o.

Mi diseño me permite una mejor organización de cables a costa de una disposición de teclas (o layout) menos compacto a la par de un precio sensiblemente más alto al encargar la plancha metálica.

Espero tener la próxima parte cuanto antes. Esta ha sido y será la más extensa y ambiciosa de toda la serie. Ya que he ido dando tumbos a la hora de redactar (escribo, borro, vuelvo a escribir, cambio el enfoque, me cabreo, retoque por aquí, matizo por allá, no queda claro, mierda...borro la mitad.) y en el momento que se publica esto ya estoy barnizando la carcasa, no es broma.

Actualización (24/08/2018): Básicamente cambio de fuente, corrección de alguna falta de ortografía y añadir la autoría del artículo al que redirige el último enlace.