8 pines pwm a 16 bits???

Actualmente estoy controlando 4 LEDS con un Arduino Leonardo (32u4), 3 de ellos a 16 bits y 1 a 10 bits. Tengo la necesidad de controlar hasta otros 4 LEDS mas, de forma independiente entre ellos (es decir que todos puedan encenderse o apagarse independientemente de como esten el resto) con la misma resolución de 16 bits para 3 de ellos y 10 bits para el cuarto, o incluso de ser posible los 4 a 16 bits.
Un resumen muy basico de lo que hace es controlar los LEDS de forma que todos pueden encenderse con un valor de 0 a 65535, donde evidentemente 0 es apagado y 65535 el mas brillante. Estos valores le vienen por el puerto serial en una trama continua con el valor que ha de representar cada LED.

A alguien se le ocurre como podria hacerse? De momento barajo varias ideas, entre las mias y las que me han ofrecido:

  • Usar un Atmel superior (como el del Arduino Mega por ejemplo) Es decir, existe algun arduino capaz de esto?
  • Mediante algún shift register analógico de 16 bits (ahi ando algo perdido sobre que posibilidades ofrece)
  • Hacer una especie de Leonardo Duo, por decirlo asi. Es decir "conectar" dos 32u4 entre si de alguna forma que cada uno se encargase de 4 de los 8 leds. (no se si esto es posible)

Las unicas condiciones a priori serian intentar conseguir una solución que implique el menor cambio posible en el codigo que estoy usando (que por el momento funciona a la perfección, gracias al amigo noter :wink: ) y que sea la solución más económica en cuanto a componentes.

Bueno, a ver si podeis echarme una mano alguno :slight_smile:
Saludos

Que tal esto x 8 euros
Adafruit 12-Channel 16-bit PWM LED Driver - SPI Interface - TLC59711

Mejor aún 16 canales 16 bit pwm
Adafruit 16-Channel 12-bit PWM/Servo Driver - I2C interface - PCA9685

Pues yo creo que las opciones que propone surbyte son más interesantes que gastar en un arduino superior sólo para tener más pwms. Además, para manejar el programa que tenías (creo recordar que sólo manejaba serial y pwm), te puede valer un arduino bastante más modesto (y pequeño, y barato) que el leonardo, junto con uno de estos dispositivos (o varios, porque me imagino que se podrán poner varios ocupando los mismos pines).
Como añadido para ayudarte en la decisión, aparte del número de puertos pwm disponibles, te puedo decir que SPI es más rápido que i2c, aunque utiliza 4 cables, contra 2 del i2c.
Además el sistema resultante es escalable con mucha más facilidad que utilizando los pwm de arduino, pues cada uno es "de una madre" (prácticamente cada uno requiere su propio código para manejarlo, y además algunos están en uso por o pueden interferir en el sistema).

surbyte:
Que tal esto x 8 euros
Adafruit 12-Channel 16-bit PWM LED Driver - SPI Interface - TLC59711

Mejor aún 16 canales 16 bit pwm
Adafruit 16-Channel 12-bit PWM/Servo Driver - I2C interface - PCA9685

Pero la solución que seria un arduino mas uno de estos con el mismo programa? O funciona de forma independiente del arduino?
Es que nunca habia oido hablar de ellos y voy muy perdido. Algun simil que pueda facilitarme entenderlo? :slight_smile:

noter:
Pues yo creo que las opciones que propone surbyte son más interesantes que gastar en un arduino superior sólo para tener más pwms. Además, para manejar el programa que tenías (creo recordar que sólo manejaba serial y pwm), te puede valer un arduino bastante más modesto (y pequeño, y barato) que el leonardo, junto con uno de estos dispositivos (o varios, porque me imagino que se podrán poner varios ocupando los mismos pines).
Como añadido para ayudarte en la decisión, aparte del número de puertos pwm disponibles, te puedo decir que SPI es más rápido que i2c, aunque utiliza 4 cables, contra 2 del i2c.
Además el sistema resultante es escalable con mucha más facilidad que utilizando los pwm de arduino, pues cada uno es "de una madre" (prácticamente cada uno requiere su propio código para manejarlo, y además algunos están en uso por o pueden interferir en el sistema).

