Pages: [1]   Go Down
Author Topic: Arduino code to drive Octobrite LEDs  (Read 922 times)
0 Members and 1 Guest are viewing this topic.
0
Offline Offline
Newbie
*
Karma: 0
Posts: 12
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

I picked up an Octobrite from www.macetech.com at Maker Faire last weekend and finally got around to trying it out. Here's some code that works for a single Octobrite, and should work for multiple daisy-chained together as well.

Quote

 
/*
* Octobrite Test
* 6/8/2009 - yergacheffe@yerga.com
*
* Cycles a continuous color cycle through the 8 leds
*/

// Color channel constants
#define RED 0
#define GREEN 1
#define BLUE 2

// TLC5947 maintains 12 bits of grayscale per LED channel
#define CHANNEL_BITS 12
#define CHANNEL_MAX ( (1<<CHANNEL_BITS) - 1)

// TLC5947 pins
int SIN_PIN = 8;
int SCLK_PIN = 9;
int BLANK_PIN = 10;
int XLAT_PIN = 11;

// Interpolation constants
int lerpsteps = 5;
int stepdelay = 25;

int lerpindex = 0;

// Color table and current/prev color state. The interpolation looks
// best when only one channel is changing during an interpolation
// between a pair of adjacent colors.
int colorCount = 6;
int clutred[6] =   { 1, 1, 0, 0, 0, 1};
int clutgreen[6] = { 0, 0, 0, 1, 1, 1};
int clutblue[6] =  { 0, 1, 1, 1, 0, 0};
int currentColorIndex = 0;
int previousColor[3];
int currentColor[3];

void setup()
{
  // Setup TLC5947 pins
   pinMode(SIN_PIN, OUTPUT);
   pinMode(SCLK_PIN, OUTPUT);
   pinMode(BLANK_PIN, OUTPUT);
   pinMode(XLAT_PIN, OUTPUT);

   // Turn off all LEDs
   digitalWrite(BLANK_PIN, HIGH);
  
   // Default state for clock and data latch
   digitalWrite(SCLK_PIN, LOW);
   digitalWrite(XLAT_PIN, LOW);
      
   // Init comms for debug info
   Serial.begin(9600);
  
   // Reset color state
   currentColor   = clutred[currentColorIndex];
   currentColor = clutgreen[currentColorIndex];
   currentColor  = clutblue[currentColorIndex];
   NextColor();
  
   // And write the colors to the octobrite
   WriteColors();
  
   // Finally enable the LEDs
   digitalWrite(BLANK_PIN, LOW);
}

// Called when we've completed an interpolation between a pair of
// colors. This sets us up to interpolate to the next color in
// the lookup table
void NextColor()
{
  // We've finished interpolating to the current color, so it becomes the
  // previoud color we're interpolating from
  previousColor   = currentColor;  
  previousColor = currentColor;  
  previousColor  = currentColor;
  
  // And pick the next color in the CLUT for the current color
  currentColorIndex = (currentColorIndex + 1) % colorCount;
  lerpindex = 0;
  currentColor   = clutred[currentColorIndex];
  currentColor = clutgreen[currentColorIndex];
  currentColor  = clutblue[currentColorIndex];
}

// Writes out a single 12-bit grayscale channel
void WriteChannel(int value)
{
  int bit;
  
  // Write value, MSB first
  for (bit=11; bit>=0; --bit)
  {
    if (value & (1<<bit))
    {
      digitalWrite(SIN_PIN, HIGH);
    }
    else
    {
      digitalWrite(SIN_PIN, LOW);
    }
    
    // We need to wait 30ns after writing data before clocking it in.
    // Fortunately, our AVR is slow enough that we don't need to
    // do an explicit wait here
    digitalWrite(SCLK_PIN, HIGH);
    digitalWrite(SCLK_PIN, LOW);
  }
}

