¿Cómo extender un microcontrolador GPIO a ~300 entradas?

Necesito averiguar la dirección de los botones presionados. Digamos que necesito alrededor de 300 puertos de entrada requeridos dedicados para botones individuales. Entonces necesitaría 300 pines de E/S para leer la dirección de un botón presionado que no es factible para el microcontrolador sin usar ningún tipo de circuito integrado.

Mi pregunta es, ¿hay algún IC que dedique una dirección individual para el botón pulsador, de modo que cada vez que presione el botón me envíe/me dé una dirección como 0xA? ¿O hay trabajo alrededor?

¿Necesita saber el momento exacto en el que se presiona cada permutación de los 300 botones? ¿O puede aceptar escanearlos, en su lugar?
@jonk puedo tomar hasta 500 milisegundos de retraso.
escáner de teclado en serie
Para 300 botones, solo necesitaría 35 E/S en formato de matriz (20x15). Es posible que pueda salirse con la suya con menos usando otras técnicas como Charlieplexing.
@Enslaved Además, considere cuidadosamente las técnicas que usan diodos para permitir múltiples detecciones de pulsación de botón sin confusión, al escanear.
@RonBeyer Sé sobre el uso de Charlieplexing para LED, pero no he oído hablar de su uso para multiplexar conmutadores. ¿Tienes referencias de eso?
¿Dónde están los 300 botones? ¿En una placa de circuito impreso cerca del microcontrolador o distribuida por todo un edificio con muchos cables?
Considere un FPGA con un procesador suave o duro en su interior. Esto puede permitir >1000 IO.
¿Se pueden presionar varios botones simultáneamente?
Un artículo charlieplexing muy bueno: ednasia.com/news/article/…

Respuestas (3)

Si 256 botones son suficientes, puede usar dos MCP23017(16 puertos I2C GPIO): el primero como 16 salidas, el segundo como 16 entradas, por supuesto con una matriz de botones de 16x16. Si no es suficiente, puede usar tres de ellos, o "tomar prestadas" tres líneas adicionales de MCU (por lo tanto, hará posibles 16x19 = 304 botones).

Como mencionó @jonk, si desea detectar varios botones presionados al mismo tiempo, debe agregar diodos ( 1N4148, 1N914) a cada botón, como se muestra a continuación:

matriz de botones (con diodos para cada botón)

Si no necesita manejar varios botones presionados, debe proteger solo las líneas de salida con diodos, como se muestra a continuación:

matriz de botones (con diodos en las líneas de salida solamente)

MCP23017es bastante barato y funciona muy bien.

Solo para agregar a esto, normalmente no usaría 1N4148 discretos. De la misma manera que puede obtener paquetes de red de resistencias, también puede obtener paquetes con múltiples diodos.
@Graham, depende de la idea mecánica del montaje de los botones. Depende de OP.

También elegiría multiplexación o Charlieplexing para esta función.

Si insiste en usar líneas de E/S dedicadas para cada botón, un puñado de registros de desplazamiento también podría hacer el trabajo, por ejemplo, SN74HC166/SN74HC165. También puede combinar los dos, usar 595 para cambiar un patrón y 166 para ingresar los estados de los botones. Es fácil usar estos chips con la interfaz SPI de un microcontrolador, y son muy baratos si compra más de ellos al mismo tiempo.

Charlieplexing se usa para LED, pero no estoy seguro de que sea aplicable a los interruptores de lectura. ¿Tienes referencias de eso? ¿Por qué recomendar el 166/165 y luego decir "usar 595"? Recuerda que estás hablando con un principiante.

Sí. La solución más simple se llama registro de desplazamiento. Puede usarlos tanto para la entrada como para la salida, aunque generalmente cada chip está dedicado a uno u otro. Bueno, es decir, son "serie a paralelo" o "paralelo a serie".

Digamos que tiene un registro de desplazamiento paralelo a serie de 8 bits, tendrá 8 líneas de entrada paralelas, y cuando lea la línea serie, le dará el valor de cada uno de sus 8 pines de entrada paralelos en secuencia. O para la salida, al revés (escribir 8 bits en una línea establece la salida en los 8 pines de salida paralelos). Por lo general, puede encadenarlos juntos, de modo que la lectura/escritura más allá de esos 8 bits cambie los valores del siguiente registro que haya conectado.

Pero si tiene MUCHAS entradas, como construir un teclado, entonces tiene sentido hacer el arreglo de multiplexación que otros han mencionado. De esa manera, con N GPIO puede leer N 2 entradas. Además de los consejos aquí, debería encontrar muchos tutoriales en línea, ya que los teclados de bricolaje son una cosa.

Aún así, dado que los registros de desplazamiento son tan baratos (los he visto a 50 por $ 1), a veces solo es cuestión de administrar la complejidad de la manera que tenga más sentido para usted en ese momento.