noter, pero creo que usar otro arduino que no fuera un Leonardo creo que añadiria un problema, porque si no recuerdo mal los timers, pins...etc estaban pensados especificamente para ese modelo no?

Un Arduino y una placa de estas es lo que necesitas.
Antes de hacer mas preguntas, ve al link que te he puesto de cada placa y ahi tienes, hoja de datos, ejemplos, forma de conexión, etc, etc.
Todo resuelto.

Aca la librería y tiene ejemplos Adafruit_TLC59711, muy fácil.

a mi la PCA9685 me ha dado muy buenos resultados con servos, tambien hay libreria y es muy poca modificacion lo que tendras que hacer del codigo orignal

LordLedBurner:
Pero la solución que seria un arduino mas uno de estos con el mismo programa? O funciona de forma independiente del arduino?
Es que nunca habia oido hablar de ellos y voy muy perdido. Algun simil que pueda facilitarme entenderlo? :slight_smile:

Es tan sencillo a nivel de programación como que tú le envías por el bus spi o i2c las instrucciones a ejecutar con sus pwm.
Creo recordar que tu programa recibía comandos por bluetooth y los interpretaba en forma de luminosidad en varios led, ¿no? Si el programa está bien estructurado, no debería ser muy complicado cambiar la rutina de recepción para manejar más led, y la encargada de escritura pwm para que envíe los comandos al módulo, en lugar de gestionar los pwm internos. Además se podrá dejar abierta a utilizar más leds en un futuro.

LordLedBurner:
noter, pero creo que usar otro arduino que no fuera un Leonardo creo que añadiria un problema, porque si no recuerdo mal los timers, pins...etc estaban pensados especificamente para ese modelo no?

Precisamente, te vale casi cualquier arduino porque podrás prescindir de gestionar sus timers para hacer pwm. Con que tenga comunicación serial y comunicación spi o wire (i2c), el resto lo pone el shifter. Por supuesto que si tienes el Leonardo, lo mejor es que hagas el desarrollo con él (te permite usar el monitor además del bluetooth por hardware). Luego, para el producto final, sobre todo si quieres producir varios o muchos de esos dispositivos, podrás "afinar" el arduino a las necesidades, lo que te supondrá menor precio y menor espacio.

GO_zalo:
a mi la PCA9685 me ha dado muy buenos resultados con servos, tambien hay libreria y es muy poca modificacion lo que tendras que hacer del codigo orignal

Lo único que, si no me equivoco, esta no es de 16 bits, sino de 12, ¿no?

Retomo el tema, que me habia quedado un poco abandonado.
He visto que el Adafruit 12-Channel 16-bit PWM LED Driver - SPI Interface [TLC59711] : ID 1455 : $7.50 : Adafruit Industries, Unique & fun DIY electronics and kits funciona con un TLC59711 fabricado por Texas Instruments cuyo link es este TLC59711 data sheet, product information and support | TI.com

La duda me surge al ver que en la descripción indica:

  • Grayscale (GS) Control with Enhanced Spectrum PWM:
    16-bit (65536 steps)

  • Global Brightness Control (BC):
    7-bit (128 steps) for each color group

  • Que quiere decir esto exactamente?

  • Porque diferencia entre Grayscale Control y Global Brightness Control con un numero diferente de bits para cada uno?

  • Habria otro modelo que se ajustara mejor a lo que obtengo actualmente en las salidas PWM de mi Leonardo basandome en la información de este blog SaikoLED — Secret Konami Cheat Code to high resolution PWM on... ?

  • Entiendo que al usar esta solución no añadirá ningún retraso en la ejecución de programa, al añadir mas electronica no?

