Ws2812b библиотека с минимумом функций

Тема в разделе "Микроконтроллеры AVR", создана пользователем issaom, 22 янв 2020.

Метки:
  1. issaom

    issaom Гуру

    Посоветуйте что-нибудь компактное, и максимально-быстрое для работы с лентой на ws2812b. Весь навороченный функционал библиотек типа FastLED library для моего проекта вроде как не нужен. Есть у кого-нибудь (ссылка куда-нибудь) на кусок кода позволяющий управлять лентой с максимальной скоростью....?
     
  2. b707

    b707 Гуру

    "Советские часы "Ракета" - втрое быстрее "Сейко"? :)
    Скорость ленты определяется не кодом, а спецификацией протокола, она не должна быть не больше, не меньше...

    А так, например в аддоне для СТМ32 есть код, работающий с лентой через SPI-DMA, который минимально нагружает контроллер
     
  3. issaom

    issaom Гуру

    т.е. гувер тут типа полную фигню сморозил ;-)
    https://alexgyver.ru/fastled_vs_neopixel/
    "По результатам видно, что FastLED медленнее NeoPixel при любом количестве светодиодов, а LightWS2812 показывает просто безумную скорость на маленьком количестве светодиодов. Если в проекте используется более 100 светодиодов, то без разницы, какую библиотеку использовать. FastLED предлагает кучу удобных инструментов и быструю 8-битную математику, чего нет в NeoPixel, а в LightWS2812 нет вообще ничего вспомогательного. Но если вам важна скорость на небольшом количестве светодиодов (например какой-то POV проект), то однозначно используем LightWS2812 , она показывает в несколько раз лучший результат."
     
  4. b707

    b707 Гуру

    Тут речь идет не о скорости вывода на ленту (она фиксирована) - а о числе обновлений ленты в единицу времени.
    Что касается самих результатов - методика тестирования типично гайверовская, :)
    Для FastLED и NeoPixel он вставляет в код очистку всей ленты перед новым выводом, а для LightWS2812 - выводит новую картинку поверх старой. И удивляется, что LightWS2812 оказывается быстрее :)
    Это кроме того, что у него в FastLED передатся 24 цвет, а в NeoPixel - восьмибитный. И к каждому такту еще добавляется время рестарта Loop

    В общем, я бы этому сравнению не очень доверял. Гайвер как был колхозником, так и остался
     
  5. issaom

    issaom Гуру

    Я так понимаю у данного протокола есть минимальные и максимальные значения длительности нуля и единицы (ведь внешнее тактирование отсутствует), чтобы лента могла глотать биты без ошибок - и вот ту часть которая эти биты шлет можно реализовать по разному..... Или я не прав?
    В любом случае "кода-битопосылателя" в ленту мне было бы достаточно. Остальное я бы прикрутил сам....
     
  6. b707

    b707 Гуру

    там диапазон довольно узкий, сильно не разбежишься, даже в 2 раза разницы не будет. А у Гайвера в тестировании одна библиотека обгоняет другую на порядок...
    см. в любой из перечисленных библиотек
     
  7. parovoZZ

    parovoZZ Гуру

    ссылка такая есть:
    http://forum.amperka.ru/threads/attiny817-ws2812.18338/

    Ещё у меня где-то лежало MSP430 с DMA, но никак не могу найти. Вот на DMA тоже должны быть хорошие скорости. Я говорю про потолок тактирования в 20 МГц.
     
    issaom нравится это.
  8. asam

    asam Гик

    А открытьт исходник той же FasLED и посмотреть "код-битопосылателя" религия не позволяет?
     
    Hacker.b.kul нравится это.
  9. parovoZZ

    parovoZZ Гуру

    Вот здесь изящнее решение
    https://forum.cxem.net/index.php?/b...оморгаем-ещё-разок/&tab=comments#comment-4873
    Исходник смотрел в поисках цветовых профилей. Но так и не понял, как оно создаётся и как из HSL идет пересчет в RGB. То, что видел, говорит о крайне малом количестве градаций( Хотел сдернуть, а дергать нечего.
     
  10. Ariadna-on-Line

    Ariadna-on-Line Гуру

    Это как ? WS2812 не пропустит дальше данные пока не схавает свои 24 бита.
     
  11. b707

    b707 Гуру

    а вы код тестирования Гайвера посмотрите, он по ссылке выложен
     
  12. Ariadna-on-Line

    Ariadna-on-Line Гуру

    В код придется вставить ассемблерный кусок из "nop"-ов, так как на такой скорости язык высокого уровня не прокатит. Посчитайте период такта ядра. Отсчитайте сколько тактов надо для периода 1.25 мкС (800КГц). И генерируйте нопами интервалы примерно 1/3 - 2/3 и 2/3 - 1/3 или 2/5 - 3/5 и 3/5 - 2/5 от периода. Оно не особо критично.
    Есть код на AVR -Бейсике. Примитивно донельзя. Надо - выложу.
     
    Последнее редактирование: 23 янв 2020
  13. Asper Daffy

    Asper Daffy Иксперд

    Блин, да он ещё и мелкий жулик.

    Вот как можно опубликовать таблицу с числами и прямо под ней на голубом глазу писать "FastLED медленнее NeoPixel при любом количестве светодиодов". Всегда поражался таким людям
     
    DetSimen и Daniil нравится это.
  14. issaom

    issaom Гуру

    Объясните тогда кто-нибудь такую весч:
    Заливаем код на FastLED.h
    Код (C++):
    #define NUM_LEDS 96
    #include "FastLED.h"
    #define PIN 2
    CRGB leds[NUM_LEDS];
    void setup() {
      FastLED.addLeds<WS2811, PIN, GRB>(leds, NUM_LEDS).setCorrection( TypicalLEDStrip );
      Serial.begin(9600);
      Serial.println("START");
      for (int i = 0; i < 97; i++) {  
        leds[i] = CRGB(0, 10, 0);    
        for (int j = 1; j < 100; j++) FastLED.show(); // в качестве задержки 100 раз обновляем ленту
      }
      Serial.println("STOP");
    }

    void loop() {

    }
    Он выполняется 42 секунды
    FastLED.PNG

    Заливаем код на Adafruit_NeoPixel.h

    Код (C++):
    #include <Adafruit_NeoPixel.h>
    #define PIN 2 // номер порта к которому подключен модуль
    #define count_led 96 // количество светодиодов
    Adafruit_NeoPixel pixels = Adafruit_NeoPixel(count_led, PIN, NEO_GRB + NEO_KHZ800);
    void setup() {
      pixels.begin();
      pixels.show(); // Устанавливаем все светодиоды в состояние "Выключено"
      Serial.begin(9600);
      Serial.println("START");
      for (int i = 0; i < 97; i++) {
        pixels.setPixelColor(i, pixels.Color(0, 10, 0));
        for (int j = 1; j < 100; j++) pixels.show();  // в качестве задержки 100 раз обновляем ленту
      }
      Serial.println("STOP");
    }
    void loop() {

    }
    Этот код выполняется 30 секунд
    NeoPixel.PNG
    Пример надуманный конечно, но да даже если просто циклом пустить бегущий огонек в ленту - то даже на глаз видно NeoPixel отрисовывает его быстрее чем FastLED. Я конечно не берусь судить качество тестов гувера - но общие выводы он скорее всего сделал верные....
     
  15. asam

    asam Гик

    А найди у себя FastLed библиотеку, открой файл FastLED.cpp, найди там
    Код (C++):
    void CFastLED::show(uint8_t scale) {
        // guard against showing too rapidly
        while(m_nMinMicros && ((micros()-lastshow) < m_nMinMicros));
        lastshow = micros();

        // If we have a function for computing power, use it!
    И закомментируй while(m_nMinMicros && ((micros()-lastshow) < m_nMinMicros));
    А потом перекомпилируй и попробуй свой тест опять.
     
    b707, Daniil, issaom и ещё 1-му нравится это.
  16. issaom

    issaom Гуру

    Спасибо за ценный совет - все стало работать значительно быстрее :)

    Ws2812b_fast.PNG
     
  17. asam

    asam Гик

    То есть примерно так же как и другая библиотека. А все это потому, что как, тут уже говорили, скорость вывода подготовленного массива в/на ленту определяется не библиотекой, а самой лентой. Если библиотка будет делать это быстрее или медлеенее чем надо, то просто ничего не будет работать.

    Разработчики FastLed назвали ее быстрой не за скорость вывода, а потому, что она умеет быстро делать преобразования цветов
     
  18. parovoZZ

    parovoZZ Гуру

    Поэтому всё надо делать параллельно. Тогда скорость обновления будет зависеть исключительно от количества светодиодов в ленте.
     
  19. ИгорьК

    ИгорьК Гуру

    Вот что с этим можно полезного сделать? Модуль есть - мыслей нет никаких!

    upload_2020-1-29_9-6-37.png

    Кто-нибудь знает их применение?
     
  20. parovoZZ

    parovoZZ Гуру

    цветомузыку для тараканов (которые в голове).