Dirija varios LED con un pin de microcontrolador

Quiero mostrar el estado de un programa con LED. Hay 22 pasos, cada paso está representado por un LED.

  • solo un LED está encendido a la vez
  • se establece la secuencia (hacia delante o hacia atrás).

Solo me queda un pin en mi MCU, tal vez dos.

Básicamente, me gustaría que el pin funcione como un 'reloj'. Para cada pulso, el LED "siguiente" se enciende, todos los demás LED están apagados.

Podría usar un reloj para IC binario. (por ejemplo, contador binario 74HC393) Esto crearía un nibble, que luego podría alimentar a un multiplexor (por ejemplo, 700-MAX336CPI+) que encendería una de sus 16 salidas a la vez. (Puedo vivir con 16 pasos).

Quiero hacerlo relativamente barato. Me pregunto si hay una solución más elegante. Tal vez con un IC especializado, o si hay una solución con componentes discretos simples, oh, tal vez incluso podría usar un pequeño servo para señalar el paso correcto... ¿Qué te viene a la mente?

Encadene dos contadores de décadas (por ejemplo, CD4017) y obtendrá una pantalla "decimal"
2 o 3 registros de bus de almacenamiento y desplazamiento de 8 etapas 4094B en cascada. Entradas D y Reloj.
¿Necesita o no que la pantalla se mueva tanto hacia adelante como hacia atrás? Si solo hacia adelante, entonces también recomiendo 4017.
sí, tanto hacia adelante como hacia atrás, pero hacia atrás sería pulsarlo rápidamente 21 veces
Entonces, en realidad no hacia atrás, solo hacia adelante + ¿alguna forma de reinicio?
¿Qué significa "relativamente barato"? Para algunas personas eso significa <$10. Para otros significa <$100. Para otros aún significa <$1000. ¿Qué MCU estás usando ahora? ¿Son $ 7 demasiado caros para una MCU? ¿$ 2 es demasiado caro para una MCU? ¿Estás haciendo solo uno de estos, o tienes la intención de fabricar? ¿Cuánto le importa saturar su lista de materiales?

Respuestas (7)

Usaría 3 contadores 4017, encadenados juntos. Simplemente registre la cadena desde su microcontrolador. El 4017 es muy económico, tiene una salida para cada LED (por lo que no hay decodificación) y se puede configurar muy fácilmente para encadenarlo. Necesitaría 3 para su aplicación. La salida de 23 pines debería restablecerlos todos para reiniciar el conteo.

Editar: es posible que pueda piratear algo usando diodos y menús desplegables para probar si el 'reinicio' (es decir, la salida 23) es alto usando el pin del reloj. Un diodo de 23 a la salida del reloj a través de una resistencia de 10k, con una resistencia de 100k en el pin como desplegable. Cuando el uC está bajando el reloj, cámbielo momentáneamente a una entrada. Si se mantiene bajo, aún no es el final. También es posible que deba probar 24 (es decir, tener ambos conectados al reloj a través de un diodo y una resistencia de 10k) ya que el pull-up probablemente lo registre nuevamente (pero solo una vez, hasta que lo vuelva a bajar). No estoy seguro, no lo he probado, pero probablemente.

Es mucho más fácil volar otro pin uC para probar 23, pero dijiste que no querías hacer eso.

CD4017 "contador de décadas" es la respuesta a mi pregunta y me está encaminando. Efectivamente barato. Gracias.
Conectar el pin de salida del micro a la entrada del reloj 4017 y a una red R, C, R que alimenta MR en el 4017 probablemente sería más simple que "algo que usa diodos y desplegables". Para cronometrar el 4017, envíe un pulso corto y luego retrase brevemente para dejar caer el voltaje en C. Para restablecer el 4017, envíe un pulso lo suficientemente largo como para elevar el voltaje en C por encima del umbral de restablecimiento. (Esto supone un reinicio positivo que podría no ser así)

Actualice su MCU a uno con más pines. Será más barato que añadir más piezas.

muy buen punto

Las tiras LED RGB direccionables funcionan con un solo pin de datos.

Para agregar algo de contexto: WS2812b es el tipo de LED direccionable que se usa con más frecuencia en un paquete SMD 5050 en una tira. APA106 sería un tipo de LED casi compatible en un paquete estándar de LED de sombrero redondo de 5 mm ("F5"). Ambos funcionan con un protocolo de un solo hilo, que necesita una precisión de más menos 150 ns en la temporización del protocolo de datos; es decir, bloqueará su µC durante la transferencia de datos. También existe, por ejemplo, APA102(c) (en un paquete SMD 5050), que utiliza un protocolo de dos hilos, que es menos propenso a problemas de temporización.
Un expansor de puerto I2C también funcionaría.

