ayuda con tlc5940

Declara las funciones fuera del loop. Es decir:

void leds7y8(){
 //código
}

loop(){
//código
leds7y8(); //llamada a la función
}

De todas formas, ¿No sería más sencillo declarar una función genérica a la que le pases dos números de led, en lugar de una para cada pareja?

void dosled(int a, int b) {
   for (int i= 1000; i>= 10; i= i-5) {  
      Tlc.set(a, i);
      Tlc.set(b, i);
      Tlc.update();
      delay(2); 
    }
   Tlc.set(a, 0);
   Tlc.set(b, 0);
   Tlc.update();
}

void loop(){
    dosled(7,8);
    dosled(8,9);
// etc
}

Hola noter.
Funciona perfecto declarando la función fuera del loop como dices. Muchas gracias !.
Ahora que ya funciona esto intentaré hacerlo como dices con una función genérica.
Lo cierto es que me cuesta mucho crear funciones genércias para varios usos porque no sé mucho (más bien casi nada) de programación y por eso casi siempre voy metiendo todo de uno en uno con las pocas instrucciones que voy aprendiendo.
Pero intentaré hacerlo como dices porque tengo que poner 4 TLC5940 seguidos para conseguir cuatro filas de leds y encenderlos de varios en varios a la vez. Unas veces serán de dos en dos otra de cuatro en cuatro, otra vez quiero encender las filas enteras (primero la de arriba, luego la segunda.... ) y por último quiero que se enciendan absolutamente todos los leds de forma aleatoria pero también con el mismo efecto de pwm desvaneciéndose.
Vamos a ver lo que tardo en volver a pediros ayuda, jejeje.

Gracias y saludos.

La genérica también funciona!!.
No me lo puedo creer. Esto está genial !!.
Así da mucho más juego para hacerlo con varias posibilidades a la vez. He probado con la que me has dicho de dos y tambien he creado otra de cuatro.
Debo reconocer que al principio me daba algún problemilla porque no sabía como declarar la función "dosled" y he tenido que hacer pruebas hasta que he caido en que sería "void dosled (int a, int b); " .
Qué quieres?, estoy acostumbrado a poner tan solo " void ...... (); " . :smiley: .
Así que, una cosita más.

Muchas gracias :wink:

De nada. Si sigues con la misma ilusión aprenderás rápido, pero tienes que recorrer el camino: primero andar, después correr, y finalmente volar ;).
Saludos.

También es importante que aprendas a interpretar los códigos de error. En los errores que tenías ya te advertía que te faltaba un } para cerrar la función void loop y otro para cerrar la función void led7y8. Cuando el programa no compila siempre te da una indicación de por donde va el fallo. Hay que leer más jijijijijijijiji
Un saludo.

