Help With LED Driver

I have recently been working with TI's TLC59116F LED driver chips. Here is the datasheet... http://www.ti.com/lit/ds/symlink/tlc59116f.pdf. I have been trying to interface it with my Arduino Mega (I2C) with no luck so far. I am using the code found here for driving the chip... http://www.arduino.cc/cgi-bin/yabb2/YaBB.pl?num=1295346037. I have the chip hooked up to +5V.

My main issue is that I have no way to know if the chip is even receiving my I2C communication. I have read through the code and the datasheet and everything seems to line up. Does anyone have any suggestions?

Thanks,

Patrick

(I have attached my code)

TLC59116F.ino (1.48 KB)

Code reproduced below:

#include <Wire.h>

char allModuleAddress = 104;
char module1Address = 96;

void setup()
{
  Serial.begin(9600);
  Serial.println("Serial Initialized");
  Wire.begin();
  Serial.println("Wire Initialized as Master");
  initModule(allModuleAddress);
  Serial.println("InitModules Completed");
}

void loop()
{
  setGlobalBrightness(module1Address,5);
//  Serial.println("Brightness Set");
}

// Initialise all outputs for pwm and global dimming, switch off sleep mode
void initModule(char address)
{
  Wire.beginTransmission(address);
  Wire.write(0x80);
  Wire.write(0x01);
  for (char i=0; i<17; i++) {
    Wire.write(byte(0x00));
  }
  for (char i=0; i<6; i++) {
    Wire.write(0xFF);
  }
  Wire.endTransmission();
}

// Set the global brightness to dim all lit leds
void setGlobalBrightness(char address, char brightness) {
  Wire.beginTransmission(address);
  Wire.write(0x12);
  Wire.write(brightness);
  Wire.endTransmission();
}

// Set the brightness of one output
void setLedBrightness(char address, char lednum, char brightness) {
  Wire.beginTransmission(address);
  Wire.write(0x02 + lednum);
  Wire.write(brightness);
  Wire.endTransmission();
}

// Set the brightness for 3 outputs at once (for rgb leds)
void setGroupBrightness(char address, char groupNum, char brightness_r, char brightness_g, char brightness_b) {
  Wire.beginTransmission(address);
  Wire.write(0xA2 + (3*groupNum));
  Wire.write(brightness_r);
  Wire.write(brightness_g);
  Wire.write(brightness_b);
  Wire.endTransmission();
}

Have you got the right I2C address? Please run the I2C scanner on this page:

Just confirm that it is responding to the expected address (or at all).

I ran the I2C program and it found no devices. Is it possible that I burn out the chip when soldering it onto the breakout board? What other explanations are there for this not working?

Using the wrong pins, not having external pull up resistors.

No luck with the pull up resistors. And I'm pretty sure I'm using the right pins. Its pretty explicit in the datasheet

I think I figured it out...

There was a pin called RESET that was active low that I had to pull high. After that I am getting 3 different devices. Problem solved

There is some good information here http://arduino.cc/forum/index.php/topic,68816.0.html if you follow the links in the post.

This bit of info relates to the pull up resistors specifically

Aside from the obvious (wrong pins and no pull up resistors) Are you sure both ends are operating ath the same voltage either bothe at 5v or both at 3.3 v ?

So I have been able to see the chip using the program mentioned above. However, beyond that, I am having trouble doing anything. I am new to I2C so I have no idea if the code that I am borrowing actually works. Does anyone know if the commands that I am sending are correct?

Datasheet: http://www.ti.com/lit/ds/symlink/tlc59116f.pdf

#include <Wire.h>

char allModuleAddress = 111;
char module1Address = 111;

void setup()
{
  Serial.begin(115200);
  Wire.begin();
  initModule(allModuleAddress);
  pinMode(13,OUTPUT);
}

void loop()
{
  //setLedBrightness(module1Address, 0, 255);
  setGlobalBrightness(module1Address,255);
  digitalWrite(13,HIGH);
}

// Initialise all outputs for pwm and global dimming, switch off sleep mode
void initModule(char address)
{
  Wire.beginTransmission(address);
  Wire.write(0x80);
  Wire.write(0x01);
  for (char i=0; i<17; i++) {
    Wire.write(byte(B00000000));
  }
  for (char i=0; i<6; i++) {
    Wire.write(0xFF);
  }
  Serial.print("SetupErrorCode:");
  Serial.println(Wire.endTransmission());
}

// Set the global brightness to dim all lit leds
void setGlobalBrightness(char address, char brightness) {
  Wire.beginTransmission(address);
  Wire.write(0x12);
  Wire.write(brightness);
  Wire.endTransmission();
}

// Set the brightness of one output
void setLedBrightness(char address, char lednum, char brightness) {
  Wire.beginTransmission(address);
  Wire.write(0x02 + lednum);
  Wire.write(brightness);
  //Serial.print("SetBrightnessErrorCode:");
  //Serial.println(Wire.endTransmission());
}

