Go Down

Topic: New to SK6812 RGBW LED strip... Am I doing this right?? (Read 317 times) previous topic - next topic

Squirt_5432

I've attached my current wiring... I'm using 3 "C" batteries in series as the power supply for the strip and a 9V for the Arduino; I didn't have a 1000μf capacitor so I just put a 470μf 35V cap I had around and a 470μf 10V cap that I salvaged together in parallel to make the equivalent of a 940μf (close enough, right? Does the voltage difference do anything?). I also used a 330 ohm resistor on the data wire (between 300-500 so should be fine, right?).

I uploaded the NeoPixel strandtest example to my Arduino Nano after changing it to work with RGBW and putting in the 144 LEDs that are on the strip I have. I hooked everything up and... nothing. Arduino seems to be working, but I have not seen anything at all so far from the strip. Any ideas? Am I doing something wrong or forgetting something?

Paul__B



The capacitor matter is quite non-critical - if you have a 470μf cap of whatever voltage, just use that on its own.  The most important thing is that it is connected as close as practical to the strip.

A 9 V battery is not a good power source for the Arduino.  Particularly not this one!


If you need to use batteries, a second set of three AA alkalines would do, connected to the 5 V terminal, or a USB "power bank" to the USB port.  Supplying 7.5 or 9 V to the regulator is simply wasting power.

I figure something is wrong in your code.  Did you pick the right pin to match the code or vice versa?  Do SK6812s work with the NeoPixel code?

Squirt_5432

Thanks, I'll try rearranging some stuff with the capacitors. Why is a 9V battery not good? I've used a standard Duracell 9V for years with all my non-USB-powered projects without any problems - my first UNO starter kit even came with a barrel jack -> 9V battery adapter!

As far as code goes, everything I've seen says the SK6812 should work fine with NeoPixels... I haven't changed anything in the example except the LED number and the RGBW. Here it is if you want to look, and yes I put the data wire with resistor on pin 6:
Code: [Select]

#include <Adafruit_NeoPixel.h>
#ifdef __AVR__
  #include <avr/power.h>
#endif

#define PIN 6

// Parameter 1 = number of pixels in strip
// Parameter 2 = Arduino pin number (most are valid)
// Parameter 3 = pixel type flags, add together as needed:
//   NEO_KHZ800  800 KHz bitstream (most NeoPixel products w/WS2812 LEDs)
//   NEO_KHZ400  400 KHz (classic 'v1' (not v2) FLORA pixels, WS2811 drivers)
//   NEO_GRB     Pixels are wired for GRB bitstream (most NeoPixel products)
//   NEO_RGB     Pixels are wired for RGB bitstream (v1 FLORA pixels, not v2)
//   NEO_RGBW    Pixels are wired for RGBW bitstream (NeoPixel RGBW products)
Adafruit_NeoPixel strip = Adafruit_NeoPixel(144, PIN, NEO_RGBW + NEO_KHZ800);

// IMPORTANT: To reduce NeoPixel burnout risk, add 1000 uF capacitor across
// pixel power leads, add 300 - 500 Ohm resistor on first pixel's data input
// and minimize distance between Arduino and first pixel.  Avoid connecting
// on a live circuit...if you must, connect GND first.

void setup() {
  // I put in my own Serial debugging, all of which is running properly
  Serial.begin (9600);
  Serial.println ("Booted successfully");
  // This is for Trinket 5V 16MHz, you can remove these three lines if you are not using a Trinket
  #if defined (__AVR_ATtiny85__)
    if (F_CPU == 16000000) clock_prescale_set(clock_div_1);
  #endif
  // End of trinket special code
  Serial.println ("Got past that weird bit");

  strip.begin();
  Serial.println ("strip begun");
  strip.show(); // Initialize all pixels to 'off'
  Serial.println ("strip shown");
}

void loop() {
  Serial.println ("Loop start");
  // Some example procedures showing how to display to the pixels:
  colorWipe(strip.Color(255, 0, 0), 50); // Red
  Serial.println ("Got past first demo");
  colorWipe(strip.Color(0, 255, 0), 50); // Green
  colorWipe(strip.Color(0, 0, 255), 50); // Blue
  colorWipe(strip.Color(0, 0, 0, 255), 50); // White RGBW
  // Send a theater pixel chase in...
  theaterChase(strip.Color(127, 127, 127), 50); // White
  theaterChase(strip.Color(127, 0, 0), 50); // Red
  theaterChase(strip.Color(0, 0, 127), 50); // Blue

  rainbow(20);
  rainbowCycle(20);
  theaterChaseRainbow(50);
}

// Fill the dots one after the other with a color
void colorWipe(uint32_t c, uint8_t wait) {
  for(uint16_t i=0; i<strip.numPixels(); i++) {
    strip.setPixelColor(i, c);
    strip.show();
    delay(wait);
  }
}

void rainbow(uint8_t wait) {
  uint16_t i, j;

  for(j=0; j<256; j++) {
    for(i=0; i<strip.numPixels(); i++) {
      strip.setPixelColor(i, Wheel((i+j) & 255));
    }
    strip.show();
    delay(wait);
  }
}

