ayuda con tlc5940

Hola a todos.
Quería pediros ayuda con el tlc5940 para manejar múltiples pwm.
He estado buscando mucha info y me he instalado la librería de la página de arduino para los ejemplos pero necesito encontrar algún ejemplo que empiece desde el principio.
Es decir, algún ejemplo que empiece desde cero a programar el tlc5940 porque no sé por dónde empezar con el para ir luego yo cambiando la potencia de los led, el número de led, etc.
Por más que busco no encuentro nada así. Por favor podrían ayudarme??.

Muchas gracias.

Nadie ?? =( .
Por favor que alguien me diga algo.
Solo quiero saber las instrucciones que hay que poner para habilitar las salidas del TLC5940, como decirle que encienda un led por pwm por varias salidas y demás.
He leido un montón de documentación sobre acerca de cómo se comunica y las patillas que tiene y para qué valen, pero a la hora de escribir el código no sé cómo hacerlo.
Por favor alguien que tenga una pequeña práctica, aunque sea que me la pase para ver cómo puedo empezar con ello.

Muchas gracias.

De verdad nadie ?? =(
Pero por el amor de Dios, que alguien me diga algo que no sé por dónde meterle mano a esto.
Tan solo que alguien me diga cómo programar el tlc5940 o si alguien tiene algún ejemplo.
He estado mirando también un ejemplo que viene en la página al bajarme la librería y demás, pero como mucho del código viene en la propia librería, no puedo modificar nada para poner los led a mi gusto.

Por favooooooooooor :wink:

Gracias.

Es muy sencillo trabajar con este chip.
En void setup{} inicializas el dispositivo con la sentencia

 Tlc.init();

Para activar un pin, escribes Tlc.set(channel, value)

Donde channel es un numero entero entre 0 y 15 que corresponde con el numero de pin que quieres activar y value es un numero entero entre 0 y 4095. Este valor corresponde al nivel de intensidad que quieres en el led: 0 led apagado y 4095 led a tope.
Para enviar el seteo al chip y que ejecute escribes la sentencia

Tlc.update()

Asi que puedes configurar cada salida de forma independiente y despues mandas la configuracion al chip, que se mantiene hasta que vuelves a hacer un update o reseteas los valores configurados mediante la sentencia

Tlc.clear()

Si concatenas mas de un tlc5940, el pin 0 del segundo chip seria el channel 16. Todo esto esta bien explicado y con ejemplos incluso de conexionado en la documentacion que acompaña a la libreria. Te escribiria un programa para hacer la luz del coche fantastico con 16 leds, pero es tan sencillo de hacer que da casi hasta vergüenza.

Un saludo.

Hola donrodrigo. Antes de nada, agradecerte tu respuesta. Casi ya daba por perdidas las esperanzas.
Por motivos de trabajo voy a estar fuera casi todo el mes pero tengo pensado llevarme mi arduino para intentar hacer pruebas. Aunque no aseguro nada porque no creo que tenga mucho tiempo libre.
También quería decirte que cuando alguien no sabe sobre un tema, cualquier información siempre es bien recibida por mucho que al que la da le pueda parecer innecesaria. Así que, por favor, siéntete libre de poner cuantos ejemplos quieras XD porque te aseguro que a mi me vendrán estupendamente.
Por lo que dices de la documentación que acompaña a la librería, yo solamente he encontrado la librería en si pero no la documentación que dices porque siempre que encontraba otros links que hacían referencia a la página de arduino, estos links no funcionaban. Podrías por favor ponerme el link donde esté esa documentación?

Muchas gracias otra vez XD
saludos.

Aqui esta la libreria completa

http://tlc5940arduino.googlecode.com/files/Tlc5940_r014_2.zip
En su interior hay un sketch titulado basicuse.pde, ahí puedes ver como se usa.

Y aquí tienes un completo tutorial
http://code.google.com/p/tlc5940arduino/

Exploralo, que viene muy completo. Trae conexionado incluso para más de un chip. Y muchos ejemplos de aplicaciones.

Un saludo.

Pd. Con las indicaciones que te he dado ya deberías ser capaz de hacer tu mismo el programa. A fin de cuentas se trata de encender y apagar consecutivamente cada canal...

Ok.
De nuevo, muchas gracias por tu ayuda.

Saludos.

Hola.
Estoy teniendo tiempo en mi viaje para ir haciendo pruebas y voy consiguiendo buenos resultados gracias a tus explicaciones.
Quería preguntarte si en el TLC5940 hay posibilidad de crear funciones como si trabajara solo con el arduino.
Me explico:
He puesto los 16 leds en fila y he hecho que se vayan encendiendo abriéndose desde los dos del centro (pines 7 y8) hacia las puntas haciendo un desvanecimiento del brillo. Pero el programa lo he hecho metiendo uno a uno los dos leds. Así que quería crear una función como ya hice en otro programa cuando era solo el arduino sin el tlc5940, y así poder ir llamando a los leds cuando yo quiera en lugar de volver a poner el código para cada led cuando quiera hacer otros efectos. Pero me da problemas al compilar.

Primero declaro las funciones:
void loop()
{
void led7y8();
void led6y9();
void led5y10();
void led4y11();
void led3y12();
void led2y13();
void led1y14();
void led0y15();

Y luego al final del todo creo la función:

void led7y8() {
for (int i= 1000; i>= 10; i= i-5) {
Tlc.set(7, i);
Tlc.set(8, i);
Tlc.update();
delay(2);
if (i<=20) {
delay (100);
Tlc.set(7, 0);
Tlc.set(8, 0);
Tlc.update();

Así luego ya solo tengo que ir llamando a la función led7y8(); , luego llamaría a la función led6y9(); , después a led5y10........

Pero al compilar me sale esto:
prueba1tlc5940.cpp: In function 'void loop()':
prueba1tlc5940:106: error: a function-definition is not allowed here before '{' token
prueba1tlc5940:240: error: expected `}' at end of input

Por favor alguien me puede decir si es que hay que crear la función de forma distinta o si no se pueden crear funciones?.
Muchas gracias.
Un saludo.

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.