Control de muchas salidas analógicas con Arduino

#1
Hola,
Quiero controlar varias tiras de LEDs RGB que NO son "direccionables".
Después de quemar un Arduino, me ha quedado claro que tengo que usar transistores para alimentar / poner a tierra los LEDs. Eso ya lo he aprendido con sufrimiento :rolleyes:
La duda que tengo es cómo controlar con un Arduino UNO todas las salidas analógicas que necesito. Para cada tira necesito una señal analógica para regular la tensión de alimentación (12V) y una analógica para cada uno de los 3 LEDs (R, G y B), es decir, 4 señales analógicas.
Arduino dispone de 6 salidas PWM. Yo necesito tener 12 salidas, así que necesito algo más...
Primero pensé en usar Shift Registers, pero hasta donde yo sé, sólo dan señales digitales, así que no me vale.
Luego he probado con un MUX 74HC4051. El problema es que de esta manera consigo multiplicar cada salida analógica por 8, pero no puedo dar 2 salidas simultáneas con el mismo MUX. Si estoy mandando una señal al LED rojo, cuando mando otra al LED azul, el rojo se me pone a cero. Cuando el código es muy sencillo, el ojo no detecta el parpadeo, pero en cuanto complico un poco el código, se empieza a notar el parpadeo.
He visto un montón de tutoriales, pero todos los que encuentro son para hacer "juegos de luces" en los que siempre se enciende 1 LED cada vez.
Estoy seguro de que lo que quiero hacer yo lo han hecho miles de personas antes, pero no soy capaz de encontrar nada...
Alguien tiene una idea de cuál es la solución más conveniente?
 
#2
Hola, debes utilizar dos salidas digitales para accionar un transistor de potencia cada una, llamemosle A y B. Entonces tendrás dos grupos de tiras de LEDs A y B, los transistores alimentarán el común de cada grupo. Por otro lado, cada salida analógica debe conectarse a una tira del grupo A y a su vez, a una del grupo B. Con esto tendrás 12 tiras independientes, el sistema trabajará multiplexando, obviamente debes generar el código necesario para activar un grupo y luego el otro, a una velocidad suficiente cómo para que el parpadeo sea imperceptible al ojo.
 
Última edición:
#3
Con un shift register es posible pero se usa PDM, a diferencia de que el PWM se procesa por el generador del AVR, el PDM solo manda los bits directamente y la modulación corresponde a la densidad de 0's y 1's en la salida.

Hay una librería de SoftPWM para Arduino si quieres usar sus pines directamente.

PD: Arduino no tiene salidas análogas puras, el análogo es una integración de la señal digital modulada, la tensión no se regula, sino el periodo, solo lo digo para que luego no tengas más confusiones al respecto y termines quemando algo más.
 
Última edición:
#4
Hay unos leds "listos" que salen bien de precio y con un solo pin controlas los que quieras.

Puedes hacer pwm por software aunque eso consume bastantes (o todos) recursos.
 
#5
pues yo he controlado hasta 10 leds RGB con un PIC18f2550

no use como tal pines del PIC por que no eran suficientes pines , use registros de corrimiento.

se que diran que se ve mal o es un estroboscopio pero nada de eso se ve bastante Bien el PWM lo haces por software solo es direccionarlo a los registros de corrimiento.

los famosos 74hc595.

de hecho si buscas en llutub veras que hay varios videos que hacen PWM con registros de corrimiento.

ojo debe ser el 74HC595 por que si usas el 74HC164 no funciona por que al notener Latch los colores se pierden al usar PWM
 
#6
hay cosas que no me cuadran como el necesitar controlar los 12v y luego los 3 colores, con controlar los 3 colores deberia de valer no?
Por otro lado como te dice el compañero Nuyel puedes usar la modulacion PWM por software, con lo cual podras tener mas salidas de las que llamas analogicas, y con estas atacar la base de un transistor npn que lleve a tierra cada color de los que quieras controlar con el brillo que desees, no olvides poner una resistencia entre la salida y el transistor.
 
#7
Hola,
En primer lugar, muchas gracias a todos por contestar.
Adjunto un esquema de lo que he pensado.

@Gudino Roberto duberlin: creo que te he entendido, pero haciéndolo como tú dices, en realidad sólo controlaría 4 tiras, ya que para cada tira necesito 3 señales analógicas (rojo, verde y azul), verdad?

@Limako: lo de controlar los 12 V lo digo porque pensaba controlar también la alimentación e ir bajándola de 12V para bajar el brillo sin cambiar el color. Este punto no lo tengo muy claro… Hice una prueba con un potenciómetro de 10K y la verdad es que no notaba diferencia en el brillo más que cuando llegaba al extremo del potenciómetro, pero no sé si es porque el rango del potenciómetro era muy alto o porque directamente esto no se hace así. No tengo claro si bajando la alimentación a los 3 colores a la vez, cambio el brillo sin afectar al color…