// Set the brightness for 3 outputs at once (for rgb leds)
void setGroupBrightness(char address, char groupNum, char brightness_r, char brightness_g, char brightness_b) {
  Wire.beginTransmission(address);
  Wire.write(0xA2 + (3*groupNum));
  Wire.write(brightness_r);
  Wire.write(brightness_g);
  Wire.write(brightness_b);
  Wire.endTransmission();
}

Two points:-

  1. Your code does not do anything apart from mess about with the global brightness. You need to turn the individual LEDs on.
  2. How have you wired up the LEDs. The outputs are open drain so the resistor should be connected to the output, then to the cathode of the. LED , finally the anode of the LED should be connected to the +ve supply.

I have connected the LED's up that way and here is the updated code w/o any luck...

#include <Wire.h>

char allModuleAddress = 111;
char module1Address = 111;

void setup()
{
  Serial.begin(115200);
  Wire.begin();
  initModule(allModuleAddress);
  pinMode(13,OUTPUT);
}

void loop()
{
  setLedBrightness(module1Address, 0, 5);
  //setGlobalBrightness(module1Address,255);
  digitalWrite(13,HIGH);
}

// Initialise all outputs for pwm and global dimming, switch off sleep mode
void initModule(char address)
{
  Wire.beginTransmission(address);
  Wire.write(0x80);
  Wire.write(0x01);
  for (char i=0; i<17; i++) {
    Wire.write(byte(B00000000));
  }
  for (char i=0; i<6; i++) {
    Wire.write(0xFF);
  }
  Serial.print("SetupErrorCode:");
  Serial.println(Wire.endTransmission());
}

// Set the global brightness to dim all lit leds
void setGlobalBrightness(char address, char brightness) {
  Wire.beginTransmission(address);
  Wire.write(0x12);
  Wire.write(brightness);
  Wire.endTransmission();
}

// Set the brightness of one output
void setLedBrightness(char address, char lednum, char brightness) {
  Wire.beginTransmission(address);
  Wire.write(0x02 + lednum);
  Wire.write(brightness);
  //Serial.print("SetBrightnessErrorCode:");
  //Serial.println(Wire.endTransmission());
}

// Set the brightness for 3 outputs at once (for rgb leds)
void setGroupBrightness(char address, char groupNum, char brightness_r, char brightness_g, char brightness_b) {
  Wire.beginTransmission(address);
  Wire.write(0xA2 + (3*groupNum));
  Wire.write(brightness_r);
  Wire.write(brightness_g);
  Wire.write(brightness_b);
  Wire.endTransmission();
}

I have tried changing the 5 to 255 and un-commenting the global brightness line with no luck as well.

You haven't got a reset command.
You don't finish the setLEDbrightness function with an end transmission call.
I am also not convinced you are writing to it correctly but it is late here and I am on my iPad so I can't check.

I got everything working. Here is the code...

#include <Wire.h>

char allModuleAddress = 104;
char module1Address = 111;

void setup()
{
  Serial.begin(9600);
  pinMode(13,OUTPUT);
  Serial.println("Serial Initialized");
  Wire.begin();
  Serial.println("Wire Initialized as Master");
  initModule(allModuleAddress);
  Serial.println("InitModules Completed");
  digitalWrite(13,HIGH);
  randomSeed(analogRead(0));
}
boolean a[] = {true,true,true,true,true};
void loop()
{
  int r = int(random(0,5));
  Serial.println(r);
  a[r] = !a[r];
  
  if(a[r]) setLed(r,255);
  else setLed (r,0);
  delay(50);
}

// Initialise all outputs for pwm and global dimming, switch off sleep mode
void initModule(char address)
{
  Wire.beginTransmission(address);
  Wire.write(0x80);
  Wire.write(0x01);
  Wire.write(byte(0x00));
  
  for (char i=0; i<16; i++) {
    Wire.write(byte(0xFF));
  }
  Wire.write(byte(0xFF));
  Wire.write(byte(0x00));
  for (char i=0; i<4; i++) {
    Wire.write(B10101010);
  }
  Wire.endTransmission();
}
// Set the brightness of one output
void setLed(char lednum, char brightness) {
  Wire.beginTransmission(module1Address);
  Wire.write(lednum+2);
  Wire.write(brightness);
  Wire.endTransmission();
}

The next part of my project that I am trying to figure out is how to interface it with this Darlington Transistor Array...http://www.ti.com/lit/ds/symlink/uln2803a.pdf Does anyone know how to do this. I got the array working by itself by attaching GND to GND, nothing to COM and then +5v to the inputs to connect output and ground. The problem is that the LED driver is a sink, so how do I control the darlington array which requires +volts. And what does the common do?

Thanks for the help

Patrick

so how do I control the darlington array which requires +volts.

You connect a pull up resistor from the input of the darlington to +5V, 3K3 should do.