Utilice una segunda MCU.

Conéctese a él usando un pin de E/S e implemente un protocolo UART entre los dos en el software. Eso le da un byte de datos completo en el que codificar su control de patrón de LED, que es mucho a medida que describe los requisitos.

Puede comprar una MCU de 28 pines que funcionará por menos de una libra (£ 1). Eso le brinda sus 22 pines de E/S para la conducción directa de LED con solo uno encendido, más 1 E/S para la conexión de MCU host.

Este es el circuito más pequeño con la menor cantidad de circuitos integrados para el control directo de LED: un circuito integrado, probablemente un cristal, dos condensadores de desacoplamiento. Ahorra en una carga de registros de desplazamiento, etc. y utiliza LED y resistencias baratos.

Si está feliz de colocar los LED en una matriz de unidades multiplexadas, podría usar menos resistencias y menos pines de MCU, por lo que una MCU más pequeña. El circuito de ejemplo a continuación muestra 20 LED en una matriz, controlados por 5 E/S de MCU y con 4 E/S de MCU absorbiendo la corriente de retorno.

Necesitaría una matriz de LED de 5x5 para usar 10 pines de E / S de MCU. Con 1 pin de E/S más para la recepción de UART, puede usar una MCU de 14 o 16 pines.

ingrese la descripción de la imagen aquí

Imagen del mundo de Nduli

Además del costo de la pieza, pagará el tiempo y los gastos de desarrollo/prueba del programa. Si solo eres tú por tu cuenta, no un trabajo profesional, entonces eso es menos importante. Si se trata de un trabajo profesional, esa es una consideración que se debe calcular.

... ¡o incluso un MCU de 14 pines!
@MartinRosenau, muchas gracias. No tuve la energía para poner eso en la respuesta original anoche, pero lo puse ahora.
Con algo de charlieplexing, podría hacerse en 7 pines, (4x3)x2=24.
@penguin359, en realidad, estaba ansioso por evitar que se desplomara en una respuesta de 'cómo manejo los LED con la menor cantidad de pines', con la montaña de comentarios que la acompañan. Eso se ha hecho demasiadas veces antes en el sitio. El OP obtendrá el punto de los ejemplos directos y muxed dados.

Su solución propuesta con un pulso para avanzar al siguiente LED suena factible.

Con dos pines dedicados (datos+reloj), puede usar I2C (bit-banged en el software si es necesario) y conectar un par de expansores de E/S o un controlador LED multicanal.

Con un solo pin de datos, puede probar una tira LED RGB direccionable o su propia disposición de chips LED direccionables conectados en cadena en una PCB. Son bastante baratos, pero necesitarán 5V y un cambiador de nivel.

También puede ver la familia de chips de 1 cable.

Una solución con un servo y dial definitivamente tendría algo de carácter, si puedes vivir con el ruido;)

Al igual que Justme, sugeriría el uso de LED direccionables, como el ubicuo WS2812 (se necesita un solo pin, protocolo extraño basado en el tiempo, pero muy compatible), o el APA102 (se necesitan dos pines, SPI estándar).

Los LED están conectados en cadena, por lo que envía comandos a los cables y puede cambiar todos los LED a la vez.

Esto puede ser excesivo en su caso como:

  • son led rgb
  • Puedes hacer la combinación que quieras

¡Pero la simplicidad y la flexibilidad adicional pueden ser útiles!

se establece la secuencia (hacia delante o hacia atrás).

Incluso si usa 74HC4017, necesitará un segundo pin para reiniciar.

Si desea escanear en ambas direcciones, necesita un pin de reloj y un pin de dirección, por lo que 2 pines. Con 2 pines, puede usar registros de desplazamiento 74HC595 encadenados.

Si no tiene dos pines libres, puede mover una de las salidas como otro LED a una de las salidas HC595, o mux algunos botones para guardar un pin.

Puede usar la salida 23 para restablecer la cosa. Este es un viejo truco con estos contadores. Ambas direcciones realmente no se pueden hacer con la solución 4017.
@bob_monsen puede hacer ambas direcciones, solo envíe pulsos N-1 rápidamente para encender el LED anterior
@bobflux: además, si uno conecta la primera salida de LED al cable del reloj a través de una resistencia, se podría restablecer el estado del dispositivo cambiando una salida repetidamente entre alta y flotante.
@bobflux Me gusta. zoom a través de la secuencia!
Todavía necesita un reinicio de encendido para asegurarse de que comience en el primer LED, pero no tiene para mí un microcontrolador IO