TLC5940 PWM Driver
Think of it like a shift register for Pulse Width Modulation (PWM).
The TLC5940 chip allows you to drive 16 Pulse Width Modulation PWM pins from 1 PWM and 4 control lines. Sort of like a serial-in, parallel out shift register, the TLC5940 gives 16 12-channel PWM outputs using only 5 lines on the microcontroller. We use these chips in our RGB flower necklace, to light up vibrant rainbow color around your sweetheart's clavicle. There is a great library to control these chips available for arduino. Another nice feature of these chips is they allow daisy-chaining. Want to see a tutorial about daisy-chaining TLC5940's? Let us know in the comments!
TLC5940 Driver and Module Video
Video demonstrating 4 TLC5940 modules being driven by an Arduino clone. As the potentiometer spins the speed of the rainbow changes. The second part of the video shows the tree PCB with its 16 LEDs also powered by a TLC5940.
Code
This code uses the TLC5940 arduino library available here. It also uses our arduino color library available here. The code outputs a rainbow to five RGB LEDs hooked up to the TLC5940.
/* LucidTronix HSB RGB necklace * uses TLC5940 chip. for details see: * http://www.lucidtronix.com/tutorials/6 * Control rgb color by specifying * Hue saturation and brightness. * This code shows a rainbow. * It is okay to daiy-chain the chips * just change the NUM_TLCS constant * in the Tlc5940.h file. * This code uses an arduino color library * available here: * http://www.lucidtronix.com/tutorials/19 */ #include "Tlc5940.h" #include "tlc_fades.h" #include "color.h" // how many millis to strobe over all the LEDs TLC_CHANNEL_TYPE channel; Color cur_color(1,1,1); int scope_period = (200 * NUM_TLCS); int led_period = scope_period / (NUM_TLCS * 16); float hue = 0; void setup() { Tlc.init(); } void loop() { hue += 0.001; if ( hue >=1 ) hue = 0; float sat = 1.0; float val = 0.5; cur_color.convert_hcl_to_rgb(hue,sat,val); uint32_t lastMillis = millis(); int cur_val = channel % 3; int color_component = 0; if ( cur_val == 0) color_component = cur_color.red*16; else if ( cur_val == 1) color_component = cur_color.green*16; else if ( cur_val == 2) color_component = cur_color.blue*16; tlc_addFade(channel, // led channel color_component, // start fade value (0-4095) color_component, // end fade value (0-4095) lastMillis + 2, // start millis lastMillis + (uint16_t)scope_period / 4 // end millis ); if (channel++ == NUM_TLCS * 16) { channel = 0; } uint32_t currentMillis; do { currentMillis = millis(); tlc_updateFades(currentMillis); } while (currentMillis - lastMillis <= led_period); }
Parts
Title | Description | # | Cost | Link | Picture |
TLC5940 | IC LED DRIVER PWM CONTROL 32-QFN Value: 3 V ~ 5.5 V | 1 | $3.37 | Link | |
ATMEGA168A-AU | IC MCU AVR 16K FLASH 32TQFP Value: 1.8 V ~ 5.5 V 20MHz | 1 | $2.43 | Link | |
Potentiometer | POT ROTARY, Linear 10K OHM 9MM SNAPIN Value: 10k | 1 | $0.76 | Link | |
RGB LED | LED RGB SMD DIFF 4-PLCC Value: 1.9V Red, 3V Green, 3V Blue | 5 | $0.55 | Link | |
Switch | SWITCH SLIDE DPDT 6VDC 0.3A SMT Value: DPDT | 1 | $0.44 | Link | |
LED SMD | LED 3X1.5MM 568NM Green Clear SMD Value: 2.2V Green | 16 | $0.18 | Link | |
Button 6mm Through Hole | Tactile Switch Through Hole SPST-NO 0.05A 12V Value: 0.05A @ 12VDC | 2 | $0.1 | Link |
Tutorials
Rainbow flower necklace using the TLC5940....
RGB Flashlight, wearable sound art, rainbow lamp....
Wearable digital compass displays the direction in green LEDs....
32 buttons for a fully-functioning hand-held USB keyboard....
Write messages on Liquid Crystal Displays with potentiometers or keyboards....
Control a 120v outlet with a 5V arduino....
Handheld gaming machine, based on the Arduino Leonardo, equipped with joystick, SD card and more....
An arduino library for the MMA8453 Triple Axis Accelerometer...
Comments: