Skip to content

Teclado numérico USB Jelly Comb

Juan Gonzalez-Gomez edited this page Apr 4, 2019 · 267 revisions

Colección

Colection-Jedi-v1.2.0.zip: Colección con los bloques usados en esta documentación

Contenido

Introducción

Conexión de un teclado numérico comercial a la FPGA, para tener teclas chulas :-). El modelo elegido es un teclado USB, modelo Jelly Comb. En esta documentación se muestra cómo trucarlo para eliminar la parte del USB y tener sólo el teclado matricial. Se muestran ejemplos del uso de teclas aisladas y de la lectura de la matriz completa. Las teclas de diferentes columnas se pueden usar como teclas aisladas (como cualquier otro pulsador)

Material

Modificando el teclado

En este apartado se describe el proceso de trucado del teclado, para eliminar el USB y convertirlo en un teclado matricial normal, al que luego le añadiremos los controladores para usarlo con la FPGA

El teclado tiene 4 tornillos de estrella por la parte trasera

Los quitamos. Tiramos de la parte superior e inferior para separar ambas partes y abrir el teclado

Retiramos la electrónica. No tiene tornillos adicionales. Sólo hay que tirar hacia fuera

El cable USB está conectado a la electrónica (PCB) por un conector blanco. Tiramos para sacarlo. El cable ya no lo necesitaremos más. Nos quedamos sólo con la electrónica

Usando unos alicates de corte, quitamos los dos componentes de la parte superior: el conector blanco y el reloj

También los podemos desoldar. Pero no importa que se destruyan. No los necesitamos

En la parte inferior (verde) se encuentran los contactos con el PCB flexible. En total hay 14, sin embargo observando el PCB flexible vemos que los dos de la derecha no están conectados

Tenemos en total 12 contactos, cuyos nombres están puesto en la cara superior: C13, C8, C9, C17-C19, R0-R5

Para conectarnos a esos contactos usaremos una tira de 12 pines macho. La colocamos por la cara superior del PCB, de forma que el agujero de la parte superior derecha de la placa quede entre los dos pines situados más a la derecha. Con un roturador marcamos la posición del resto de pines

La placa queda como se muestra en esta foto

Usando la cinta de cobre adhesiva, de 50mm de anchura, cortamos un trozo de 1mm aproximadamente

Lo pegamos en el contacto C8 del PCB, como se muestra en la foto

Lo doblamos y lo pegamos por la cara superior de la electrónica, pasando por encima de la serigrafía que pone C8, hasta llegar a la marca negra del rotulador situada en el extremo derecho

Ahora cortamos el cobre sobrante. Así es como queda por ambas caras.

Lo repetimos con los demás contactos, salvo con el C13 (Este contacto no se corresponde con ninguna fila ni columan de las teclas, por lo que no lo necesitaremos). Así es como queda la placa, por las dos caras

Colocamos la tira de pines sobre la cara superior, para comprobar que los pines están alineados (más o menos) con las tiras de cobre. Lo hacemos directamente con las manos. En esta foto he colocado una pinza para sostener los pines mientras saco la foto :-) (Pero la pinza no es necesaria)

No hace falta que esté perfectamente alineado, sino más o menos. Ahora usamos un poco de loctite u otro pegamento para fijar la tira de pines a la placa. Lo hechamos en la parte negra de los pines, que está en contacto con el borde superior de la placa

Ahora ya podemos soldar los pines a las tiras de cobre, para tener conectividad entre los conectores inferiores del PCB y los pines. Así es como queda la placa final:

La colocamos en su lugar original, haciendo presión para que entre bien

En la parte trasera de la carcasa del teclado hay que hacer un hueco, para que los pines puedan salir hacia el exterior

Esta es la misma parte trasera vista por la zona delantera, antes y después de hacer el hueco para los pines

Finalmente cerramos el teclado. Así es como queda

Y esta es la vista delantera

Distribución de pines (pinout)

Una vez trucado el teclado, se dispone de 11 pines, de los cuales 5 son para identificar las columnas y 6 para las filas. Los pines C se refieren a columnas y los R a filas (rows)

Mediante ingeniería inversa sobre el teclado se ha determinado la función de cada pin. La matriz del teclado es la siguiente:

