Кто быстрее, 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%

ОБНОВЛЕНИЕ 01.01.2020


Мы сделали свою библиотеку для адресной ленты – microLED. Подробнее о ней читайте в этой статье. Библиотека предназначена для работы с адресной лентой на чипах WS2811/2812/2813 на платформе AVR. Ключевые особенности: скорость вывода в 1.5 раза выше других библиотек, занимаемая память в разы меньше благодаря сжатию цветового пространства и оптимальному коду самой библиотеки.

Частота обновления (Гц) от количества светодиодов (сравнение с другими библиотеками), включая минимальное время между отправками (40 мкс). microLED работает в режиме MAX_DATA_SPEED – разогнанном протоколе связи (не работает на WS2811!)

Кол-во диодов FastLED 24-bit NeoPixel 24-bit WS2812 24-bit microLED 24-bit microLED 16-bit microLED 8-bit
8 400 1818 3260 4782 4420 4460
16 400 1264 1751 2663 2437 2462
50 333 554 589 923 840 848
100 220 301 298 472 428 432
500 60 65 61 96 87 88

Занимаемая память (байт) от количества диодов, где LED – количество светодиодов (сравнение с другими библиотеками)

Память FastLED 24-bit NeoPixel 24-bit WS2812 24-bit microLED 24-bit microLED 16-bit microLED 8-bit
Flash 2786 1984 946 306 346 324
SRAM 90+3*LED 40+3*LED 31+3*LED 20+3*LED 20+2*LED 20+1*LED