@Trilo-Byte: probaré la opción del 74HC595, pero quiero que quede “perfecto” y no sé si seré capaz de este modo. De todas formas, miraré en LLutub y probaré.

@Scooter: lo de los leds “addressables” lo he visto, pero estoy aprendiendo y no quería meterme aún con eso. Prefiero mirar esta opción primero y cuando la controle, pasar a la siguente.

@Nuyel: la opción del SoftPWM es la que más me gusta a priori. De este modo podría usar 3 pines digitales a través de un 74HC595 alimentar 5 transistores JFET / MOSFET para 5 tiras y los otros 17 pines para alimentar 5 tiras (5x3) y me sobrarían 2 pines.

De todas formas, por seguir aprendiendo, si quisiera alimentar, pongamos 30 tiras con un Arduino UNO, ¿podría usar algún IC para multiplicar las salidas analógicas y mantener la señal en cada LED?
 

Adjuntos

#8
Mira, el problema de intentar controlar V en lugar de variar RGB para controlar el brillo radica en que si ambas señales se llegan a sincronizar no habrá variación de la intensidad luminosa en algunos casos, en otros, podría generar un efecto opuesto al que deseas. Te pondré un ejemplo esquemático simple, supongamos tenemos nuestro color con R75%, G25% y B75% los que corresponde a #bd3fbd e intentamos variar V al 25%, si se sincronizan las señales y las graficamos tendríamos esto

V |–___
R |–––_
G |–___
B |–––_

Lo cual actuará como una AND entre V y las señales por lo que en realidad el color no será el deseado sino que seria todas a 25% dando como resultado un blanco muy apagado.

Lo que debes hacer es matemáticamente reducirlo antes de enviar los valores RGB.
 
#10
Mira, el problema de intentar controlar V en lugar de variar RGB para controlar el brillo radica en que si ambas señales se llegan a sincronizar no habrá variación de la intensidad luminosa en algunos casos, en otros, podría generar un efecto opuesto al que deseas. Te pondré un ejemplo esquemático simple, supongamos tenemos nuestro color con R75%, G25% y B75% los que corresponde a #bd3fbd e intentamos variar V al 25%, si se sincronizan las señales y las graficamos tendríamos esto

V |–___
R |–––_
G |–___
B |–––_

Lo cual actuará como una AND entre V y las señales por lo que en realidad el color no será el deseado sino que seria todas a 25% dando como resultado un blanco muy apagado.

Lo que debes hacer es matemáticamente reducirlo antes de enviar los valores RGB.
Entendido. Muchas gracias!



¿pero que es perfecto?

¿cual es el caso de hacerlo analogico contra hacerlo por PWM?
no entiendo nada que alguen me explique
Lo digo porque tú decías que queda "bastante bien", así que imagino que algo se notará. De todas formas, más allá de encender las luces, mi objetivo es aprender, así que probaré también como tú dices.
Gracias!
 
Última edición:
#11
Creo que solo tiene una confusion con el PWM y el analogWrite(), yo siempre he criticado que Arduino llame así la función por que se presta a mal interpretar para los que no leen la referencia. Tengo una kinetis y en mbed dispongo de dos funciones, una pwm y una análoga, ahi si esta clara la distinción y es necesaria por que el chip sí tiene DAC de 10bits creo.
 
#12
eso es cierto no se si los ATmega328 realmente tenga salidas DAC, lo dudo demaciado.

un ejercicio que puedes hacer es leer audio de un ADC del micro ese mismo dato leido por el ADC mandalo a un puerto de 8 bits y haz un DAC R2R y veras como sale el audio creado por un autentico DAC.

ahora lo mismo pero en lugar de usar un DAC usa un pin con PWM ahi necesitaras un filtro pasabajos.

el audio sale notablemente bueno es asi como funcionan los amplificadores Clase D amplifican llevando a corte y saturacion los transistores en lugar de trabajar en la region activa es PWM y un filtrote pasa bajos convierte analogico el audio.

si el PWM puedes medirlo con un multimetro y lo llevas de 0 a 99% de su cicle duty y veras que hace un cambio de 0 a 5v como si se tratara de un voltaje analogico.

asi tambien funcionan algunos sensores de velocidad de volskwagen apesar de ser efecto hall llevan un PWM ¿por que ? no lo se pero algunos son PWM
 
#13
eso es cierto no se si los ATmega328 realmente tenga salidas DAC, lo dudo demaciado.