Esquema eléctrico

El esquema es el típico de un teclado matricial, en el que la teclas son pulsadores, que al ser apretados unen el cable de la fila con el su columna

La matriz de conexionado es la siguiente:

Conexión a la placa Alhambra-II

Empezaremos con la conexión de teclas aisladas y luego del teclado completo

Conexión de teclas aisladas

Las teclas se pueden tratar como pulsadores aislados. Empezaremos conectando sólo una tecla

Ejemplo 1: Conexión de la tecla backspace

La tecla backspace es un pulsador que conecta los pines R1 y C9

Este es el escenario para las pruebas. Además del teclado y la Alhambra-II, se ha conectado un LED externo en el pin D2

El circuito de prueba es este: Tecla-backspace-01.ice. La conexión de la tecla la hacemos directamente, por lo que activamos la resistencia del pull-up de la entrada D12

En este vídeo de youtube se puede ver la prueba de funcionamiento. Inicialmente el LED está encendido. En reposo, cuando no está la tecla pulsada, por la entrada D12 entra un 1, debido a la resistencia de pull-up. Al apretar la tecla backspace entra un 0 y se apaga el LED

Click to see the youtube video

Ejemplo 2: Tecla backspace con lógica positiva

Las resistencias de pull-up de la FPGA son muy cómodas porque nos permite conectar los pulsadores, o teclas, sin necesidad de añadir resistencias externas, sin embargo hace que nuestro pulsador sea de lógica negativa. Para convertilo a lógica positiva sólo hay que añadir una puerta not

Tecla-backspace-02.ice

En este vídeo se muestra su funcionamiento. Ahora al apretar la tecla backspace se enciende el LED, y cuando está en reposo el LED está apagado

Click to see the youtube video

Ejemplo 3: Metaestabilidad y antirrebotes

El circuito anterior funciona, pero en realidad no es correcto del todo. Para que cumpla las reglas del diseño síncrono, y evitar los problemas de metaestabilidad, es preciso que la señal de entrada atraviese dos biestables D

Además, tenemos que añadir un componente antirrebotes para estabilizar la lectura de la tecla

Tecla-backspace-03.ice

Ejemplo 4: Detectando la pulsación

Para saber cuándo se ha pulsado la tecla usamos un detector de flancos de subida. Es un coponente que genera un tic cada vez que se recibe un flanco de subida, o lo que es lo mismo, cada vez que la tecla cambia de 0 a 1 (de no pulsada a pulsada). Para comprobar su funcionamiento haremos que se emita un pitido corto con cada pulsación

Añadimos un zumbador al escenario

Este es el nuevo circuito

Tecla-backspace-04.ice

Y en este vídeo lo vemos en acción. Con cada pulsación escuchamos el pitido

Click to see the youtube video

Ejemplo 5: Detectando la pulsación y la liberación

Detectar cuándo la tecla se ha liberado es similar a la detección de la pulsación, pero usando un detector de flanco de bajada en vez de subida. Para detectar ambos eventos colocamos los dos detectores de flancos en paralelo. Para comprobar su funcionamiento haremos que se emita un sonido más agudo al liberar la tecla

Como ambos pitidos se generan en instantes diferentes, los podemos combinar con una puerta OR para escucharlos por el mismo zumbador. Este es el circuito:

Tecla-backspace-05.ice

En este vídeo lo vemos en funcionamiento. Podemos escuchar claramente los dos tonos correspondientes a la pulsación y la liberación de la tecla backspace

Click to see the youtube video

Este mismo circuito se puede hacer empleando el bloque Detector-2, que incorpora ambos detectores de flancos: de subida y bajada. Está incluido en la colección Jedi

El bloque Key

El circuito para leer una tecla aislada lo encapsulamos dentro del bloque key. Tiene una entrada, que se conecta al pin de entrada donde está la tecla y tres salidas:

  • k: Salida por nivel. Indica el estado de la tecla: 0 No pulsada y 1 Pulsada
  • kdown: Se emite un tic cada vez que la tecla se ha pulsado
  • kup: se emite un tic cada vez que la tecla se ha liberado

Ejemplo 6: Probando el bloque Key

