Go Down

Topic: WS2812B Wrong colors (Read 1 time) previous topic - next topic

3615gregoire

Hi!

I am making a project from instructable  Arduino Powered Headdress

Most of the LEDs are not producing the expecting colors. On the picture attached, all LEDs should be green.

There are 88 LEDs : 2 strips of 11 (the eyes), and 1 strip of 66 (the dome)

Only the eyes and 5 groups of 2 in the front are consistently correct, all other ones are consistently the wrong colors.
Since the issue is with the same LEDs with different programs, I concluded that it was a hardware problem, so I swapped a "correct" one with a "wrong" one, and the issue is at the same place, meaning that the LED or the wiring is probably not at fault
Only with 100% white I can get all LEDs the same color.

- I use a mix of  those two products:
Amazon
and
Amazon

- The board is a Arduino pro mini atmega328 p 5V

- Schematics:


- The code (error is the same with all the other codes)
Code: [Select]

// NeoPixel Ring simple sketch (c) 2013 Shae Erisson
// released under the GPLv3 license to match the rest of the AdaFruit NeoPixel library

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

// Which pin on the Arduino is connected to the NeoPixels?
// On a Trinket or Gemma we suggest changing this to 1
#define PIN            6

// How many NeoPixels are attached to the Arduino?
#define NUMPIXELS      88

// When we setup the NeoPixel library, we tell it how many pixels, and which pin to use to send signals.
// Note that for older NeoPixel strips you might need to change the third parameter--see the strandtest
// example for more information on possible values.
Adafruit_NeoPixel pixels = Adafruit_NeoPixel(NUMPIXELS, PIN, NEO_GRB + NEO_KHZ800);

int delayval = 10; // delay for half a second

void setup() {
  
  pixels.begin(); // This initializes the NeoPixel library.
}

void loop() {

  // For a set of NeoPixels the first NeoPixel is 0, second is 1, all the way up to the count of pixels minus one.

  for(int i=0;i<NUMPIXELS;i++){

    // pixels.Color takes RGB values, from 0,0,0 up to 255,255,255
    pixels.setPixelColor(i, pixels.Color(0,150,0)); // Moderately bright green color.

    pixels.show(); // This sends the updated pixel color to the hardware.

    delay(delayval); // Delay for a period of time (in milliseconds).

  }
}


The instructable mentions:
According to the Neopixel online guide it specifies 1000uF capacitors on the live and ground lines and a 300-ohm resistor on the signal lines, I have omitted these in my build by mistake, it has not affected the lights in any way but you may want to add them to be sure on your build.
Can it be the issue?



Any help appreciated!



larryd

Measure the voltage to the strips and controller.
What do you get?


The series 330Ω resistor and the 1000μF capacitor is to protect the neopixels strips from damage.


.
No technical PMs.
The last thing you did is where you should start looking.

3615gregoire

I get  5.7V at the controller, 5.5V at the beginning of the main dome strip, and 5.1V at the middle.


Grumpy_Mike

#3
Dec 03, 2017, 03:18 pm Last Edit: Dec 03, 2017, 04:17 pm by Grumpy_Mike
Quote
it has not affected the lights in any way
Not only is he a normal idiot that many Instructables authors are, he is arrogant as well. Of course it has affected his lights, it is just that he is too stupid to do the tests that show this and probably hasn't got the equipment nor skill to use it.

This shows what the waveform looks like with and without the resistor. See those spikes? Each one is punching a tiny hole in the oxide layer of the LED controller and eventually it will fail.




Their is a lot more to electronics than something appearing to work, that is why we put out good advice only for idiots to think it dosn't matter.

By the way your colour problem has its roots in the fact that some strips need RGB colour order and others need GRB colour order. It looks like the code and your hardware do not match, normally you just need to change your code so they do. But this idiot has wired all three strips to the same pin, so you will have to wire each strip to a different pin and then write the code to output to each strip holding a different pattern ( RGB or GBR ) to suit the hardware you have. He should have done that in the first place so the colours would be more flexible.

Nice photo by the way.

3615gregoire

Thanks for replying Grumpy Mike,

I think your comment is harsh: he has generously shared his build, and specified that he was not a arduino specialist. He is certainly not arrogant, and calling him an idiot is not very nice.

Thanks for explaining why the resistors are necessary, I'll add them.

I think the RGB / GBR is not the issue here: I use 2 different kind of LED, since the color in the program is 0,150,0 I should have Green and Blue lights. instead I get red, white blue and more on both types of LEDs.

Can it be that the data is corrupted because of the lack of resistor / capacitor?

larryd

Do not omit the capacitor!

It absorbs power spikes on power up (without it, you may see LEDs flicker when turned on, causing damage).

Colours could be affected without these if you have damaged the pixels without using them.

Show us a good image of your wiring.


.
No technical PMs.
The last thing you did is where you should start looking.

3615gregoire

Thanks Larryd!

I'll add the resistors and capacitors asap.

I don't think the color issue is due to damaged LEDs since I swapped the 1st and the 2nd ones on the main main dome strip and colors are wrong the same way: it's position-related.

I can't really give a better image of the wiring: it's crammed in a box. What do you need to know that is not on the drawing in the first post?

larryd

Often we find out, too late, that things are not wired as in a schematic.

