Teclado de gran tamaño

Buenas tardes y felices fiestas para todos, la pregunta es la siguiente: cómo hago para fabricar un teclado que maneje 16 filas por 16 columnas para un total de 256 teclas que iré leyendo por columnas igual que en un matricial? La idea es hacerlo con arduino uno pero por el método tradicional gastaría 32 puertos digitales, cosa que no tengo con el "uno". Alguien me dijo que multiplexado pero no se cómo es esto. Les pido su ayuda y desde ya les doy gracias ...
 
Última edición por un moderador:
Se me ocurre que puedes usar expansores, por ejemplo; PCA9555
Ese que te mencioné es de 16 bits, así que usarías dos, uno para las filas y otro para las columnas.
Como funcionan por I2C, únicamente se usarían dos pines para el control.
 
Leer de forma análoga es bastante complicado, porque hay que usar un divisor resistivo y establecer un rango de tolerancia entre lecturas.
Y el 74HC154 es de un sólo sentido, así que no sirve para ese propósito.
 
Si se trata de solo utilizarlo para leer un teclado si sirve,
De echo se utiliza industrialmente con ese propósito desde tiempo inmemorial
Perdón yo me he confundido de CI el codificador de 16 lineas a 4 es el 74HC150 el que yo dije antes hace lo contrario lo hace 4 lineas a 16
 
Última edición:
A ver, ¿Explícame cómo puedes leer el estado de 16 bits con un circuito que únicamente dispone de 4 entradas y 16 salidas?

Perdón, yo me he confundido de CI.
El codificador de 16 lineas a 4 es el 74HC150, el que yo dije antes hace lo contrario, lo hace de 4 líneas a 16
Debe ser un circuito especial porque no lo conozco, ni encuentro su hoja de datos.
Tal vez te refieras al 74HC151, pero ese es de 8 bits. :rolleyes:
 
Última edición:
multiplexado es la técnica de siempre, mira, puedes usar un registro de corrimiento tipo 74HC595, solo también hay una pareja CMOS de la serie 40 pero no recuerdo el numero ahora, el 4094 es el serie-paralelo, el punto es, empleas esos registros y en el de salida pones el bit alto para la columna a leer, y en el de entrada vas leyendo los bits de cada fila, con eso expandes la matriz.
 
Si no te apetece las soluciones que te pasen... Por ahí podrías investigar un truco llamado "charlieplexing" aplicado a teclados, requiere un diodo por cada pulsador. Con 17 líneas tri-estado del microcontrolador podrias leer 272 teclas... n*(n-1)

Obvio que esa tarea se la das a un segundo '328p que lo comunicas con I2C con tu arduino, éste segundo Atmega podría correr a 8mhz con el oscilador interno, así ganás esos dos pines para tus fines, además le cargas el correspondiente boot loader de arduino (optiboot) y haces todo con esa plataforma, aplicando lo que ya conoces.

Ese "charlieplexing" es especialmente útil cuando disponés de tres líneas del micro, podés leer seis pulsadores, claro que si está disponible el ADC usas esto y con un solo pin solucionas el problema.

http://www.pcbheaven.com/wikipages/images/charlieplexing_1302613532.jpg
 
El de la seri 40 es el 6047 que hace lo mismo que el que propuse.
En el caso que propuse utilzando un 74HC154 y un 74HC150 se hace una matriz de 16 x 16 con 4bits de un puerto comandas por ejemplo cada una de las 16 columnas y con los otros 4 la lectura de las 16 filas
La sere 74HC es C-Mos lo mimso se puede hacer con los 4067 uno como multiplexor y el otro como demultiplexor
 
Leer analógico complica algo, pero simplifica el hardware, se puede hacer un matricial mixto digital analógico. Con unas cuantas resistencias vale.
Por ejemplo se hace 8x8 y 4 valores de resistencias, en total 8x8x4=256 teclas
 
Última edición:
Lo de análogo, lo intenté y el resultado fue medio aleatotio, no tenía lecturas claras, debe ser por la tolerancia de los valores de voltaje. Estoy leyendo Charlieplexin o como quiera que se escriba y no lo entiendo muy bien, voy a probar con los integrados que me proponen a ver qué sale, muchas gracias por el interés mostrado
 
Hola, coincido con pandacba, utilizar un 74XX154 cómo direccionador de filas por ejem. Y tomar los datos con dos multiplexores de 8 entradas puestos en cascada para las columnas, cómo por ejem. el 74XX151, de esa manera se utilizan 8 puertos. Ahora cabe aclarar algo, sólo debe presionarse una tecla a la vez, ya que haciéndolo con dos o más, causaría cortocircuito en las salidas del XX154, siempre y cuándo las teclas presionadas correspondan a diferentes salidas de dicho demultiplexor.
 
Última edición:
olvida Charlieplexin, eso es solo para encender leds.
El IC PCA9555 me parece inviable para este proyecto pues no tendrias el control exacto del tiempo del I2C, cosa esencial cuando se realiza un barrido, ademas de lento a max velocidad del bus. (esto dependiendo tb del programador)

Aqui te dejo mi opcion:
Haz una matriz de 32 x 8 (filas x columnas)
y como no escapas de tener que usar electronica externa entonces que esta sea sencilla.
Las 32 filas son saildas. las 8 columnas son entradas que debes tener disponibles en el arduino. Ademas usarias 2 pines extras (llamemosle Pdata y Pclock) del arduino./ Realizas una cadena de 32 salidas con 4 registros de desplazamiento hc595 y eso es todo el hardware.
El programa debe ingresar un solo 1 en el registro, a travez de Pdata, y luego generando pulsos por Pclock lo vas desplazando una posicion en el registro. Un contador para saber en que posicion se encuentra y por las 8 entradas del arduino si una se activa entonces el contador solo te da 8 opciones distintas de tecla por posicion. Al llegar a la pos 32 reinicias contador y vuelves a empezar. Eso seria el barrido. El sistema tambien admitiria multiples teclas simultaneamente si logras escribir un programa de unos pocos ms de tiempo de ejecucion..

Ahora bien, por cada tecla que se pulse supongo pretendes que el arduino haga "algo", y si tienes 256 teclas entonces tienes 256 procesos distintos. quiza pretendas demasiado del arduino.. y por cierto, dediclae tiempo a leer sobre multiplexores, demultiplexores etc que son conceptos muy importantes.
 
Última edición:
La idea es con el codificador de 4 a 16 es encer una a una cada columna por ejemplo y con el codificador de 16 a 4 lees cada fila que sera 0 si en esa columna no hay nada presionado al barrer obtendras en alguna de las filas un dato distinto de 0 si hay una tecla presionada, y 0 si no lo hay
 
Hola, coincido con pandacba, utilizar un 74XX154 cómo direccionador de filas por ejem. Y tomar los datos con dos multiplexores de 8 entradas puestos en cascada para las columnas, cómo por ejem. el 74XX151, de esa manera se utilizan 8 puertos. Ahora cabe aclarar algo, sólo debe presionarse una tecla a la vez, ya que haciéndolo con dos o más, causaría cortocircuito en las salidas del XX154, siempre y cuándo las teclas presionadas correspondan a diferentes salidas de dicho demultiplexor.

Agregas diodos y listo, yo use algo similar en el Arduino para leer la matriz de un teclado Casio con el shift register y un puerto de entrada, podía leer en simultaneo las 49 teclas, el teclado tenia diodos en cada una e incluso use la pull-up internas del ATmega para no requier de componentes extra más que un circuito integrado.
 
Atrás
Arriba