// Slightly different, this makes the rainbow equally distributed throughout
void rainbowCycle(uint8_t wait) {
  uint16_t i, j;

  for(j=0; j<256*5; j++) { // 5 cycles of all colors on wheel
    for(i=0; i< strip.numPixels(); i++) {
      strip.setPixelColor(i, Wheel(((i * 256 / strip.numPixels()) + j) & 255));
    }
    strip.show();
    delay(wait);
  }
}

//Theatre-style crawling lights.
void theaterChase(uint32_t c, uint8_t wait) {
  for (int j=0; j<10; j++) {  //do 10 cycles of chasing
    for (int q=0; q < 3; q++) {
      for (uint16_t i=0; i < strip.numPixels(); i=i+3) {
        strip.setPixelColor(i+q, c);    //turn every third pixel on
      }
      strip.show();

      delay(wait);

      for (uint16_t i=0; i < strip.numPixels(); i=i+3) {
        strip.setPixelColor(i+q, 0);        //turn every third pixel off
      }
    }
  }
}

//Theatre-style crawling lights with rainbow effect
void theaterChaseRainbow(uint8_t wait) {
  for (int j=0; j < 256; j++) {     // cycle all 256 colors in the wheel
    for (int q=0; q < 3; q++) {
      for (uint16_t i=0; i < strip.numPixels(); i=i+3) {
        strip.setPixelColor(i+q, Wheel( (i+j) % 255));    //turn every third pixel on
      }
      strip.show();

      delay(wait);

      for (uint16_t i=0; i < strip.numPixels(); i=i+3) {
        strip.setPixelColor(i+q, 0);        //turn every third pixel off
      }
    }
  }
}

// Input a value 0 to 255 to get a color value.
// The colours are a transition r - g - b - back to r.
uint32_t Wheel(byte WheelPos) {
  WheelPos = 255 - WheelPos;
  if(WheelPos < 85) {
    return strip.Color(255 - WheelPos * 3, 0, WheelPos * 3);
  }
  if(WheelPos < 170) {
    WheelPos -= 85;
    return strip.Color(0, WheelPos * 3, 255 - WheelPos * 3);
  }
  WheelPos -= 170;
  return strip.Color(WheelPos * 3, 255 - WheelPos * 3, 0);
}

PaulRB

9V batteries are fine for smoke alarms, but not much else. They have a very high internal resistance, which means that as soon as anything more than a small current is drawn from them, their output voltage drops like a stone.

That adaptor in your kit is not just for 9V batteries. It will fit many holders for 2, 3, 4, 6, even 8 X AA or AAA batteries, giving you lots of choice to suit your project's requirements for voltage and current.

Squirt_5432

Interesting... I'll keep that in mind in the future. In any case, I've rearranged things as shown in the new diagram attached here, all wires are just ~5-12 cm, and I switched to USB power from my computer, and still nothing. Arduino is fine, multimeter reads as expected on everything, even disabled those serial debugging things in case that was messing something up, but still not a single light from the strip.

There is... a SLIGHT possibility I've fried the thing already... I got a bit ahead of myself when I first got it and connected the battery supply with NO capacitor for a few seconds to see if anything would happen (which it didn't). Stupid careless move on my part. Do you think it didn't survive? Or that it may have came defective if everything looks good here?

PaulRB


Paul__B

I've used a standard Duracell 9V for years with all my non-USB-powered projects without any problems
And no doubt, gone through a lot of batteries!

PaulRB

Forgetting the capacitor may have caused problems, but probably not any permanent damage.

Squirt_5432

Huh... Well I'm still getting nothing from the strip so I think I'll try getting an actual wall power supply that can just be plug-and-play for the most part (maybe something like this?), because I realized I did some math wrong and my 144 LEDs could be drawing up to 7 or 8 amps :o If that doesn't work, I'll try exchanging it and start from scratch with a new one now that I have some clue what I'm doing.

Paul__B

I realised I did some math wrong and my 144 LEDs could be drawing up to 7 or 8 amps
Certainly, however for testing purposes, the "C" cells should be just fine if you restrict yourself to generating patterns with only half a dozen or so LEDs lit at most.

On an alternate thread here, Grumpy Mike has mentioned that one critical reason for having that 330 or 470 Ohm resistor is to protect the first pixel if the data voltage - 5 V from the Arduino - is greater than the LED voltage - 4.5 V in your case.  My suggestion was that if you are going to run from batteries, you use the same battery voltage to power the Arduino.

Also, do not turn on the Arduino unless the LEDs are powered and in converse, turn the Arduino off first.

Squirt_5432

if you are going to run from batteries, you use the same battery voltage to power the Arduino.
Noted. I was thinking about consolidating the power sources, especially if I get the wall power source I can just plug it into the Arduino's 5V pin as well as the LEDs and have everything all nicely synced up - this is how I've seen most people do it. Also watched a video where it was powered from a li-po battery and a step-down converter...? Might try that at some point..?

Also, do not turn on the Arduino unless the LEDs are powered and in converse, turn the Arduino off first.
Thanks, I was wondering about that. I think so far I've been powering the LEDs first but also unpowering them first, so I'll be sure to unpower them last (or simultaneously if same power source) in the future.

Go Up