Кто быстрее, FastLED или Adafruit NeoPixel?

Ни для кого не секрет, что для управления адресными светодиодами с Ардуины существует две популярные библиотеки: FastLED (независимый разработчик) и NeoPixel (Adafruit). Для одного из проектов мне нужна была максимальная скорость обновления изображения на ленте, и я решил проверить, какая библиотека в итоге обеспечивает максимальную скорость работы. В интернете чёткого ответа на этот вопрос не нашлось.

Сравнить решил очень простым способом: включать светодиоды, затем выключать. И проходя один такой цикл дёргать пин на Ардуине, а затем просто взять и измерить на нём частоту. Можно было программно замерить время, но дело было вечером, и увидеть частоту в герцах на осциллографе было как то проще =)

Итак, скачать библиотеки можно по ссылкам: FastLED и NeoPixel. Далее в ардуину были загружены следующие прошивки:

FAST LED

#define NUM_LEDS 200
#include "FastLED.h"

#define PIN 6
CRGB leds[NUM_LEDS];

void setup() {
  FastLED.addLeds<WS2811, PIN, GRB>(leds, NUM_LEDS).setCorrection( TypicalLEDStrip );
  FastLED.setBrightness(50);
  pinMode(13, OUTPUT);
}

void loop() {
  digitalWrite(13, 1);
  FastLED.clear();
  for (int i = 0; i < NUM_LEDS; i++ ) {
    leds[i] = CRGB::White;
  }
  digitalWrite(13, 0);
  FastLED.show();
}

NEO PIXEL

#define PIN 6
#define NUM_LEDS 16

#include "Adafruit_NeoPixel.h"
Adafruit_NeoPixel strip = Adafruit_NeoPixel(NUM_LEDS, PIN, NEO_GRB + NEO_KHZ800);

void setup() {
  strip.begin();
  strip.setBrightness(50);
  pinMode(13, OUTPUT);
}

void loop() {
  digitalWrite(13, 1);
  strip.clear();
  for (int i = 0; i < NUM_LEDS; i++ ) {
    strip.setPixelColor(i, 0xffffff);
  }
  digitalWrite(13, 0);
  strip.show();
}

Далее я наткнулся на библиотеку LightWS2812 и решил тоже её испытать:

#define NUM_LED 16
#define PIN 6

#include "WS2812.h"

WS2812 LED(NUM_LED); 
cRGB value;

void setup() {
  LED.setOutput(PIN);
  pinMode(13, OUTPUT);
}

void loop() {
  digitalWrite(13, 1);
  for (int i = 0; i < NUM_LED; i++ ) {
    value.b = 0; value.g = 30; value.r = 30;
    LED.set_crgb_at(i, value);
  }  
  digitalWrite(13, 0);
  LED.sync();

  // задержка, по даташиту рекомендуется 50 мкс, но лента 
  // перестаёт стабильно работать ниже 20 мкс. 30, я выбираю тебя!
  delayMicroseconds(30);
}

РЕЗУЛЬТАТЫ ТЕСТА

Число светодиодов FastLED, Гц NeoPixel, Гц Light_WS2812, Гц
512 59 55 54
400 74 71 69
300 95 95 91
256 108 110 107
200 133 142 137
144 182 196 190
100 220 283 273
60 300 469 452
30 400 822 887
16 400 1261 1614
8 400 1813 3000

По результатам видно, что FastLED медленнее NeoPixel при любом количестве светодиодов, а LightWS2812 показывает просто безумную скорость на маленьком количестве светодиодов. Если в проекте используется более 100 светодиодов, то без разницы, какую библиотеку использовать. FastLED предлагает кучу удобных инструментов и быструю 8-битную математику, чего нет в NeoPixel, а в LightWS2812 нет вообще ничего вспомогательного. Но если вам важна скорость на небольшом количестве светодиодов (например какой-то POV проект), то однозначно используем LightWS2812 , она показывает в несколько раз лучший результат.

Что касается объёмов занимаемой памяти:

Память FastLED NeoPixel Light_WS2812
Флэш 12% 8% 5%
Динамическая 25% 1% 1%

2018-02-20T01:34:14+00:00