un ejercicio que puedes hacer es leer audio de un ADC del micro ese mismo dato leido por el ADC mandalo a un puerto de 8 bits y haz un DAC R2R y veras como sale el audio creado por un autentico DAC.

ahora lo mismo pero en lugar de usar un DAC usa un pin con PWM ahi necesitaras un filtro pasabajos.

el audio sale notablemente bueno es asi como funcionan los amplificadores Clase D amplifican llevando a corte y saturacion los transistores en lugar de trabajar en la region activa es PWM y un filtrote pasa bajos convierte analogico el audio.

si el PWM puedes medirlo con un multimetro y lo llevas de 0 a 99% de su cicle duty y veras que hace un cambio de 0 a 5v como si se tratara de un voltaje analogico.

asi tambien funcionan algunos sensores de velocidad de volskwagen apesar de ser efecto hall llevan un PWM ¿por que ? no lo se pero algunos son PWM

Ahora ya os habéis puesto a hablar en otro idioma :eek:

Entiendo que una señal analógica de 3V constantes, da 3V todo el tiempo, mientras que una PWM manda 5V a intervalos para que la media en un ciclo sea 3V. No es cierto?
Por otro lado, volviendo al tema de tener muuucha "analógicas" a la vez, he encontrado un multiplexor que se llama 74HC4351 y que tiene latch. Por lo que creo entender en el datasheet, permite meter una señal analógica por una entrada y mandarla a una de sus 8 salidas y dejarla fija en esa salida. De este modo tendría 6x8= 48 salidas analógicas que me permitirían controlar 16 tiras de leds RGB independientemente.
Acabo de comprarlo en eBai y cuando me llegue lo probaré a ver si es lo que pienso. Ya pondré algo aquí por si hay alguien tan perdido como yo.
Acabo de comprender porqué no me vale este IC. Al ser la salida de Arduono una señal PWM, en el instante en que el MUX lea esa señal, el valor será 0 o 5v, pero no la media...
 

Adjuntos

Última edición:
#14
Buenas. Arduino no tiene salidas analógicas, son salidas digitales moduladas por ancho de pulso. con esto se simularía una analógica, pero no lo es como tal.
hay drivers pwm que no se si tendrán algún tipo de comunicación i2c o algún tipo de estas como el tlc5940. Con esto podrias con un solo arduino controlar muchos leds de una manera mas fácil.
Por otro lado cuando dices controlar el led con un potenciómetro... no es nada lineal ese control y no el método mas optimo ni mucho menos para controlarlo.
Con el integrado que has pillado no se si podras controlarlo porque como te digo arduino no tiene salidas analógicas
 
#15
es que el compañero es necio hay que bajar la hoja de datos del ATmega328 y leer aver donde esta el pin con salida analogica.

que yo sepa no los tiene.

los leds RGB comerciales se controlan con PWM no por voltaje por que es absurdo hacerlo por voltaje.

es tan simple la idea tenemos un periodo de 10ms ahora lo dividimos en 255 partes podemos controlar perfectamente con 8 bits 1 color.

ahora si hacemos lo mismo para los otros colores podemos hacer una combinacion 255,255,255
un RGB estandar es decir si abrimos paint y elegimos un color al azar nos dara un valor RGB en 256 colores
lo metemos asi a nuestros leds y se reproduce el color que nosotros elegimos en paint.


ahora si sabes programar en Visual Studio es facil.
abres un color dialog, el color dialog te da un valor RGB lo mandas al micro y el micro debe reproducir ese valor en PWM y en los leds RGB se reproducira tal cual.
 
#16
es que el compañero es necio hay que bajar la hoja de datos del ATmega328 y leer aver donde esta el pin con salida analogica.

que yo sepa no los tiene.

los leds RGB comerciales se controlan con PWM no por voltaje por que es absurdo hacerlo por voltaje.

es tan simple la idea tenemos un periodo de 10ms ahora lo dividimos en 255 partes podemos controlar perfectamente con 8 bits 1 color.

ahora si hacemos lo mismo para los otros colores podemos hacer una combinacion 255,255,255
un RGB estandar es decir si abrimos paint y elegimos un color al azar nos dara un valor RGB en 256 colores
lo metemos asi a nuestros leds y se reproduce el color que nosotros elegimos en paint.


ahora si sabes programar en Visual Studio es facil.
abres un color dialog, el color dialog te da un valor RGB lo mandas al micro y el micro debe reproducir ese valor en PWM y en los leds RGB se reproducira tal cual.
Si mi ignorancia te molesta mucho, es tan fácil como que no leas las tonterías que escribo, pero no hace falta insultar (Por cierto, creo que confundes necedad con ignorancia).
Me ha quedado claro que Arduino no tiene señales añalógicas, por eso si te fijas, en mi último comentario entrecomillaba la palabra "analógicas", ya que entiendo que el PWM es una forma de simular una señal analógica.