Para probar el bloque key rehacemos el circuito del ejemplo 5, que emite un pitido al apretar la tecla backspace y otro más agudo al soltarla. El resultado es exactamente el mismo que el del ejemplo 5

Tecla-backspace-06.ice

Bloque Key-beep, con sonido

Emitir un pitido corto en la pulsación de la tecla es algo muy común en los teclados porque da un feedback al usuario. Es algo que se usa mucho, por lo que es conveniente ampliar el bloque Key para conectarlo directamente a un zumbador. Es la misión del bloque Key-beep:

Ejemplo 7: Probando el bloque Key-beep

Este es el circuito para probar el bloque Key-beep. Funciona igual que el ejemplo 4: Al apretar la tecla backspace se genera un pitido corto (pero NO al soltarla). Todo queda mucho más compacto, y ahora lo podemos integrar fácilmente en nuestros proyectos. Es el poder del diseño jerárquico

Tecla-backspace-07.ice

Leyendo dos teclas aisladas

Añadiremos una tecla más, la tecla menos (-), para tener dos teclas aisladas conectadas. Cuando se aprieta esta tecla se unen los pines R5 y C18 del teclado. Conectaremos la nueva tecla a la entrada D11 de la placa Alhambra. Este es el conexionado

En el escenario añadimos un LED adicional, para mostrar el estado de la tecla menos

Ejemplo 8: Lectura de backspace y la tecla menos

Este es el circuito para detectar la pulsación de cualquier de las dos teclas: backspace o menos. Se emite un pitido corto al apretar cualquier de ellas. En el LED rojo se muestra el estado de la tecla menos y en el verde el de backspace. Se usan dos bloques key:

Tecla-backspace-08.ice

En este vídeo de muestra el funcionamiento

Click to see the youtube video

Ejemplo 9: Movimiento del LED arriba y abajo

Usaremos las teclas backspace y menos para subir y bajar respectivamente un LED. Al apretar backspace el LED ascenderá una posición y al apretar menos bajará. El circuito es el siguiente:

Tecla-backspace-menos-01.ice

Se usa un contador ascendente/descendete. Cuando se aprieta backspace, el contador se incrementa en una unidad, haciendo que el LED suba, a través del decodificador de 3 a 8. Al apretar la tecla menos se decrementa el contador

En este vídeo se muestra en acción:

Click to see the youtube video

Leyendo tres teclas aisladas

Para finalizar con la lectura de teclas aislados, añadiremos una más: ENTER. De esta forma podremos usar dos teclas para seleccionar y una, ENTER, para aceptar la selección. Cuando se aprieta la tecla ENTER, se unen los pines R2 y C17. El nuevo conexionado es el siguiente:

En el escenario añadimos un LED externo adicional, que se encenderá cuando se apriete el ENTER, y un display de 7 segmentos, conectado a las salidas DD5-DD0 y D0 de la Alhambra-II

Ejemplo 10: Selector de 8 elementos

Como ejemplo haremos un selector de 8 elementos. Con las teclas backspace y menos seleccionamos entre los 8 LEDs. Al apretar la tecla ENTER se muestra el número del elemento seleccionado (0-7) en el display de 7 segmentos

Tecla-backspace-menos-enter-01.ice

Al apretar ENTER se captura el valor del contador en el registro de 3 bits, que está conectado al decodificador de 7 segmentos. El tic generado se lleva al componente beep para hacer que suene con un tono más agudo que las otras dos teclas

En este vídeo se muestra su funcionamiento. ¡Es adictivo! :-)

Click to see the youtube video

Controlador de teclado matricial

Ya sabemos manejas las teclas de forma aislada. Ahora aprenderemos a usar el teclado completo usando el controlador final. La conexión entre el teclado y la Alhambra-II se muestra en esta figura. Usamos una cinta de 11 cables, conectados a los pines D13-D3 de la FPGA

El controlador tiene como entradas los 5 pines de las columnas y como salidas los 6 pines de las filas. Las filas se activan secuencialmente y se leen las columnas, para determinar qué tecla está pulsada. El estado de la tecla pulsada se indica por la salida kst: 1 apretada y 0 no pulsada. Se emite un tic por kdown al apretarla y otro por kup al soltarla. Cada tecla tiene un código diferente, el keycode, que sale por kcode

