Multiplexación de LEDS y múltiples pines de salida

Ok... he estado tratando de entender algo (y créeme, para la mayoría de la gente es una pregunta MUY nueva)

Así que veo gente todo el tiempo "multiplexando" LEDS. usando solo unos pocos pines.

Digamos que para un Arduino que tiene... 5 pines de E/S, por ejemplo, aparentemente esto puede controlar 20 LEDS (o eso me han dicho) usando multiplexación... pero... lo que me confunde es que todo esto es controlado por 5 pines. Tal vez me estoy equivocando en la multiplexación, pero ¿cómo sucede exactamente esto?

Además, como he estado leyendo tutoriales de ensamblaje para el AVR, noté que cada puerto tiene 3 registros, PORTB, DDRB y PINB, ¿corresponden estos con LOW/HIGH/OFF... o esto no tiene nada que ver?

Supongo que no entiendo toda la idea de la multiplexación, he leído tutoriales... pero no entiendo exactamente cómo/por qué los conectas y, de hecho, dónde (y cuánto) usar resistencias para, sé que usando ciertas combinaciones de Alto/Bajo/Entrada puede lograr una matriz de LED bastante impresionante. pero ¿Cómo puedo determinar esto. Estoy seguro de que tendrías que usar transitores, ¿verdad?

Perdón por la pregunta confusa, es aún más difícil HACER la pregunta cuando no estoy muy seguro.

editar: también entiendo los registros de desplazamiento/multiplexación (al menos un poco) en términos de "tablas de verdad", pero en realidad no entiendo cómo implementarlo. Tal vez alguien podría recomendar un libro sobre el uso de transistores y similares con electrónica, ya que algunos de los libros básicos en realidad solo tratan sobre condensadores/resistencias.

Respuestas (3)

Empecé a escribir sobre demultiplexores y llamar a los multiplexores, por lo que el error ahora debería estar solucionado. Lo que necesita para controlar fácilmente varios LED son demultiplexores o el uso de multiplexores a la inversa.

Aquí hay una versión simple: imagina que tienes un teléfono. El teléfono está (en nuestro mundo simple) conectado a una centralita y la placa está conectada a otros teléfonos.

Cuando marcas un número, la placa lo reconoce y conecta tu teléfono a otro teléfono y así se hace la conexión. Solo necesita un teléfono y una centralita para conectar ese teléfono a muchos otros teléfonos.

Los demultiplexores funcionan de manera similar, excepto que aquí las líneas de datos y direcciones están separadas.

Entonces tienes un demultiplexor de hardware. Tiene pines de dirección, pin de entrada y pines de salida.

Su microcontrolador también tiene pines de salida. En el ejemplo del LED, puede conectar una salida del microcontrolador a la entrada del demultiplexor. Usando ese pin, puede controlar un LED a la vez. Si conecta los otros pines de salida del microcontrolador al demultiplexor, puede configurar la dirección. Para volver a nuestro ejemplo de teléfono, utiliza los pines de salida del microcontrolador conectados a los pines de dirección del demultiplexor para marcar un número. Así que envías una señal al demultiplexor y la señal es en realidad un número binario. El pin de salida del demultiplexor con ese número se conecta al pin de entrada del demultiplexor y puede enviar datos desde el microcontrolador al dispositivo conectado a la salida del demultiplexor. Esto en sí no es muy útil, porque el demultiplexor es entonces una quinta rueda.

Aquí viene la parte interesante: cuando haya terminado de usar el dispositivo conectado a esa salida en particular, puede usar los pines de dirección para seleccionar otro pin de salida con otro dispositivo conectado. De esta manera, obtenemos un simple interruptor, por lo que podemos seleccionar el dispositivo con el que se comunicará el microcontrolador.

Ahora vayamos al ejemplo del LED. Tienes un microcontrolador con 5 pines de salida. Digamos que tiene un demultiplexor con 4 pines de dirección, un pin de entrada y 16 pines de salida (Mo0 a Mo15). Digamos también que desea controlar 16 LED. Entonces, conecta cada LED al pin de salida del demultiplexor y conecta 4 pines de salida (aquí llamados A0-A3) del Arduino a los pines de dirección del demultiplexor. Eso deja un pin para el pin de entrada del demultiplexor (aquí llamado Ao).

Ahora digamos que quieres encender un LED. Simplemente puede encender el pin Ao. En este caso, el demultiplexor leerá la señal enviada por los pines A0-A3. Dado que son bajos, lo interpretará como 0000. Ese es el número de pin Mo0, por lo que conectará Mo0 a Ao. Ahora digamos que quieres encender otro diodo. Puede hacerlo configurando el pin A0 en alto, por lo que obtendrá 0001 y el demultiplexor conectará los pines Ao y Mo1. De esta manera, puede conectar Ao a cualquiera de los pines Mo.

