Go Down

Topic: LPD8806 RGB LED Strip - Reverse Engineer (with pics) questions/feedback (Read 31 times) previous topic - next topic

citlee

Unfortunately, of the dozens of electronic components (ignoring the mystery bag of semi-random ICs) that are neatly organised, my collection doesn't include a DC power socket, so short of butchering the power supply I have no way to power the strip! I have ordered some from rapidonline.com and they should be here next week.

citlee


I think with this configuration, you will only be able to control colors every 3rd LED rather than every LED as with the strips on Adafruit.  The LEDs on each side of the 8806 appear to be in series with an additional resistor for each to drop voltage further.  The max power dissipation of the 8806 is 600mW so with 6 RGB LEDs, it would be able to supply a maximum of only 6.7mA to each leg of each LED.  This coincides with the 180 ohm resistors for the green and blue legs in the pics.  These resistors would limit current to around 6mA for each color.  This would mean it would not be as bright as the strip on Adafruit that can supply the full rated 20mA to each leg of each LED. 

But this is all based on looking at the photos and my limited knowledge of these things.  You won't really know until you hook it up and find out.  :)  Please post a follow up on this.


More knowledge than me, that's for sure!

The power sockets have arrived, and after killing one (I don't think I could solder to save my life) it's alive. I followed the ladyada.net tutorial for the LPD8806 and it works, with a minor adjustment.

As you surmised, the LEDs are unfortunately controlled in batches of three rather than individually. :(

With this strip there are 10 segments. Each segment has 18 LEDs, but as they're controlled in groups of 3, that means there are essentially 6 pixels/segment. So you need to:
Code: [Select]

LPD8806 strip = LPD8806(60, dataPin, clockPin)

to control the entire length of the strip in the way that you would expect.

So not exactly what I was after (I still don't have the spec sheet), but it's 1/3rd the cost of the adafruit strip, is good enough for what I want, and gives me a relatively easy way to control the colours using the LPD8806 library.

I hope this is of some use to someone!


Cranium

Very useful.  Now let's get some video of the strip.  :)

I did a wheelchair project with the 2m I had and put together some basic sequences...17 in all.  If you'd like any of the animations in the video, let me know....
http://www.youtube.com/watch?v=9zQvEhkedRc


citlee

Sure, post 'em here for everyone to see! Although I don't think they're going to look as good as in your video, as they'll essentially be stretched out three times...

Cranium

Code: [Select]
#include "LPD8806.h"
#include "SPI.h"

#define button 8
#define stripSize 64
int butPush = 0;
int currentMode = 17;
int numModes = 17;

// on Arduino 168/328 thats data = 11, and clock = pin 13
LPD8806 strip = LPD8806(stripSize);

void setup() {
  // Start up the LED strip
  strip.begin();

  // Update the strip, to start they are all 'off'
  strip.show();
//  Serial.begin(9600);
  pinMode(button,INPUT);
}
int micLevel;
int colorLevel;
int numLeds;

void loop() {
  if (butPush){
    if (currentMode++==numModes) currentMode = 3;
    butPush=0;
    while (digitalRead(button)==1){
      //don't do anything else until the button is released
    }
    for (int i=0; i < strip.numPixels(); i++) {
      strip.setPixelColor(i, 0);  // turn all pixels off
    }
    strip.show();
    delay(250);
  }
  modeSelect();
}

void modeSelect(){
  switch (currentMode){
    case 1:
      music(0);  //sound sensitive mode with variable LEDs lit
      break;
    case 2:
      music(1);  //sound sensitive mode with ALL LEDs lit
      break;
    case 3:
      colorChase(strip.Color(127,0,0), 20);  // full brightness red
      colorChase(strip.Color(127,127,0), 20); // orange
      colorChase(strip.Color(0,127,0), 20); // green
      colorChase(strip.Color(0,127,127), 20); // teal
      colorChase(strip.Color(0,0,127), 20); // blue
      colorChase(strip.Color(127,0,127), 20); // violet
      break;
    case 4:
      // fill the entire strip with...
      colorWipe(strip.Color(127,0,0), 40); // red
      colorWipe(strip.Color(0, 127,0), 40); // green
      colorWipe(strip.Color(0,0,127), 40); // blue
      break;
    case 5:
      rainbow(25);
      break;
    case 6:
      rainbowCycle(0);  // make it go through the cycle fairly fast
      break;
    case 7:
      caution(600);  //flash red and blue
      break;
    case 8:
      police(115);  //flash yellow
      break;
    case 9:
      circlinglights(20);  //flash yellow
      break;
    case 10:
      allon();  //all white
      break;
    case 11:
      ran(20);  //random lights
      break;
    case 12:
      ran1(15);  //random lights
      break;
    case 13:
      shiftwhite(100);
      break;
    case 14:
      kit(1);
      break;
    case 15:
      rand2(50);
      break;
    case 16:
      allon1(50); // white flicker
      break;
    case 17:
      xmas(300);
      break;
  }
}
void xmas(int dly){
  int color=0;
  while (butPush==0){
    for (int i=0; i<stripSize; i++){
      if (digitalRead(button)==1) {butPush=1; i=stripSize;}
      if (color==4){
        strip.setPixelColor(i,127,127,127); //white
      }
      else if (color==3){
        strip.setPixelColor(i,127,90,0); //yellow
      }
      else if (color==2){
        strip.setPixelColor(i,0,0,127); //blue
      }
      else if (color==1){
        strip.setPixelColor(i,0,127,0); //green
      }
      else {
        strip.setPixelColor(i,127,0,0); //red
      }
      if (color++==4) color=0;
    }
    if (butPush==0){
      strip.show();
      delay(dly);
    }
  }
}
void allon1(int dly){
  while (digitalRead(button)==0){
    int red = random()%128;
    int green = random()%128;
    int blue = random()%128;
    for (int i = 0; i < stripSize; i++){
     strip.setPixelColor(i, red, green, blue);
   }
   strip.show();
   delay(dly);
    for (int i = 0; i < stripSize; i++){
     strip.setPixelColor(i, 0,0,0);
   }
   strip.show();
   delay(dly);
  }
  butPush = 1;
}
void rand2(int dly){
  //turn on lights one at a time with the same random color
  //ensure that a light is turned on each cycle
  //then turn off the lights 2 at a time
  int lights[stripSize];
  for (int i=0; i<stripSize; i++) lights[i]=0;
  while (digitalRead(button)==0){
    int red = random()%128;
    int green = random()%128;
    int blue = random()%128;
    for (int i = 0; i < stripSize; i++){
      int turnon=0;
      while (turnon==0){
        if (digitalRead(button)==1) {i=stripSize; butPush=1;}
        int x = random()%stripSize;
        if (lights[x]==0){
          turnon=1;
          lights[x]=1;
          strip.setPixelColor(x,red,green,blue);
          strip.show();
        }
      }
    if (butPush==0) delay(dly);
    }
  if (butPush==0)   delay(2000);
    for (int i = 0; i < stripSize; i++){
      int turnoff=1;
      while (turnoff==1){
        if (digitalRead(button)==1) {i=stripSize; butPush=1;}
        int x = random()%stripSize;
        if (lights[x]==1){
          turnoff=0;
          lights[x]=0;
          strip.setPixelColor(x,0,0,0);
          strip.show();
        }
      }
    if (butPush==0) delay(dly);
    }
  }
}
void kit(int dly){
  int lmin=0; int lmax=16; int lx=1; int lcur=lmin;
  int rmin=32; int rmax=48; int rx=1; int rcur=rmin;
  int bmin=50; int bmax=62; int bx=0; int bcur=bmax;
  int fmin=18; int fmax=30; int fx=0; int fcur=fmax;
  int wlev=8;
  int lrticks=6; //number of times to loop through before moving the leds
  int fbticks=8; //number of times to loop through before moving the leds
  int tick=1;
   for (int i=lmin; i<lmax; i++){
     strip.setPixelColor(i,wlev,wlev,wlev);
   }
   for (int i=rmin; i<bmax; i++){
     strip.setPixelColor(i,wlev,wlev,wlev);
   }
  while (digitalRead(button)==0){
     for (int i=0; i<2; i++){
       //calculate brightness level for position.  Closer to the center is brighter
       //turn on 2 leds at a time
//       strip.setPixelColor(lcur+i,127/abs(((lmax-lmin)/2)-lcur),0,0);
//       strip.setPixelColor(rcur+i,127/abs(((rmax-rmin)/2)-(rcur-rmin)),0,0);
//       strip.setPixelColor(bcur+i,127/abs(((bmax-bmin)/2)-(bcur-bmin)),0,0);
//       strip.setPixelColor(fcur+i,127/abs(((fmax-fmin)/2)-(fcur-fmin)),0,0);
       strip.setPixelColor(lcur+i,127,0,0);
       strip.setPixelColor(rcur+i,127,0,0);
       strip.setPixelColor(bcur+i,127,0,0);
       strip.setPixelColor(fcur+i,127,0,0);
     } 
     strip.show();
     delay(dly);
     strip.show();
     if (tick%lrticks==0){ //Do we need to change the position?
       for (int i=0; i<2; i++){
         //turn the 2 leds back to white
         strip.setPixelColor(lcur+i,wlev,wlev,wlev);
         strip.setPixelColor(rcur+i,wlev,wlev,wlev);
       } 
       if (lx==1) lcur++;  //increment or decrement the position
       else lcur--;
       if (lcur>=lmax) lx=0; //Are we at the max?
       if (lcur<=lmin) lx=1; //Are we at the min?
       if (rx==1) rcur++;  //increment or decrement the position
       else rcur--;
       if (rcur>=rmax) rx=0; //Are we at the max?
       if (rcur<=rmin) rx=1; //Are we at the min?
     }
     if (tick%fbticks==0){ //Do we need to change the position?
       for (int i=0; i<2; i++){
         //turn the 2 leds back to white
         strip.setPixelColor(bcur+i,wlev,wlev,wlev);
         strip.setPixelColor(fcur+i,wlev,wlev,wlev);
       } 
       if (bx==1) bcur++;  //increment or decrement the position
       else bcur--;
       if (bcur>=bmax) bx=0; //Are we at the max?
       if (bcur<=bmin) bx=1; //Are we at the min?
       if (fx==1) fcur++;  //increment or decrement the position
       else fcur--;
       if (fcur>=fmax) fx=0; //Are we at the max?
       if (fcur<=fmin) fx=1; //Are we at the min?
     }
     if (tick++==lrticks*fbticks) tick=1;
  }
  butPush = 1;
}
void shiftwhite(int dly){
  for (int o = 0; o < stripSize; o++){
    for (int i = 0; i <stripSize; i=i+5){
      strip.setPixelColor((i+o)%stripSize, 127,127,127); 
//      strip.setPixelColor((i+1+o)%stripSize, 127,127,127); 
      strip.setPixelColor((i+2+o)%stripSize, 0,127,0); 
      strip.setPixelColor((i+3+o)%stripSize, 0,127,0); 
      strip.setPixelColor((i+4+o)%stripSize, 0,127,0); 
      strip.setPixelColor((i+5+o)%stripSize, 0,127,0); 
      if (digitalRead(button)){
        butPush = 1;   //Was the button pushed to change modes?
        i = stripSize;
        o = stripSize;
        }
    }
    strip.show();
    if (butPush == 0) delay(dly);
  }
}


Go Up