En esta imagen se muestran los códigos (keycodes) de las teclas. Los códigos de los números 0 - 9 son el propio número

Ejemplo 1: Código de las teclas en los LEDs

En este ejemplo mostramos en los 8 LEDs de la Alhambra II el código de la tecla apretada, y en un LED externo el estado de la tecla: pulsada o no pulsada. El escenario es el siguiente:

Este es el circuito: matrix-ej-02.ice

En este vídeo se muestra en acción. Se aprietan todas las teclas. En los LEDs se muestran los código de cada tecla

Click to see the youtube video

Ejemplo 2: Feedback sonoro al apretar una tecla

Añadiremos un feedback sonoro para que suene un tono cada vez que se apriete cualquier tecla. En el escenario colocamos un zumbador, conectado a la salida D1:

En el circuito sólo tenemos que añadir el componente Beep, que está en el menú Varios/Accesorios de la colección Jedi, y conectar su entrada a la salida kdown del controlador de teclado. Cada vez que se pulsa una tecla se emite un tic por este pin, lo que genera un sonido

matrix-ej-02.ice

En este vídeo lo vemos en funcionamiento. Se pulsan todas las teclas

Click to see the youtube video

Ejemplo 3: Pitido al pulsar y soltar

Para emitir un pitido al soltar la tecla sólo hay que conectar otro componente Beep a la salida kup del controlador. En este ejemplo se emiten pitidos de diferentes tonos al pulsar y al liberar las teclas. Mediante una puerta OR se llevan los tonos a un único zumbador

matrix-ej-03.ice

El escenario es el mismo que el del ejemplo anterior. En este vídeo se muestra en funcionamiento

Click to see the youtube video

Ejemplo 4: Detectando una tecla

Para detectar la pulsación de una tecla determinada, tenemos que usar su código de 5 bits. Usamos un comparador para saber si es el código correcto, y una puerta AND para detectar la pulsación de la tecla y el código correcto

En este ejemplo usamos la tecla Num Lock para cambiar de modo. En el modo normal, el LED7 está apagado y al pulsar las teclas suenan con un tono grave. Al apretar Num Lock enciende el LED y se cambia al modo alto, en el que las teclas suenen con un tono más alto. Al volver a apretar Num Lock se vuelve al modo normal

matrix-ej-04.ice

Al apretarse Num Lock, el biestable T cambia de estado y selecciona mediante el multiplexor el tono alto o bajo. En este vídeo se muestra en funcionamiento

Click to see the youtube video

Ejemplo 5: Movimiento del LED arriba y abajo

Haremos el mismo ejemplo que el 9 de teclas aisladas, en el que usamos dos teclas para mover el LED arriba y abajo. Pero en este caso lo hacemos con el teclado matricial. Usaremos la tecla 8 para subir y la 2 para bajar, ya que son las que tienen el dibujo de las flechas. Para detectarlas tenemos que usar dos comparadores con los códigos 0x08 y 0x02 respectivamente. Los tics de detección los introducimos en las entradas + y - de un contador ascendente/descendente

Tecla-backspace-05.ice

En este vídeo se muestra en acción. Aunque todas las teclas suenan, sólo el 8 y 2 son los que mueven el LED arriba y abajo respectivamente

Click to see the youtube video

Ejemplo 6: Mostrando números en el display

Conectamos un display de 7 segmentos para visualizar los códigos de las teclas. El escenario es el siguiente:

El código de las teclas es de 5 bits. Nos quedamos sólo con los 4 bits de menor peso, que se capturan en un registro con el tic de pulsación de tecla, que está conectado al decodificador para mostrar el número en el display de 77 segmentos

Tecla-backspace-06.ice

Lo cargamos y lo probamos. En este vídeo se muestra en acción. Al apretar las teclas numéricas, vemos su número correspondiente en el display

Click to see the youtube video

Aplicaciones

Ahora que ya sabemos manejar el controlador matricial de teclado, vamos a probar algunas aplicaciones sencillas

Seleccionando canales