Bien, está bien, pero ¿cómo controlas todos los LED al mismo tiempo? Bueno, no lo haces. En su lugar, explotará los límites de la percepción humana. Si enciende y apaga un LED lo suficientemente rápido, la gente no lo notará.

Para eso, necesitará un programa que recorra los pines de salida seleccionados a una velocidad determinada. El programa debe contar los pines A como números binarios y de esa manera seleccionará qué LED controlar en cada momento en particular.

En cuanto a los registros que mencionaste. Bueno, están relacionados, pero en un nivel diferente. Mi consejo es aprender primero a controlar un LED. Después de eso, aprenda a controlar varios LED conectados al mismo puerto. Cuando aprenda eso, sabrá cómo configurar los pines de dirección para un demultiplexor alto o bajo (es lo mismo que encender o apagar un LED) y como ya sabe cómo controlar un LED, podrá controlar el LED actualmente seleccionado.

Aquí hay una imagen de un demultiplexor. El GEN de la izquierda es la señal de entrada. El GEN en la parte superior controla si el multiplexor está encendido o apagado. En un proyecto del mundo real, haría esto usando conectores de alimentación. Los 3 GEN en los pines de dirección de control inferiores ya la derecha son señales de salida. Cuando las líneas de dirección son bajas, se selecciona el número de salida 0.

alfiler 0

Aquí tenemos el pin 1 seleccionado:

alfiler 1

Aquí tenemos el pin 2 seleccionado:

alfiler 2

Y finalmente aquí tenemos el pin 3 seleccionado:

pin 3

Deberían obtenerse los mismos resultados usando un multiplexor y conectando la salida del microcontrolador a la salida del multiplexor y usando los pines de entrada del multiplexor como salida. Por supuesto, antes de hacer esa hoja de datos, se debe verificar si tal cosa es posible.

Acabo de darme cuenta de que mencionaste las resistencias. Como mencioné, antes de controlar una gran cantidad de LED, primero aprenda a controlar un solo LED.

Este depende del microcontrolador, pero para AVR, cuando configura un pin en estado alto, se establecerá en 5 V. También se debe limitar la corriente máxima a través de cada pin. Usé, por ejemplo, ATmega 162 y puede proporcionar hasta 200 mA para todos los pines y hasta 20 mA para cada pin. Otra cosa importante es el uso actual del LED. Los diferentes tipos de LED necesitan diferentes cantidades de corriente para lograr el máximo brillo. La segunda característica importante de un LED es su caída de tensión. Usé por ejemplo un LED de 20 mA, 3,6 V. En este caso, necesito limitar la corriente a menos de 20 mA. Para hacer eso, usé una resistencia. Hay una buena calculadora aquí ., que le dirá qué tipo de resistencia obtener para el LED. Además, al elegir la corriente del LED, tenga en cuenta que está buscando la menor de las dos corrientes suministradas. No debe exceder la corriente del pin del microcontrolador y no debe exceder la corriente del LED mismo.

Hay un grave error en este post, lo arreglo ahora.
Debería arreglarse ahora.
Joder, buena explicación. Pero entonces, ¿por qué la gente siempre los llama "multiplexores" en lugar de demultiplexores cuando controlan LEDS? Supongo que puede hacer ambas cosas, pero los demultiplexores son más fáciles.
@Sauron No estoy seguro. ¿Quizás los multiplexores se pueden usar en ambos roles, por lo que en realidad solo se fabrican multiplexores?

El acto de multiplexación consiste en tomar varias señales y combinarlas en una sola. El acto de demultiplexar consiste en tomar una señal multiplexada y reconstituir las múltiples salidas.

Como una simple analogía mecánica, supongamos que hay dieciséis interruptores que necesitan controlar dieciséis luces a cierta distancia, pero uno no quiere pasar dieciséis cables. Un enfoque sería manipular una disposición de motor/conmutador que conectaría un cable (el cable de "datos") a uno de los dieciséis interruptores, y generaría en otros cuatro cables un patrón 1/0 que indicara cuál de los dieciséis interruptores se seleccionó. En el otro extremo, uno podría usar los cuatro cables de "conteo" junto con algunos relés para conectar el cable de "datos" a una de las dieciséis bombillas. Dieciséis cables ahora se han reducido a cinco.

Tenga en cuenta que la señal enviada en los cables de "conteo" no cambia con los interruptores que están habilitados y deshabilitados. Se podrían omitir los cuatro cables entre el emisor y el receptor si hubiera otras formas de mantenerlos sincronizados. Por ejemplo, se podría arreglar la rueda del conmutador de modo que siempre tuviera un espacio entre las luces, pero enviaría un pulso largo "fijo" en cada revolución. El extremo receptor podría tener un mecanismo para buscar ese pulso largo y asegurarse de que su motor esté colocado adecuadamente.

