TLC594 leddriver

Aan dit artikel wordt nog gewerkt. Een aantal dingen heb ik nog niet uit geprobeerd.

De bestelde TLC5947 24 kanaals 12 bit PWM led driver met interne oscilator is binnen. Netjes met pinnen, nog niet gesoldeerd. Vind ik fijner want dan kan ik zelf besluiten of de pinnen allemaal 1 richting op moeten of een groep pinnen de andere kant op. De pinnen voor de leds b.v. omlaag en de pinnen voor de verbinding omhoog.
24 kanaals wil zeggen 24 individuele aansluitingen voor een groep van leds of voor 1 led.(0 t/m 23 zijn dus 24 kanalen ;-)
Led driver heeft een externe weerstand nodig (Rref) 3.3K voor 15mA is al gemonteerd, er boven en onder zitten gaatjes om een andere weerstand parrallel er over te solderen. Je kan dus de leds gewoon aansluiten tussen plus en tlc5947. Leds mogen gevoed worden t/m 30V. Bij elk kanaal vind je ook een V+ aansluiting.
De voeding voor de print moet tussen de 3 en 5 V zitten.
Volgens de datasheet min 3V en max.30V en volgens de print afdruk 5 t/m 24V voor de leds en IC voeding 3 of 5Volt.

12 Bits = 4069 stappen PWM regelbaar.
Beveiligd tegen een te hoge temperatuur. Meerdere printen zijn er achter elkaar te schakelen.
Zie datasheet.
Zoals ik al even tussen de haakjes aangaf 24 kanalen vanaf 0 t/m 23. Let daarop als je gaat programeren. Kanaal 5 is dus het 6e kanaal.
Op de print is duidelijk een input aansluiting en een output aansluiting voor de volgende print aan gegeven. Optioneel kan je nog een externe voeding pinnen solderen.
Hier loop ik er tegenop dat mijn RGB leds een gezamelijke min hebben. Ik kan dus niet via deze TLC5947 20 leds gaan aansturen. Je stuurt min aan en geen plus. De min op 1 kanaal laat drie kleuren van de led (die verbonden zijn met de +) gelijk oplichten.
Ik heb nog niet goed begrepen of er een scheiding was tussen de V+ van de print en de (VCC) voltage voor de leds. Voorlopig zou ik het board of 3 of 5 V op V+ zetten en als de de leds van een ogere spanning voorzien moeten worden, die hogere spanning rechtstreeks op de led aansluitenen de Arduino via USB (5V) of externe aansluiting van max 12 V voeding voorzien. Wel een gezameleijke min van print naar hogere led spanning.
Mijn versie en die van Adafruit verschillen van aansluiting. Ik heb geen VCC aansluiting.
Bij Adafruit is een hele duidelijke handleiding te lezen:
TLC5947Arduinog
CLKdigitaal 5inklokken
LATdigitaal 6grijswaarden latch
DINdigitaal 4data in
GNDGNDground/min
V+Vin of 5V5V t/m 24 of 30 volt
/OEEnabledeze hoog maakt alle poorten 0
Volgens Adafruit (zie link) heb je alleen maar de 3 SPI aansluitingen nodig. Data Clock en Latch (ik verwacht ook een gnd). Wil je digitale input aansturen aan iets, gebruik dan een pull up weerstand om een mooie blokvorm te krijgen. De DIN CLK en LAT kunnen ook andere digitale pinnen zijn.
Op blz18 van de datasheet lees ik dat er veel vermogen door het IC kan gaan lopen als alle leds tegelijk aangaan. Dat vermogen levers een noice op en een EMI in het circuit. Hiervoor start de TLC5947 de leds in 4 groepen van 6 kanalen.
0, 4, 8, 12, 16, 20
1, 5, 9, 13, 17, 21
2, 6, 10, 14, 18, 22
3, 7, 11, 15, 19, 23
Zowel het aangaan als het uitgaan gebeurd met een klein tijdsverschil tussen elke groep.
Probleem met beide onderstaande sketchen....ik kreeg foutmeldingen, bleek dat mijn board nog op ESP8266 stond
Ander uitdaging is dat een library net moet passen bij jouw versie IDE. Heb je een nieuwe IDE versie en een oude library of andersom dan kan het niet goed werken.
Maar zonder library moet je heel veel bits in de TLC5947 schuiven en dat kost tijd.
Inmiddels ook wijzer geworden waarom Adafruit een library gebruikt en het 2e script niet. Je moet de data van de Arduino naar de TLC5947 stuk voor stuk over klokken. Dat duurt met de gewone Arduino code elke keer ca 30 seconden. Een flitsende licht show kan je dan vergeten. Daar heeft Adafruit (Adafruit doet een hoop goed werk) een library voor geschreven en het 2e script (sorrie ik vond het op internet en voordat ik de locatie kon noteren ging er iets fout en brak mijn internet af), gebruikt C code om de processor direct aan te sturen. Meer over het direct aansturen van de Atmel processor vind je hier.
Sketch van Adafruit:

#include "Adafruit_TLC5947.h"

#define NUM_TLC5974 1

#define data 3
#define clock 5
#define latch 6

Adafruit_TLC5947 tlc = Adafruit_TLC5947(NUM_TLC5974, clock, data, latch);

void setup() {
tlc.begin();
}

void loop() {
tlc.setPWM(0, 4095);
tlc.write();
}

-----Andere sketch-----------

int latchPin = 7;
int clockPin = 5;
int dataPin = 6;
void setup() {
pinMode(latchPin, OUTPUT);
pinMode(clockPin, OUTPUT);
pinMode(dataPin, OUTPUT);
}
void loop()
{
long a;
for(a = 0; a < 4096; a++)
{
PORTD &= ~(1<<7);//digitalWrite(latchPin,LOW);
shiftOut(a);
PORTD |= (1<<7);//digitalWrite(latchPin,HIGH);
//delayMicroseconds(600);
}
}

// the heart of the program
void shiftOut(long myDataOut)
{
int pinState;
//PORTD &= ~(1<<6);//digitalWrite(dataPin, 0);
//PORTD &= ~(1<<5);//digitalWrite(clockPin, 0);
int outPut;
for (outPut=24; outPut >= 0; outPut--) //24 different outputs
{
for(int val = 11; val >= 0; val--) //12 bit number
{
PORTD &= ~(1<<5);//digitalWrite(clockPin, 0);
if ( myDataOut & (1<<val) )
{
pinState = 1;
}
else
{
pinState= 0;
}

if(pinState == 0)
PORTD &= ~(1<<6);//digitalWrite(dataPin, pinState);
else
{
if(outPut == 0)
PORTD |= (1<<6);
else
PORTD &= ~(1<<6);
}
PORTD |= (1<<5);//digitalWrite(clockPin, 1);
PORTD &= ~(1<<6);//digitalWrite(dataPin, 0);
}
}
//stop shifting
PORTD &= ~(1<<5);//digitalWrite(clockPin, 0);
}
De TLC59711 is een 12 kanaals versie.


Bronnen:
Verbinden met Arduino
Programeren
Adafruit
Librarie
Valatine kaart
1400 leds voor de kerstboom
Max7219 alternatief?