Usaremos el teclado para la selección entre varios programas o canales. Esta selección se podrá realizar de dos formas:

  • Apretando la tecla correspondiente al número de canal: 0 - 9
  • Usando las flechas arriba y abajo para mover un LED entre 0 - 7 y apretando ENTER para la selección

Inicialmente el modo será el primero. Se cambia de un modo a otro mediante la tecla NumLock. Cuando está activada, las teclas 8 y 2 funcionan como las flechas arriba y abajo respectivamente

El circuito que lo implementa es este: matrix-app-01.ice

Y en este vídeo se muestra su funcionamiento. En el display de 7 segmentos aparece el canal seleccionado

Click to see the youtube video

Calculadora de un dígito

Haremos una calculadora muy sencilla, para sumar números de un dígito y mostrar el resultado en el display de 7 segmentos. Usaremos la notación polaca inversa. Por ejemplo, para hacer la operación 2 + 3 tenemos que apretar el 2, luego el 3 y finalmente la tecla +

Sólo se aceptan teclas válidas en cada momento. Así, las dos primeras teclas que se deben apretar son numéricas. Cualquier otra se ignorará. La tercera debe ser el +. Si se aprieta otra se ignora, y el resultado no se calcula hasta que se apriete el +

El circuito es este: matrix-app-02-calculator.ice

En este vídeo se muestra en funcionamiento. Se hacen las operaciones 1+2, 2+3 y 4+5. Al calcular 7+1 se aprietan más teclas de las necesarias para mostrar lo que ocurre

Click to see the youtube video

Organo electrónico

Una aplicación clásica de los teclados es hacer un órgano digital :-) Se usan las teclas 1-9 para tocas las notas. Con la tecla numlock se activa la octava superior, y al apretarla se vuelve a la octava anterior. Además se muestra en el 7 segmentos la tecla que se está apretando

El funcionamiento es como lo órganos clásicos: la nota dura lo mismo que la pulsación de la tecla. El circuito es el siguiente:

Fichero: matrix-app-03-organo.ice

El componente principal es el generador de notas, que se le pasa un divisor de 16 bits y genera la señal cuadrada de la frecuencia especificada. Mediante una memoria se hace la correspondencia entre el código de la tecla y la nota

En este vídeo se muestra en acción:

Click to see the youtube video

Y como no podia ser de otra manera, no he podido evitar tocar la marcha imperial :-)

Click to see the youtube video

Control de acceso

Usaremos el teclado para introducir un código de 4 dígitos y abrir una puerta (o una caja fuerte), que simularemos con un servo. El escenario es el mismo de siempre, pero añadiendo el servo:

La puerta se abrirá automáticamente al introducir el cuarto dígito, si la clave es correcta. Con la tecla Backspace se cierra la puerta y se inicializa el circuito. Una vez abierta la puerta, las teclas se desactivarán. El circuito es el siguiente:

Se usan 4 registros conectados en cascada para el almacenamiento de los dígitos introducidos por el usuario, en orden. Mediante un contador sabemos qué dígito es el introducido. Mediante un comparador de 16 bits comprobamos si los 4 dígitos son los correctos. La clave establecida para la apertura es: 1478

En este vídeo se muestra en funcionamiento. Primero se teclean códigos aleatorios. La puerta no se abre. Luego se hace reset (Backspace) y se introduce la clave correcta. Se abre. El teclado se deshabilita. Se hace reset para cerrar la puerta y se prueba más veces

Click to see the youtube video

Consola serie

Como último ejemplo de aplicación del teclado, vamos a hacer una consola serie: las teclas se envían por el puerto serie al PC. Con la tecla Numlock cambiamos entre numeros y letras. Este es el circuito:

Fichero: matrix-app-05-consola.ice

Cada vez que se pulsa una tecla se convierte su código en el carácter ASCII correspondiente, usando una memoria. La tecla Numlock se usa para cambiar el modo: letras o números. El código de la tecla se muestra por el display de 7 segmentos

En este vídeo vemos su funcionamiento. El teclado está junto al terminal serie del PC (GTKterm) donde se muestra todo lo tecleado

Click to see the youtube video

Autor

Licencia

Enlaces

Más información sobre teclados matriciales

Clone this wiki locally
You can’t perform that action at this time.