Cuando las luces se multiplexan de esta manera, es posible que el emisor comunique cualquier combinación de luces al receptor, pero la multiplexación efectivamente retrasa la transmisión. Cuando se enciende una luz, el receptor no lo sabrá hasta que aparezca la rueda de multiplexación. En algunas situaciones, la velocidad es esencial, pero no es importante comunicar el estado de todos los interruptores, solo el de número más alto que está habilitado.

Para manejar ese escenario, uno podría tener un cable que indique si alguno de los interruptores se ha encendido y cuatro cables para indicar cuál de los dieciséis interruptores es el que tiene el número más alto que está encendido. En el extremo receptor, los relés podrían encender una de las dieciséis lámparas según la combinación de señales en los cables entrantes. Este sistema no se llama "multiplexación", sino "codificación". El dispositivo para detectar cuál de las dieciséis entradas es la más alta activada y configurar las salidas en consecuencia es un "codificador"; el dispositivo para encender la lámpara apropiada es un "decodificador".

Tenga en cuenta que el decodificador es, de hecho, idéntico al demultiplexor original basado en relés; lo que difiere es cómo se usa. En el sistema original, el patrón enviado por los cables selectores era fijo y la información real se enviaba por el cable de "datos". Aquí, el cable de datos simplemente sirve como una habilitación maestra, y la información real se envía por los cables selectores (en realidad, si hubiera quince interruptores en lugar de dieciséis, se podría omitir el cable selector, pero en muchos casos una habilitación maestra es una muy útil tenerlo; entre otras cosas, puede ser difícil asegurarse de que las señales en todos los demás cables se procesen de manera idéntica, pero sería mucho más fácil asegurarse de que la habilitación maestra llegue en último lugar).

Hay otro escenario que vale la pena mencionar: el receptor previsto de los datos podría querer saber el estado de cualquier interruptor en particular al instante, pero solo estar interesado en uno a la vez. En este escenario, el receptor de los datos suministraría cuatro cables seleccionados al remitente, y el remitente usaría algunos relés para conectar uno de los dieciséis interruptores al cable de datos de retorno. El emisor es efectivamente un multiplexor (que combina muchas señales independientes en una sola); el receptor puede hacer con la información lo que quiera.

El multiplicador (toma varias entradas de datos, más una entrada selectora) se llama así porque ese es, con mucho, su uso más común. Ya sea que la selección de entradas ocurra en un intervalo regular, o si en la práctica el destinatario de los datos está más interesado en una entrada en particular que en cualquier otra, el multiplexor combina muchas entradas en una sola. Si se usa un microprocesador para sondear múltiples entradas y almacenar los resultados en diferentes lugares, el microprocesador actuaría como un demultiplexor.

Por otro lado, un dispositivo para habilitar una de varias salidas basadas en un selector y una entrada de habilitación maestra podría usarse como demultiplexor, pero tales dispositivos se usan mucho más a menudo para decodificar una señal de selector codificada en binario en uno. -salida caliente. El procesador emite en los cables seleccionados un indicador de qué señal quiere que esté activa, y el trabajo del decodificador es hacer que eso suceda. En una cuadrícula de LED multiplexada controlada por el procesador, la CPU multiplexa efectivamente los datos del LED y los propios LED sirven como demultiplexores (si 16 LED tienen un pin de procesador conectado como un cátodo común y los ánodos de los LED están conectados a un decodificador, cada LED transmitirá o no transmitirá individualmente el estado de la línea del procesador, en función de si su cable de fila está activo).

La única vez que normalmente se ve el término "demultiplexor" usado es con señales analógicas. Si un dispositivo conecta una señal analógica a una de las dieciséis salidas, generalmente está claro que la señal en sí es lo que es interesante, en lugar de la selección de la salida.

Supongo que una persona podría controlar un montón de LED usando chips multiplexores o demultiplexores o decodificadores de direcciones, pero esa disposición parece bastante rara.

Las personas con grandes rejillas cuadradas de LED generalmente conducen en un arreglo de "matriz de LED". Por desgracia, la disposición de la "matriz LED" es un poco difícil de explicar, ¿tal vez las imágenes ayuden en la matriz LED arduino 3x3 ?

Las personas con una larga línea de LED a menudo los manejan usando registros de desplazamiento . Esos son mucho más fáciles de entender.

Sí, DDRB y PORTB se usan para controlar el nivel BAJO/ALTO/APAGADO de los 8 pines del puerto B. El PINB se usa para leer el estado actual de esos pines. Si está utilizando Arduino, puede que le resulte más sencillo utilizar las funciones de biblioteca pinMode() y digitalWrite() .