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

БИБЛИОТЕКИ


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

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

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

FastLED

#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();
}

NeoPixel

#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

Далее я наткнулся на библиотеку 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%

ОБНОВЛЕНИЕ 01.01.2020


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

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

Кол-во диодовFastLED 24-bitNeoPixel 24-bitWS2812 24-bitmicroLED 24-bitmicroLED 16-bitmicroLED 8-bit
840018183260478244204460
1640012641751266324372462
50333554589923840848
100220301298472428432
500606561968788

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

ПамятьFastLED 24-bitNeoPixel 24-bitWS2812 24-bitmicroLED 24-bitmicroLED 16-bitmicroLED 8-bit
Flash27861984946306346324
SRAM90+3*LED40+3*LED31+3*LED20+3*LED20+2*LED20+1*LED
3 1 голос
Рейтинг статьи
Подписаться
Уведомить о
guest

4 комментариев
Старые
Новые Популярные
Межтекстовые Отзывы
Посмотреть все комментарии
Прокрутить вверх