Did you try the things mentioned by Mike?


.
No technical PMs.
The last thing you did is where you should start looking.

3615gregoire

Quote
Often we find out, too late, that things are not wired as in a schematic.
Fair enough! It will be difficult to check, but we are making a second helmet, we will see if we have the same issue.


Quote
Did you try the things mentioned by Mike?
He mentioned the capacitor and resistor, which I will do as soon as I receive it and using both RGB and BRG LEDs, which can't be the issue.

Grumpy_Mike

#9
Dec 03, 2017, 07:17 pm Last Edit: Dec 03, 2017, 07:23 pm by Grumpy_Mike
Quote
Can it be that the data is corrupted because of the lack of resistor / capacitor?
No.
It is because of what I said in reply #3 in the next but last paragraph.

Quote
he has generously shared his build, and specified that he was not a arduino specialist.
So getting you to build crap is OK because he said he was not a specialist. In my book it is arrogance to even think he can tell anyone how to build any electronics when he knows so little. If he had any decency he would have asked here about his circuit first.

Did you know you need a resistor for each of your LED strips, not one for all three?

larryd

#10
Dec 03, 2017, 07:54 pm Last Edit: Dec 03, 2017, 07:54 pm by larryd
I get  5.7V at the controller, 5.5V at the beginning of the main dome strip, and 5.1V at the middle.
5.7 volts is too high at the controller power pin.


No technical PMs.
The last thing you did is where you should start looking.

3615gregoire


Quote
Did you know you need a resistor for each of your LED strips, not one for all three?
Yes, thank you!


Quote
It is because of what I said in reply #3 in the next but last paragraph.
The RGB / GBR difference between the 2 kind of LEDs? Then how come I get different colors on BOTH types of LEDs?
The only color in the code is 0,150,0, and for both kind of LEDs, I get some green, some blue, some red and some white.

If it was the issue, one kind of LED would be green, the other one blue, or am I missing something? (which could very well be).

3615gregoire

Quote
5.7 volts is too high at the controller power pin.
Thanks, I changed the setting on the buck converter to have 5V.

Grumpy_Mike

Ok then strip it back, just try a code that simply fills one strip with the same colour, green will do. Post that code so we can look at it. And say what number led gives what colour.

Are you using a real Arduino Pro Mini or is it a ripoff clone?

3615gregoire

Quote
Ok then strip it back, just try a code that simply fills one strip with the same colour, green will do. Post that code so we can look at it. And say what number led gives what colour.
I have tried on my girlfriend's helmet, which is the a similar build, and we have temporarily connected only the main dome, so 1 strip, 1 color (0,150,0)  in the program, and we also get multiple colors displayed.


On my helmet:
Strip 1 (eye): 11 LEDs, all green
Strip 2 (eye): 11 LEDs, all green
Strip 3 (main dome) 66 LEDs:
LED:   Color:
0   White
1   Blue
2   Red
3   White
4   Blue
5   Red
6   Green
7   Green
8   Green
9   Green
10   Green
11   Green
12   Green
13   Green
14   Green
15   Green
16   White
17   Blue
18   red
19   White
20   Blue
21   red
22   white
23   blue
24   red
25   white
26   blue
27   red
28   white
29   blue
30   red
31   white
32   blue
33   red
34   white
35   blue
36   red
37   white
38   blue
39   blue
40   white
41   blue
42   red
43   white
44   blue
45   red
46   white
47   blue
48   blue
49   blue
50   blue
51   blue
52   blue
53   blue
54   blue
55   blue
56   blue
57   blue
58   blue
59   blue
60   blue
61   red
62   red
63   red
64   red
65   white


Code is still the simple one, with only one color (other codes tried give unexpected colors, with only 6 to 15 being right):

Code: [Select]
// NeoPixel Ring simple sketch (c) 2013 Shae Erisson
// released under the GPLv3 license to match the rest of the AdaFruit NeoPixel library

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

// Which pin on the Arduino is connected to the NeoPixels?
// On a Trinket or Gemma we suggest changing this to 1
#define PIN            6

// How many NeoPixels are attached to the Arduino?
#define NUMPIXELS      88

// When we setup the NeoPixel library, we tell it how many pixels, and which pin to use to send signals.
// Note that for older NeoPixel strips you might need to change the third parameter--see the strandtest
// example for more information on possible values.
Adafruit_NeoPixel pixels = Adafruit_NeoPixel(NUMPIXELS, PIN, NEO_GRB + NEO_KHZ800);

int delayval = 10; // delay for half a second

void setup() {
  // 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

  pixels.begin(); // This initializes the NeoPixel library.
}

void loop() {

  // For a set of NeoPixels the first NeoPixel is 0, second is 1, all the way up to the count of pixels minus one.

  for(int i=0;i<NUMPIXELS;i++){

    // pixels.Color takes RGB values, from 0,0,0 up to 255,255,255
    pixels.setPixelColor(i, pixels.Color(0,150,0)); // Moderately bright green color.

    pixels.show(); // This sends the updated pixel color to the hardware.

    delay(delayval); // Delay for a period of time (in milliseconds).

  }
}





Quote
Are you using a real Arduino Pro Mini or is it a ripoff clone?
I use generic ones, I have tried with two makes with the same results:
This one and this one.

Thank you for the help!

Go Up