void WriteColors()
{
  // First calculate the current interpolated color value
  int red   = (CHANNEL_MAX*previousColor*(lerpsteps-lerpindex)   + CHANNEL_MAX*currentColor*lerpindex) / lerpsteps;
  int green = (CHANNEL_MAX*previousColor*(lerpsteps-lerpindex) + CHANNEL_MAX*currentColor*lerpindex) / lerpsteps;
  int blue  = (CHANNEL_MAX*previousColor*(lerpsteps-lerpindex)  + CHANNEL_MAX*currentColor*lerpindex) / lerpsteps;
  
  // Disbaled debug output
  if (false)
  {
    Serial.print("RGB=(");
    Serial.print(red);
    Serial.print(", ");
    Serial.print(green);
    Serial.print(", ");
    Serial.print(blue);
    Serial.println(")");
  }
  
   // Now write the next RGB value, which will shift the colors
   // down along the other LEDs
   WriteChannel(red);
   WriteChannel(green);
   WriteChannel(blue);
  
   // Finally latch in the new color values
   digitalWrite(XLAT_PIN, HIGH);
   delay(1);
   digitalWrite(XLAT_PIN, LOW);
}



void loop()
{
  // Step the interpolation by one frame
  ++lerpindex;
  if (lerpindex > lerpsteps)
  {
    // We finished the interpolation between the current
    // color pair. Set up the next color pair.
    NextColor();
  }
  
  // Update the LEDs
  WriteColors();

  // Throttle the animation
  delay(stepdelay);
}



 
Logged

SF Bay Area
Offline Offline
Edison Member
*
Karma: 10
Posts: 1235
Arduino Ninja
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

That's awesome....to be honest, you probably have more experience running the OctoBrite than I do at this point smiley

It sort of demanded to be designed when I found the TLC5947, and after playing around with the silkscreen it demanded to be produced. But I'm still trying to think of a really good use for it. Maybe some kind of RGB Stribe variant...what ideas do you have?
Logged

Unique RGB LED Modules and Arduino shields: http://www.macetech.com/store

0
Offline Offline
Newbie
*
Karma: 0
Posts: 12
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

You did a great job on that board -- it's a thing of beauty! Everything is so tiny and the silkscreen is very cool.

I'm thinking of using it as a backlight for a picture frame. Hopefully I'll get some time next week to work on it.

The form factor and how light it is might also suggest a POV application...
Logged

0
Offline Offline
Newbie
*
Karma: 0
Posts: 16
Arduino rules
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

I ordered my Octobrite yesterday. While waiting (patiently?) for it to arrive, I have a few newbie questions that the MaceTech documentation page didn't address:

1. I assume the "5V" pad is for +5 volts?
2. Is there a ground connection required for the Octobrite?

I'm new at board level interfacing, and don't want to fry anything on my first try.

Thanks!

-Rich

Logged

SF Bay Area
Offline Offline
Edison Member
*
Karma: 10
Posts: 1235
Arduino Ninja
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Rich,

The documentation at http://docs.macetech.com/doku.php/octobrite should contain everything you need...it discusses the various power supply requirements. I did just add a comment about needing to connect the grounds to the ground pads.
Logged

Unique RGB LED Modules and Arduino shields: http://www.macetech.com/store

0
Offline Offline
Newbie
*
Karma: 0
Posts: 16
Arduino rules
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Ok, thanks!
Logged

0
Offline Offline
Full Member
***
Karma: 0
Posts: 126
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

FYI, here's a video of the code.
Logged

0
Offline Offline
Newbie
*
Karma: 0
Posts: 12
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Nice I love the way those color ramps look.

I altered the code slightly and used it to drive some more subtle color animations for this picture frame:

http://www.atomsandelectrons.com/blog/post/Octobrite-Picture-Frame.aspx

Logged

hyderabad
Offline Offline
Newbie
*
Karma: 0
Posts: 44
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

how can i connect actobrite to arduino ?
Logged

Pages: [1]   Go Up
Jump to: