Por ejemplo, si tuviera un Arduino con 4 pines de E / S digitales, ¿cómo podría encender de forma independiente> 4 LED o leer el estado de> 4 botones?
Por ejemplo, si tuviera un Arduino con 4 pines de E / S digitales, ¿cómo podría encender de forma independiente> 4 LED o leer el estado de> 4 botones?
Respuestas:
Un registro de desplazamiento como el 74595 le permitirá tener muchas salidas con solo 2 conexiones: un pin de datos y un pin de reloj. Establece el pin de datos en el siguiente valor que desea mover al registro y luego pulsa el pin del reloj.
Bruno dio una buena respuesta, pero me gustaría tomar algunas notas.
El infame 70 mA
El 74HC595 se usa a menudo como E / S extendida, y se usa con frecuencia para controlar una serie de LED. Lo que a menudo se pasa por alto es que puede operarlo fuera de especificaciones de esta manera. La hoja de datos dice que la corriente de suministro total no debe ser superior a 70 mA, clasificaciones máximas absolutas (AMR), por lo que es mejor que se mantenga alejado de eso por algún margen. ¡Por lo tanto, 8 LED a 10 mA es demasiado, y a 20 mA excederá AMR en no menos del 130%! El límite probablemente se deba a la capacidad de corriente de los cables de unión, y luego la corriente demasiado alta puede no solo deteriorar el rendimiento de la pieza, sino que la dejaría permanentemente fuera de servicio si ese cable se rompiera.
Pero anoche me desperté porque tenía una idea . El límite de 70 mA va para Icc y corriente de tierra, entonces ¿por qué no dividir nuestro total u 80 mA y dejar que Icc tenga la mitad y corriente de tierra la otra mitad? Todo lo que tiene que hacer es hacer referencia a 4 de los LED a tierra (activo alto) y los otros 4 a Vcc (activo bajo). Luego, la corriente de los primeros proviene de Icc, la corriente de los otros va a tierra. Podrá utilizar LED de 15 mA de esta manera. (Es tan simple que me siento como un idiota por no haberlo pensado antes).
Los relojes combinados
pensé que Bruno había guardado un pin de E / S adicional al combinar el reloj de la caja registradora con el del pestillo. Parece que interpreté mal su respuesta. Todavía quiero ampliar esta opción.
¿Qué pasa entonces? La tabla en la página 5 de la hoja de datos dice:
los contenidos del registro de desplazamiento se desplazaron; los contenidos anteriores del registro de desplazamiento se transfieren al registro de almacenamiento y a las etapas de salida paralelas
(resaltado por mí)
Entonces, no son los datos nuevos sino los anteriores los que se están bloqueando. No es un problema real, solo asegúrate de cambiar un bit ficticio adicional para bloquear los últimos datos, o todo será un pin incorrecto.
La combinación de los relojes también significa que las salidas se alternarán todo el tiempo mientras se cambian nuevos datos. La función del pestillo era en realidad evitar eso. En muchos casos, esto no será un problema, si puede hacerlo rápido, pero en el peor de los casos puede obtener efectos no deseados. El peor de los casos podría ser usar el 74HC595 para multiplexar una pantalla a una frecuencia de exploración muy alta + tener una cadena muy larga de registros de desplazamiento + tener todos los 1 excepto un 0, un LED que está apagado + una habitación oscura. Dado que ese LED ve que todos los 1 pasan cada cierto tiempo en una habitación oscura, puede iluminarse muy débilmente.
O si combina esa multiplexación de alta frecuencia con una salida de control de relé. Todos los ceros y luego un 1 para el relé pueden significar que la salida del relé no es lo suficientemente alta como para entrar.
De acuerdo, esos son casos extremos, pero mantendría el reloj de serie y el de pestillo separados siempre que sea posible si desea multiplexar, o de lo contrario tener altas tasas de actualización.
Estoy de acuerdo con Ignacio con respecto al uso de un registro de desplazamiento 74XX595, serie en paralelo para expansión de salida, pero en realidad necesitará 3 conexiones, una para datos , una para reloj y una habilitación de enganche que transferirá los datos del registro de desplazamiento interno a los pestillos de salida.
Para la expansión de las entradas, puede usar un 74XX165, paralelo en el registro de desplazamiento de salida en serie, esto permitirá tener hasta 8 botones por 74XX165.
Lo bueno de este enfoque es que puede conectar en cadena varios registros de desplazamiento que permiten un mayor número de entradas o salidas, y mejor, puede mezclar 74XX595 y 74XX165 permitiendo y tener cualquier número de entradas o salidas.
Además de eso, puede compartir las señales de reloj y de pestillo, lo que reduce la cantidad de conexiones necesarias y simplifica enormemente el software. De esta manera, solo necesitará 4 conexiones para cualquier número de cualquiera de estos registros de desplazamiento:
Mientras buscaba un diagrama, encontré en este sitio web una forma muy inteligente de reducir a 3 el número de conexiones requeridas. Consiste en usar el mismo pin para la entrada y salida de datos.
El software hará algo así para cada pulso de reloj:
Nick menciona expansores de E / S, y definitivamente vale la pena examinarlos. Digikey enumera más de mil de ellos, elegiré uno con una interfaz I2C como ejemplo, porque eso requiere la menor cantidad de pines de E / S; mínimo dos
El NXP PCA9505 tiene 40 pines de E / S configurables, el equivalente a cinco 74HC595. Es una solución un poco más cara, pero obtienes mucha más funcionalidad para eso:
Lecturas adicionales
GPIO expansores , NXP folleto
PCA9505 hoja de datos
Para una solución sin circuitos integrados adicionales, puede usar técnicas como Multiplexación y Charliplexing :
Multiplexación (no se muestran resistencias limitantes de corriente):
La forma en que funciona la multiplexación es bastante simple: en el ejemplo anterior, si queremos encender el LED1, configuramos el pin C1 para que salga alto y el PIN R1 para que salga bajo, todos los demás pines pueden ser altos o Hi-Z (configurados para entrada, alto impedancia que los hace parecer "desconectados")
Si deseamos encender el LED5, configuramos el pin C2 para que salga alto y R2 para que salga bajo.
La cantidad de pines necesarios para controlar x LED puede calcularse con 2 pines para n 2 LED, por lo que, por ejemplo, para 16 LED necesitamos (√16) * 2 = 8 pines.
Charlieplexing:
Diseño esquemático alternativo (más ordenado) (sugerido por Supercat):
Esto es un poco más complejo, pero usa menos pines para manejar un mayor número de LED. Por ejemplo, podemos usar solo 5 pines para controlar 20 LED como en el ejemplo anterior (en comparación con al menos 10 pines con multiplexación matricial "normal" (no debe confundirse con el uso de un IC en cuyo caso el número de pines necesarios es log2 (nLED)
Para una solución externa, puede usar cosas como registros de desplazamiento o multiplexores como 74HC595 y 74HC151.
Un registro de desplazamiento toma un flujo de entrada en serie de datos sincronizados y salidas paralelas (SIPO In Parallel Out SIPO) o viceversa (PISO).
Generalmente tienen 8 salidas (o entradas) pero puede encadenar tantas como desee para ampliar cosas. La desventaja es que la velocidad que puede actualizar se divide por el número de salidas por entrada (por ejemplo, para un registro de 8 salidas, si tiene un reloj de entrada de 8MHz puede actualizar a 1MHz, para 16 salidas de 500kHz, etc.)
Estas técnicas también pueden funcionar a la inversa para las entradas.