БИБЛИОТЕКИ
Ни для кого не секрет, что для управления адресными светодиодами с Ардуины существует две популярные библиотеки: 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, Гц |
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 мкс).
Кол-во диодов | 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 |