Buenas. Arduino no tiene salidas analógicas, son salidas digitales moduladas por ancho de pulso. con esto se simularía una analógica, pero no lo es como tal.
hay drivers pwm que no se si tendrán algún tipo de comunicación i2c o algún tipo de estas como el tlc5940. Con esto podrias con un solo arduino controlar muchos leds de una manera mas fácil.
Por otro lado cuando dices controlar el led con un potenciómetro... no es nada lineal ese control y no el método mas optimo ni mucho menos para controlarlo.
Con el integrado que has pillado no se si podras controlarlo porque como te digo arduino no tiene salidas analógicas
Gracias! Creo que el TLC5940 es exactamente lo que buscaba. He visto que con 5 pines digitales de Arduino se puede controlar un IC, que controlaría 16 LEDs, pero que además se pueden concatenar varios ICs para tener más salidas.
Lo del potenciómetro ya me he dado cuenta de que no va nada fino. Creo que es mejor multiplicar la salida PWM por un factor menor que 1.
Muchas gracias por tu aportación.
 
Última edición:
#18
eso es cierto no se si los ATmega328 realmente tenga salidas DAC, lo dudo demaciado.

un ejercicio que puedes hacer es leer audio de un ADC del micro ese mismo dato leido por el ADC mandalo a un puerto de 8 bits y haz un DAC R2R y veras como sale el audio creado por un autentico DAC.

ahora lo mismo pero en lugar de usar un DAC usa un pin con PWM ahi necesitaras un filtro pasabajos.

el audio sale notablemente bueno es asi como funcionan los amplificadores Clase D amplifican llevando a corte y saturacion los transistores en lugar de trabajar en la region activa es PWM y un filtrote pasa bajos convierte analogico el audio.

si el PWM puedes medirlo con un multimetro y lo llevas de 0 a 99% de su cicle duty y veras que hace un cambio de 0 a 5v como si se tratara de un voltaje analogico.

asi tambien funcionan algunos sensores de velocidad de volskwagen apesar de ser efecto hall llevan un PWM ¿por que ? no lo se pero algunos son PWM
Que yo sepa el único Arduino que tiene DAC es el Arduino DUE y tiene dos salidas analógicas.
El soporte en al API de esas salidas es limitado.



Si mi ignorancia te molesta mucho, es tan fácil como que no leas las tonterías que escribo, pero no hace falta insultar (Por cierto, creo que confundes necedad con ignorancia).
Me ha quedado claro que Arduino no tiene señales añalógicas, por eso si te fijas, en mi último comentario entrecomillaba la palabra "analógicas", ya que entiendo que el PWM es una forma de simular una señal analógica.





Gracias! Creo que el TLC5940 es exactamente lo que buscaba. He visto que con 5 pines digitales de Arduino se puede controlar un IC, que controlaría 16 LEDs, pero que además se pueden concatenar varios ICs para tener más salidas.
Lo del potenciómetro ya me he dado cuenta de que no va nada fino. Creo que es mejor multiplicar la salida PWM por un factor menor que 1.
Muchas gracias por tu aportación.
El problema es que hacer PWM con eso es bastante / muy complicado, a no ser que quieras el mismo PWM para todos y lo hagas con el enable del chip, pero no creo que sea el caso.
Si hacer PWM por soft consume CPU, hacerlo con un registro de desplazamiento ni te cuento.
 
Última edición:
#19
si con el tlc5940 es difícil o costoso en recursos, igual por i2c con el pca9685 lo hagas mas fácil, eso si con ambos dos luego necesitaras la etapa de potencia por que estos son para señales lógicas de 5v.
O se me olvidaba el famoso ws2811 o 2812. que lo mismo necesitaras de etapa de potencia porque va a 5v
 
Última edición:
#20
Scooter pues si logre controlar varios leds RGB con PWM a software y con registros de corrimiento

suena enredado y si es algo abstracto se me ocurrio hace 5 años en el laboratorio cuando platicaba con un amigo que a lo mejor era posible.
lo intente y no pude lo volvi a intentar y nada.

un noche en mi camita se me ocurrio el algoritmo y funciono.

no creo que consuma muchos recursos por que use eso en un 18f2550 a 8Mhz lee por infrarrojo un control remoto sony y se ve que aun da para mas el micro.

la ventaja de los 74hc595 es que son muy baratos cuando son SMD valen casi nada cuando compras 5 suficientes para hacer algunos experimentos.

yo soy fan de esos chips por que puedes hacer muchas cositas dejando varios pines importantes del micro que estas usando
 
Arriba