Кто быстрее, 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, Гц
512595554
400747169
300959591
256108110107
200133142137
144182196190
100220283273
60300469452
30400822887
1640012611614
840018133000

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

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

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

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