Aún a riesgo de equivocarme, te comento lo que deduzco después de hojear el datasheet del TLC59711; que es que además de poder ajustar independientemente los 16 bits del pwm de cada una de las 12 salidas RGB, para cada uno de los grupos RGB puedes, además, ajustar 128 niveles diferentes de brillo global.
En cuanto al tiempo que demora el escribir los registros pwm supongo que no habrá mucha diferencia con respecto a lo que tardes en cambiar directamente los pwm de arduino, aunque se podría comprobar si la librería continúa funcionando correctamente con divisores del reloj SPI menores (creo que el que usa por defecto es 1/8) para acelerar la escritura de los registros. La ventaja es que con sólo dos pines puedes manejar todos los pwm, e incluso todos los pwm de varios de estos dispositivos conectados en cascada, y que las modificaciones en un potencial programa para admitir más leds serían mínimas.

noter:
Aún a riesgo de equivocarme, te comento lo que deduzco después de hojear el datasheet del TLC59711; que es que además de poder ajustar independientemente los 16 bits del pwm de cada una de las 12 salidas RGB, para cada uno de los grupos RGB puedes, además, ajustar 128 niveles diferentes de brillo global.
En cuanto al tiempo que demora el escribir los registros pwm supongo que no habrá mucha diferencia con respecto a lo que tardes en cambiar directamente los pwm de arduino, aunque se podría comprobar si la librería continúa funcionando correctamente con divisores del reloj SPI menores (creo que el que usa por defecto es 1/8) para acelerar la escritura de los registros. La ventaja es que con sólo dos pines puedes manejar todos los pwm, e incluso todos los pwm de varios de estos dispositivos conectados en cascada, y que las modificaciones en un potencial programa para admitir más leds serían mínimas.

Pero que diferencia hay entre ajustar independientemente los 16 bits del pwm de cada una de las 12 salidas RGB y ajustar 128 niveles diferentes de brillo global para cada uno de los grupos RGB?
Los colores los obtenemos encendiendo mas o menos mediante el pwm,no? Entonces el brillo global que hace? Porque subir el brillo equivaldria a un cambio de color no?

No se si se explicarlo bien.

Lo que me preocupa es que el aumento de datos que obtuve al convertir los pines de pwm de 8bits en pins de 16bits, se vean recortados de alguna forma al usar el registro de desplazamiento. Este modelo me proporcionará "clones exactos" de los pins pwm de 16bits del Leonardo?

De vacaciones pero no puedo dejar de participar.

The TLC59711 has the capability to adjust all output currents of each color group (OUTR0-3, OUTG0-3, and OUTB0-3) to the same current value. This function is called global brightness (BC) control.

el TLC59711 tiene la capacidad de ajustar todas las corrientes de cada grupo de COLOR R G o B al mismo valor. esta función se llama Control de Brillo o Brightness Control BC. Ver pagina 16 de la hoja de datos.

The TLC59711 can adjust the brightness of each output channel using the enhanced spectrum pulse width modulation (ES-PWM) control scheme. The PWM bit length for each output is 16 bits. The use of the 16-bit length results in 65536 brightness steps from 0% to 100% brightness.

El TLC59711 puede ajustar el brillo de cada canal de salida usando un esquema de ancho de pulso de espectro mejorado.
La long es de 16 bits. El uso de esos 16 bits resultan en 65536 pasos de brillo entre 0 y 100%.

entonces uno ajusta el brillo individual (16bits) y otro el grupal (7 bit).
Pero el valor de la corriente puede que alimenta a los leds RGB puede fijarse con el control grupal y por ende es como si tuvieras una resistencia variable (pero ahora controlada digitalmente) para decirle : tu te vas a iluminar hasta este valor.
Luego el brillo varia en 16 bits usando el PWM. Se entiende?
Control total.