Jajajaja. La verdad es que tienes razón. Los códigos de error están ahí para algo, pero voy poco a poco con ellos.
Me hago bastante lío con las llaves { y al final siempre termino compilando una y otra vez y poniendo o quitando llaves donde más o menos voy interpretando que faltan o sobran, jejeje.
Bueno, os informo de que la cosa no va mal del todo y estoy ampliando con la selección de pin de forma aleatoria con "random".
He pasado un mal rato hace un momento pero se ha solucionado :sweat_smile: .
Vamos a ver qué tal seguimos con esto.

Por cierto. Esta instrucción debería funcionar aquí también ?: Serial.println(numaleatorio);
Saludos.

Lo más práctico para no hacerte la picha un lío con las llaves es ponerlas las dos separadas por una línea en blanco, situar el cursor en la línea en blanco y meter en medio el código que necesites. Tal que así:

void función (int param) {
Código;
.
.
.
Código;
}

Cuando sitúas el cursor junto a una llave, el ide te marca cual es la pareja. Si no la ves es que algo falla. Y si lo haces bien si puedes mandar al serial los números aleatorios.
Un saludo.

Bueno, pues como lo prometido es deuda. Aquí estoy con más problemas, jejeje.
He conectado un segundo TLC5940 y funciona fatal.
El primero sigue funcionando perfecto, pero al segundo se le quedan encendidos desde el sexto led hasta el 14. Además se le quedan encendidos a tope, es decir como si hubiera metido un "1" directamente.
He hecho la conexión que se indica en el ejemplo del TLC5940 y he llevado la salida SOUT del primero hasta el SIN del segundo y todas las demás conexiones las he hecho como en el primero.
He probado que si el SIN del segundo lo llevo a la misma conexión del SIN del primero, entonces ya no se quedan todos los led del segundo encendidos, pero los dos TLC5940 hacen lo mismo. Eso es evidente, pero es una prueba más para ver por dónde puede venir el problema.
Después de buscar mucho, he visto que hay que modificar "NUM_TLCS" del archivo "tlc_config.h" y borrar el "tlc5940.o" que están en la carpeta de la librería.
He abierto el tlc_config.h y he buscado donde aparecía NUM_TLCS y he cambiado el "1" por el "2" y he guardado tal cual el archivo. (no sé si habrá que guardarlo de otra forma o compilarlo o lo que sea).
El archivo "tlc5940.o" no lo tengo dentro de esa carpeta. Y buscando información he visto en otros foros extranjeros que había gente que le había pasado lo mismo pero que tampoco tenía este archivo para borrarlo.

Podíais decirme algo que se os ocurra o si a vosotros os ha pasado lo mismo, cómo lo habéis solucionado?.
Muchas gracias.
Saludos.

El fichero que buscas es un archivo objeto que genera el compilador cuando le das a verificar o cuando le das a cargar por primera vez, y se encuentra en un directorio temporal, no en la libreria. Forma parte de tu sketch y creo que en las nuevas versiones del ide arduino este archivo se elimina cuando sales del ide. Asi que cerrando y reabriendo el entorno de programacion (todas las ventanas para que se recargue la libreria modificada) seria suficiente con recompilar el sketch para que funcionara sin problemas.

Nada, que no hay forma.
Modifiqué el NUM_TLCS y puse 2. Cerré todas las ventanas. Bueno realmente hasta reinicié el pc.
Pero todo sigue igual.
Del segundo TLC se quedan encendidos continuamente un grupo de leds (desdel el 6º hasta el 14º) mientras que el primer TLC sigue funcionando perfectamente.
Una cosa curiosa que ocurre es que, cuando en el primer TLC llega a una rutina en la que se tienen que encender a la vez del led 1 al 4, eso mismo se repite en el segundo TLC. Y luego, el segundo TLC vuelve a quedarse como estaba, encendidos del 6º al 14º y los demás apagados, mientras el primer TLC hace su rutina.
He seguido buscando más info pero en cada esquema que encuento con dos TLC conectados, lo ponen de una forma distinta. En unos, VPRG tiene que ir a masa y en otros no.

Esto es una locura.
Por favor, alguna pista más?.
Muchas gracias donrodrigo por tu ayuda.
Saludos.

En este esquema encontrarás un ejemplo de montaje para tres tlc5940. Dropbox - Error

Corresponde a la versión 1.4 del rgb shield que funciona a la perfección y que para practicar con este chip esta muy bien. Observarás que hay una serie de pines que son comunes, y que vprg va a masa. Este conexionado funciona a la perfección. Míratelo y conecta tus chips como están estos. Seguro que no tienes bien conexionados los pines.
Un saludo.

Gracias donrodrigo.
He probado el circuito que me has enviado, aunque solo con 2 TLC. Cuando me funcione con 2, añadiré hasta 5 que son los que necesito.
El circuito es el mismo que tengo montado yo. Lo acabo de revisar y está todo igual. Tan solo, que yo había puesto también una resistencia de 10k para el BLANK del 2º IC, pero nada más. Aún quitándola sigue sin funcionar bien.
Doy por hecho que los led del segundo TLC se llamarán 17, 18, 19......, verdad?.

Te pongo el código por si tal vez me pudieras decir si es que tengo algo mal.
He seguido vuestras indicaciones y gracias a eso me ha salido muy cortito aunque esto es solo para probar. Cuando consiga que funcione tendré que ampliarlo.
La secuencia es: en el primer TLC y empezando desde el centro, se encienden 8 leds de dos. Es decir 4 hacia cada lado.
Luego se encienden los 4 primeros también del primer TLC y después los 4 últimos también del primer TLC.

Pues con este código, como os digo, en el segundo TLC, del led 6 al 14 están siempre encendidos. Pero es que, cuando el código llega a que se enciendan del 1º al 4º del primero, también se encienden del 1 al 4 del segundo TLC.

Y luego, en una carpeta a la que he llamado "librería TLC5940" me he metido en el archivo " tlc_config.h" y he cambiado el número de TLC, de esta manera:

/* ------------------------ START EDITING HERE ----------------------------- */

/** Number of TLCs daisy-chained. To daisy-chain, attach the SOUT (TLC pin 17)
of the first TLC to the SIN (TLC pin 26) of the next. The rest of the pins
are attached normally.
\note Each TLC needs it's own IREF resistor */
#define NUM_TLCS 2

Te digo lo de que yo he llamado de tal manera a la carpeta por si acaso estuviera mal el haberle cambiado el nombre y se tiene que llamar de otra forma.

Aquí, el código:

#include "Tlc5940.h"

void setup()
{
/* Call Tlc.init() to setup the tlc.
You can optionally pass an initial PWM value (0 - 4095) for all channels.*/
Tlc.init();

}

void dosled(int a, int b) {
for (int i= 1000; i>= 10; i= i-5) {
Tlc.set(a, i);
Tlc.set(b, i);
Tlc.update();
delay(2);
}
Tlc.set(a, 0);
Tlc.set(b, 0);
Tlc.update();
}

void cuatroled(int a, int b, int c, int d) {
for (int i= 1000; i>= 10; i= i-5) {
Tlc.set(a, i);
Tlc.set(b, i);
Tlc.set(c, i);
Tlc.set(d, i);
Tlc.update();
delay(2);
}
Tlc.set(a, 0);
Tlc.set(b, 0);
Tlc.set(c, 0);
Tlc.set(d, 0);
Tlc.update();
}

void loop()
{

void dosled(int a, int b);
void cuatroled(int a, int b, int c, int d);

Tlc.clear();

dosled(7,8);
dosled(6,9);
dosled(5,10);
dosled(4,11);

cuatroled(0,1,2,3);
cuatroled(12,13,14,15);

delay (3000);

}

Por favor, cualquier idea será bien recibida.
Muchas gracias.
Saludos.

Si cambias el nombre de la carpeta donde esta la librería el include no va a llamar a tu librería modificada. Siempre llama a la original. No debes tener dos librerías tlc5940. Usa solo una, le dejas su nombre original y modifica num_tlc y ya esta.
Por otro lado te sobran las declaraciones de las funciones en el loop. En c se hacen pero aquí no son necesarias. Declara las funciones fuera del loop y dentro simplemente las llamas y ya esta. Este código debería dejar los leds del segundo tlc apagados, puesto que el primer led del segundo es el 16. Si se enciende es que algo no esta bien conectado, y a través de SIN le llega señal. Otro tema, el máximo brillo se consigue para valores de set de 4095, por lo que tu set maximo (1000) empieza con solo un 25% del brillo del led y baja rápidamente debido al delay(2) que supone una bajada de brillo a los 2 milisegundos con lo que tus leds solo brillan durante 400 milisegundos (2x1000/5) y además muy poco porque empiezas desde un 25% de su brillo. Es probable que ni lo veas. Pon una foto buena de tu montaje a ver si vemos algo. Y si quieres apagar los leds a la vez, en vez de setearlos a 0 directamente envía Tlc.clear() y se apagan. Acuérdate que cada tic debe llevar su resistencia de iref, que es la qu limita la corriente máxima por led.
Un saludo

YA FUNCIONA !!!
Era la librería. Dentro de un rato te cuento más cosas porque me tengo que ir corriendo a trabajar. Pero desde allí te escribo.
Tan solo era para darte rápido las gracias y decirte que ya funciona con 2 tlc.

Mil gracias.
Un saludo.

Bueno, ya estoy en el trabajo y te escribo para contarte y por si a alguien más le pasa lo mismo, que tenga de dónde tirar.
Resulta que como muy bien me indicaste, el problema venía por que yo estaba cambiando el archivo " tlc_config.h " del sitio equivocado.
Cuando yo me bajé la librería, la guardé en un sitio del disco duro y era esa librería la que estaba modificando. Por lo tanto, como bien has dicho, no sirve.
Hay que cambiar el archivo de la librería donde la guarda arduino. En la página de arduino dice que la ruta es /hardware/libraries/ . Pero en cambio yo la tengo en " \libraries\Tlc5940 ". Es decir, sin meterme en la carpeta de "hardware".
No sé por qué, pero es ahí donde se me instaló la librería.
El caso es que ya funciona perfectamente con dos TLC. Según he modificado la última vez el tlc_config.h de su lugar correcto y he vuelto a compilar, inmediatamente se han apagado los leds del segundo TLC.
Más cosas. Por lo de que los leds solo se encienden hasta 1000. Yo creo que es de lo único que he hecho sabiendo yo lo que hacía, jejeje.
Es que así evitaba tener que andar poniendo resistencias porque como solo quiero ver si funciona la secuencia que quiero, me es suficiente con que se encienda poco.
Es que, de software no tengo ni idea, pero de hardware sí que llevo haciendo cositas muchos años, y también con temas de leds.
No te preocupes, que el efecto sí que se ve. Es una simulación de un disparo para una maqueta.
Ahora probaré a ir ampliando hasta los 5 tlc que necesito y veremos si mi próximo post es para volver a preguntar o decir que finalmente he terminado de montarlo todo y funciona, jejeje.
Por cierto, una última pregunta.
Ya sé que me vas a decir que con el TLC se pueden manejar hasta 16 pwm pero, Qué diferencia hay entre conectar un TLC al arduino para conseguir 16 pwm o crear una matriz con las 6 salidas pwm del arduino y conseguir así hasta 36 salidas ?.
En teoría con el tlc mandas las salidas independientes, pero con el arduino también, no?.Envías una fila y una columa para encender el/los leds que quieras y va subiendo el brillo hasta 256, no?.

Muchas gracias de verdad por toda tu ayuda con este tema que ha sido imprescindible para poder hacerlo funcionar.
Saludo.s

Si haces una matriz con las seis salidas PWM no podrás regular independientemente cada led, es decir si enciendes dos leds de una misma fila PWM tendrán por cojones el mismo brillo. O al menos yo no se cómo hacerlo para que puedas encender dos leds de una misma fila PWM y que cada uno tenga un brillo distinto. En fin me alegro que lo veas más claro.
Un saludo.

Hola. Por trabajo ayer no pude tampoco conectarme.
Bueno, antes de nada, decirte que ya funciona todo perfectamente.
Solo he podido añadir hasta 4TLC porque no tengo aquí el 5º. Pero ya está hecho el código como si estuvieran los 5 y funciona todo a la perfección. Así que, una vez más MIL GRACIAS por la ayuda.
En cuanto a lo de la matriz. Sé lo que quieres decir con que se controlan de forma independiente, pero es que con el tlc también tienes que ponerle a cada uno un bucle "for" para que el brillo vaya aumentando/ descendiendo, no?. De acuerdo que tal vez se pueda hacer con un poco menos de código pero si quieres ponerles a dos led del TLC un brillo distinto, tienes que ponerles un for distinto a cada uno, no?.
No sé. yo creo que es que no le he terminado de sacar al tlc todo su jugo y tengo que probar más cositas porque en realidad no he terminado de conseguir el efecto que quiero. Así que, seguiré con ello.

Por cierto, al hilo de esto y de que no termino de conseguir el efecto que quiero. Como dije en otro de mis mensajes, el circuito que estoy montando es una simulación de disparos que van de más a menos brillo. Entonces, ¿se podría hacer que no tenga que esperar a que un led esté apagado para que otro ya se esté apagando desde su brillo máximo?. Es decir, como si estuvieran disparando cada uno a su ritmo.
A mi se me ocurre que cuando uno de los led que ha empezado en 1000 y esté por 300, entonces otro empieza desde 1000 también, pero tengo que hacer que el que va por 300 siga apagándose mientras lo hace también el de 1000. Pero no sé si es una forma correcta o si me podrías dar alguna idea. Que tus ideas siempre son buenas :wink: .

Muchas gracias.
Saludos.

No necesitas un bucle for para cada led. No has acabado de comprender el funcionamiento del tlc5940. Tu le envías al chip una lista de que leds quieres que encienda y con que brillo y el lo hace. Mientras no actualices la información el mantiene la última configuración recibida. Tu puedes encender uno o 64. Sólo que cada vez que refresques configuración debes indicarle que quieres que haga cada led. Si vas a trabajar con 5 chips y 80 leds (16*5) puedes declarar un array para mapear los valores de brillo de cada led
int greyscale[79];
Donde greyscale[0] será el brillo del led 1 y greyscale[79] será el brillo del led 80. Luego usas un bucle for para asignar valores según alguna función externa y setearlos y después del bucle haces Tlc.update() y en un golpe todos activos. Hay infinidad de posibilidades. Usa tu imaginación.
En cuanto a la matriz que decías si tu usas un canal PWM para una fila de leds y quieres encender más de un led de esa fila , por webs van a tener el mismo brillo, puesto que los dos llevarán la misma señal. Así pues necesitaras algo más de hardware, para multiplexar señales. Por Google puedes encontrar más información buscando "matriz led PWM".
Un saludo

Sí sí. Si ya te digo yo que estoy de acuerdo con que no le he terminado de sacar el jugo al TLC. Pero creo que sé lo que quieres decir ahora con eso de greyscale[0].
O sea que si quiero que el led 1 se vaya apagando desde 1000 y el led 2 lo haga desde 1500. Haría algo parecido a:
for (int i= 1000; i= 0; i--)[0];
for (int i= 1500; i= 0; i--)[1];

Y luego lo iría el Tlc.update();

Algo así, no?.
Espero tener tiempo mañana para probar algo así a ver si consigo hacer lo que me dices.
Es que, una cosa es que pueda ponerle a cada led de forma independiente un brillo fijo. Por ejemplo a un led un brillo 2500 y a otro un brillo 3000. Pero el problema es cuando quieres que ese brillo vaya cambiando en todos, porque tiene que ir pintándolo a la vez con cada uno.
No sé. Ya te digo que probaré a ver qué saco.

Gracias. Un saludo.
Ya te contaré.