Fewer Neopixels flicker more than lots of 'em

Good day to you all!
I cannot fathom why there are differences in my three almost identical circuits. Some flicker, some do not.

GOAL
I'm looking for a way to make flicker"free" LED dimming and color changing to be filmed by a camera - specifically for a cinema camera running on 50fps. I know that PWM controlled LEDs inevitable leads to flickering (depending on the speed), but i want to be able to dim only 80-100% brightness or less. Even staying on 100% would be somewhat okay.

SETUP
I build three seperate circuits, all of them almost identical.
I have three arduino micros controlling a bunch of Neopixels WS2812, powered by powerbanks. See fritzing below.
The only thing that differs is the amount of LEDs hooked up and the power supplies:

  • one uses 5 single Flora RGB Smart NeoPixels, Version 2 (powered by 2400mAh power bank)
  • one uses a 16 NeoPixel-Ring (powered by 2400mAh power bank)
  • the last uses 38 Neopixels in total, 14 "singles" soldered together with two 12 LED "rings". (powered by 10000mAh power bank)

PROBLEM
The first test I did with the 38 LEDs surprised me, as it did not flicker even on lower brightnesses on camera @ 50fps.
The 5 LEDs and the 16 LEDs versions however, do flicker massively on any brightness, even 100%.

WHAT I DID AND IT DID NOT HELP

  • swapped the non-flickering 38 LEDs with the 5 LED version
  • swapped all the power banks around
  • different wire thicknesses did not matter (did flicker with small breadboard wires and also when soldered with thicker wires)
  • On long cable to the LEDs (after about 30cm) it is recommended to use a 330Ohm resistor on data line. My cables are 10cm and shorter, i tried with and without, still flickers
  • run only 5 LEDs on the 38 LED version
  • run 38 LEDs on the 5 LED version
  • Tried to speed up the PWM signal (see comment in code at start of setup()) but i do not know if i am using this correctly or if this is even the right course of action

CONCLUSION
It seems to be the amount of LEDs matter for flickering LEDs on camera, the more the better.
Not the power banks, not my wiring, not the components.

How is it that fewer, physically attached NeoPixel flicker, and "lots" do not?
Is the flicker effect just not that good visible when 38 LEDs flicker simultaneously?
Or am I missing something else?

Thank you very much.
This is giving me a headache.
f.

#include "Adafruit_NeoPixel.h"
#include <EEPROM.h>
 
#define PIN 9
#define LEDS 16  // 5, 16, 38
 
Adafruit_NeoPixel strip = Adafruit_NeoPixel(LEDS, PIN, NEO_GRB); 

// PINS
const int buttonColor = 3;
const int buttonBrightness = 2;
const int ledPin =  13;

// VARIABLES
int buttonStateColor = 0;
int buttonStateBrightness = 0;

// COLORS
const int colorMax = 8;
uint32_t colors[colorMax] = {
  strip.Color(255, 255, 255), // "White"
  strip.Color(255, 0, 0),     // Red
  strip.Color(255, 120, 0),   // Orange
  strip.Color(0, 255, 0),     // Green
  strip.Color(0, 255, 120),   // light green
  strip.Color(0, 0, 255),     // Blue
  strip.Color(0, 120, 255),   // Baby blue
  strip.Color(255, 0, 255),   // Pink
};
int colorIndex = 0;  // colorMax-1;

// BRIGHTNESSES
const int brightnessMax = 8;
int brightness[brightnessMax] = {60,100,125,150,175,200,225,255};
int brightnessIndex = 0; // brightnessMax-1;
 
void setup() {
  // Change pwm frequency of pwm pin 9 and 10 .....from 490 Hz to 32kHz
  // TCCR1B = TCCR1B & B11111000 | B00000001;

  // Get data from EEPROM
  // Get Color index
  colorIndex = EEPROM.read(1);
  // Get Brightness index
  brightnessIndex = EEPROM.read(2);

  strip.begin();
  strip.fill(colors[colorIndex], 0, LEDS);
  strip.setBrightness(brightness[brightnessIndex]);
  strip.show();
  Serial.begin(115200);

  // initialize the LED pin as an output:
  pinMode(ledPin, OUTPUT);

  // initialize pushbuttons pin as an input:
  pinMode(buttonColor, INPUT);
  pinMode(buttonBrightness, INPUT);
}
 
void loop() {
  // read the state of the pushbutton value:
  buttonStateColor = digitalRead(buttonColor);
  buttonStateBrightness = digitalRead(buttonBrightness);

  // COLORS
  if (buttonStateColor == HIGH) {
    if(colorIndex < colorMax-1) {
      colorIndex++;
    } else {
      colorIndex = 0;
    }
    EEPROM.write(1, colorIndex);
    Serial.print("Color:\t");
    Serial.println(colors[colorIndex]);
    strip.fill(colors[colorIndex], 0, LEDS);
    strip.show();
    delay(300);
  }

  // BRIGHTNESSES
  if (buttonStateBrightness == HIGH) {
    if(brightnessIndex < brightnessMax-1) {
      brightnessIndex++;
    } else {
      brightnessIndex = 0;
    }
    EEPROM.write(2, brightnessIndex);
    Serial.print("Brightness:\t");
    Serial.println(brightness[brightnessIndex]);
    strip.setBrightness(brightness[brightnessIndex]);
    strip.show();
    delay(300);
  }

  delay(50);
}

Some led lights for the mains flicker and some don't.
Some computer monitors flicker and some don't.
It is about the design of the circuit. Cheap devices don't care and a good brand might reduce the flicker.
I think that it is not important how many or at what percentage you get flicker or not. If you are lucky the frequencies do not interfere.

Do you really need all the RGB colors ? I would dim the leds in a analog way, without PWM.

hi koepel, thank you for your reply.

It is about the design of the circuit.

I'm building it "from scratch" and this is why I am asking.

Cheap devices don't care and a good brand might reduce the flicker.

I'm building the device and do not buy it as a package. As far as I know, these NeoPixel LEDs can be driven by different PWM speeds.

I think that it is not important how many or at what percentage you get flicker or not.

I thought so as well, but apparently, it does make a difference somehow, and I do not understand why.

If you are lucky the frequencies do not interfere.

It might be not about luck, but because of math :wink:
The camera can be adjusted a bit for such things (for filming old CRT monitors or flickering light tubes) but i want to make everything possible to avoid that, so there's less problems during the shooting.

Do you really need all the RGB colors ? I would dim the leds in a analog way, without PWM.

Yeah I do need all the colors on the RGB spectrum..

WS281x chips are basically 3 channel PWM dimmers that dim an RGB-led, where with a WS2812, the chip is incorporated in the LED. There is no way to really influence the flickering with any external hardware. The differences you see are probably caused by a different amount of 'after-glow'.
There may be slight differences per LED regarding PWM frequency, but it should be near 1Khz.
I have never actually seen them flicker on camera, but i have seen a wave effect caused by the small difference in offset of the chips in the signal chain.

It is possible to do so, but you would need a circuit that converts PWM to a true analog voltage to drive a power transistor. With the transistor 'half-open' you will need to dissipate more heat.

Thank you as well, deva. As I now understand: the PWM that controls the brightness are generated in the WS2812 LED itself, which is only 400hz.

the project is a bit too far already to completely change to "true analog" voltage. sadly i tested first with the strangely working 38-LED-version.
I worked with a buck converter in the past for single color LED strips that reached 20KHz, which was perfect for my application (even slow-motion shots). but yes, it generates lots of heat, is heavy and quite big.

I guess I try with another kind of LED strip with WS2813 LEDs, which have a 2KHz refresh rate. Makes sense right?
They should be compatible with my software and the hardware in place.

That makes sense yes.

1 Like

5v on the Arduino Vin pin doesn’t cut the mustard.

You need at least 7v.

Feed the 5v power bank into the Arduino 5v pin.

Disconnect power bank when uploading code.

1 Like

Oh dang, it does? Thank you very much. Will do this.

Why!

A Nano is shown. :+1:

2021-06-01_15-38-43

OK, so it's a Micro, not a Pro Micro. Shares the UNO problem. :roll_eyes:

So in case anyone is wondering, I tested the new WS2813 LEDs and they are better in regards to the flickering. but not perfect. Still flickers on ~60% brightness (above is all right) when filmed with 50fps @ 1/250 shutter, but good enough for this project. 50fps @ 1/50 shutter works.

Software and hardware had to be changed a little.

Thank you all, and cheers.