Кто имел дело со светодиодными лентами с пиксельной адресацией (ws2812b)? Помогите!

Тема в разделе "Arduino & Shields", создана пользователем nedfart, 20 мар 2016.

  1. nedfart

    nedfart Нерд

    У меня случилась трагедия. Стол работал хорошо единственное что меня напрягала так это то что иногда раз в 10-20 мин лента на мгновения местами ярко вспыхивало (как вспышка молнии). Я решил поэкспериментировать и заменить резистер 220 ом, который стоял на входе для сигнала от ардуины к ленте (ID), на резистор 1k ом в надежде что это исправит сей дефект. Но похоже что я всё сломал. После того как я подключил резистор на 1k у меня перестало гореть половина ленты, либо сразу при включении, либо она в начале вся работает, но через 2 мин одна половина работает нормально, а вторая замирает, не переливаеться и светиться случайными цветами. Это плохо да? Как вы думаете что вообще могло сломаться?
     
    Последнее редактирование: 30 май 2016
  2. nedfart

    nedfart Нерд

    Нашел светодиод после которого лента зависает или вообще не светиться. У меня есть два предположение-
    1) Что светодиод сломался и не пропускает адресный сигнал через себя дальше. Надо попробовать его заменить.
    2) Что после этого светодиода вся лента вышла из строя, что очень плохо.
     
  3. nedfart

    nedfart Нерд

    Также я проверил другие возможные причины поломки - с микроконтроллеров ардуино всё в порядке, с напряжением и контактами тоже всё норм. У меня две ленты (6м и 4м) подключены оделено друг от друга. И имеют один общий кабель адресации от ардуино. Повредился только вторая половина (5 м) ленты. Наверное когда я другой резистор поставил на 1кОМ, сила тока особенно в конце ленты выросла и ленту мне убила. Такое могло произойти? Если это произошло то наверное вся 2 половина ленты сломалось? Поделитесь мнением. Мне это поможет разобраться в поломке.
     
  4. joman

    joman Гик

    Вряд-ли Вы убили ленту увеличением сопротивления, тем более врядли Вы ее могли убить управляющим сигналом с ардуины.
    Я вижу 2 шанса убить ленту: эксперименты с питанием, что Вы вряд-ли делали или очень мощный (большое напряжение) управляющего сигнала, на что ардуина не способна.
    Если Вы ставите резистор на управляющую ногу, можете смело его убрать, т.к. 5 вольт, которые выдаёт ардуина вполне укладываются в предельные значения ws2812b
     
  5. nedfart

    nedfart Нерд

    я с дуру поменял резистор когда лента вместе с ариаднино была включена. Это могло её убить?
     
  6. Onkel

    Onkel Гуру

    нет. менять можно. А как меняли? Паяльник не пробивает?
     
  7. joman

    joman Гик

    Как я понимаю, менял на макетке (Судя по скриншотам в начале темы). Соответственно паяльник не использовал.
     
  8. Onkel

    Onkel Гуру

    я много с 2812 работал, один раз по недосмотру мне удалось вышибить один чип.
     
  9. joman

    joman Гик

    Вышибить то можно, не вопрос, хотя бы просто кинуть на 220 и он вылетит как миленький :)
    Тут скорее условия. Как я понимаю, управление идёт от ардуины, а от неё, сложно получить больше, чем 5 вольт, к которым данные светодиоды привычны. Соответственно, даже без всякого сопротивления, она будет отлично работать и не умрёт.
     
  10. nedfart

    nedfart Нерд

    Да менял я на макете. Сейчас ленту можно условно разделить на 3 равных куска. Первый кусок работает нормально. Второй кусок светиться но не так как нужно, и не меняет цвета. Третий самый дальний в обще перестал светиться (хотя в начале поломки, 3 кусок вёл себя также как и второй). Я хочу пробовать поменять светодиод после которого лента не работает, может быть он сломался и сигнал после себя не пропускает.
     
  11. joman

    joman Гик

    1. Пока подключите !одну! ленту.
    2. Выложите сюда схему подключения или фото, только такое, чтобы было видно что куда подключено.
    3. Выложите сюда Скетч.
    4. Посчитайте количество светодиодов на ленте.
     
  12. igarka

    igarka Нерд

    Я резистор вообще не ставил. Кстати, попробуйте этот проект http://samopal.pro/snowflake2/
    Все в восхищении.
     
  13. nedfart

    nedfart Нерд

    Итак я решил проблему. На ленте было место, до которого она работала , а после которого лента глючило. В общем я вырезал 3 сегмента в месте глюка, до и после. И впаял новые три сегмента на их место. Лента заработала. Также я убрал резистор на логическом входе (как все советовали). Вспышки на ленте похожие на молнию, о которых я писал выше, вроде бы прекратились. Но борьба продолжается. Есть новая проблема уважаемые знатоки. Теперь лента стала с трудом (заводиться). То есть я её подключаю к цепи, к контролеру, а она не горит. Я её еще раз подключаю опять не горит. И так можно делать несколько десятков раз после чего она заработает.
     
  14. Evgeni

    Evgeni Нерд

    Привет всем, смотрите что я сделал на этой ленте
     

    Вложения:

    Tomasina и igarka нравится это.
  15. sanik

    sanik Гик

    А можно код от второго видео увидеть?
     
  16. smesher

    smesher Нерд

    Привет. Проблема такая-работают только первые 6 светодиодов. Я вырезал неработающий первый диод и припаял ленту -не работает. Сама подсветка реагирует на экран-цвета меняет,только первые 6 диодов. В режиме подсветки работают те же диоды только одним цветом.
    Код:
    Код (Text):

    #include <bitswap.h>
    #include <chipsets.h>
    #include <color.h>
    #include <colorpalettes.h>
    #include <colorutils.h>
    #include <controller.h>
    #include <cpp_compat.h>
    #include <dmx.h>
    #include <FastLED.h>
    #include <fastled_config.h>
    #include <fastled_delay.h>
    #include <fastled_progmem.h>
    #include <fastpin.h>
    #include <fastspi.h>
    #include <fastspi_bitbang.h>
    #include <fastspi_dma.h>
    #include <fastspi_nop.h>
    #include <fastspi_ref.h>
    #include <fastspi_types.h>
    #include <hsv2rgb.h>
    #include <led_sysdefs.h>
    #include <lib8tion.h>
    #include <noise.h>
    #include <pixelset.h>
    #include <pixeltypes.h>
    #include <platforms.h>
    #include <power_mgt.h>

    /*
       Управление лентой на WS2812 с компьютера + динамическая яркость
       Создано не знаю кем, допилил и перевёл AlexGyver http://alexgyver.ru/
       2017
    */
    //----------------------НАСТРОЙКИ-----------------------
    #define NUM_LEDS 92          // число светодиодов в ленте
    #define DI_PIN 13            // пин, к которому подключена лента
    #define OFF_TIME 10          // время (секунд), через которое лента выключится при пропадаании сигнала
    #define CURRENT_LIMIT 2000   // лимит по току в миллиамперах, автоматически управляет яркостью (пожалей свой блок питания!) 0 - выключить лимит

    #define START_FLASHES 1      // проверка цветов при запуске (1 - включить, 0 - выключить)

    #define AUTO_BRIGHT 1        // автоматическая подстройка яркости от уровня внешнего освещения (1 - включить, 0 - выключить)
    #define MAX_BRIGHT 255       // максимальная яркость (0 - 255)
    #define MIN_BRIGHT 50        // минимальная яркость (0 - 255)
    #define BRIGHT_CONSTANT 500  // константа усиления от внешнего света (0 - 1023)
    // чем МЕНЬШЕ константа, тем "резче" будет прибавляться яркость
    #define COEF 0.9             // коэффициент фильтра (0.0 - 1.0), чем больше - тем медленнее меняется яркость
    //----------------------НАСТРОЙКИ-----------------------

    int new_bright, new_bright_f;
    unsigned long bright_timer, off_timer;

    #define serialRate 115200  // скорость связи с ПК
    uint8_t prefix[] = {'A', 'd', 'a'}, hi, lo, chk, i;  // кодовое слово Ada для связи
    #include <FastLED.h>
    CRGB leds[NUM_LEDS];  // создаём ленту
    boolean led_state = true;  // флаг состояния ленты

    void setup()
    {
      FastLED.addLeds<WS2812, DI_PIN, GRB>(leds, NUM_LEDS);  // инициализация светодиодов
      if (CURRENT_LIMIT > 0) FastLED.setMaxPowerInVoltsAndMilliamps(5, CURRENT_LIMIT);

      // вспышки красным синим и зелёным при запуске (можно отключить)
      if (START_FLASHES) {
        LEDS.showColor(CRGB(255, 0, 0));
        delay(500);
        LEDS.showColor(CRGB(0, 255, 0));
        delay(500);
        LEDS.showColor(CRGB(0, 0, 255));
        delay(500);
        LEDS.showColor(CRGB(0, 0, 0));
      }

      Serial.begin(serialRate);
      Serial.print("Ada\n");     // Связаться с компом
    }

    void check_connection() {
      if (led_state) {
        if (millis() - off_timer > (OFF_TIME * 1000)) {
          led_state = false;
          FastLED.clear();
          FastLED.show();
        }
      }
    }

    void loop() {
      if (AUTO_BRIGHT) {                         // если включена адаптивная яркость
        if (millis() - bright_timer > 100) {     // каждые 100 мс
          bright_timer = millis();               // сброить таймер
          new_bright = map(analogRead(6), 0, BRIGHT_CONSTANT, MIN_BRIGHT, MAX_BRIGHT);   // считать показания с фоторезистора, перевести диапазон
          new_bright = constrain(new_bright, MIN_BRIGHT, MAX_BRIGHT);
          new_bright_f = new_bright_f * COEF + new_bright * (1 - COEF);
          LEDS.setBrightness(new_bright_f);      // установить новую яркость
        }
      }
      if (!led_state) led_state = true;
      off_timer = millis();

      for (i = 0; i < sizeof prefix; ++i) {
    waitLoop: while (!Serial.available()) check_connection();;
        if (prefix[i] == Serial.read()) continue;
        i = 0;
        goto waitLoop;
      }

      while (!Serial.available()) check_connection();;
      hi = Serial.read();
      while (!Serial.available()) check_connection();;
      lo = Serial.read();
      while (!Serial.available()) check_connection();;
      chk = Serial.read();
      if (chk != (hi ^ lo ^ 0x55))
      {
        i = 0;
        goto waitLoop;
      }

      memset(leds, 0, NUM_LEDS * sizeof(struct CRGB));
      for (uint8_t i = 0; i < NUM_LEDS; i++) {
        byte r, g, b;
        // читаем данные для каждого цвета
        while (!Serial.available()) check_connection();
        r = Serial.read();
        while (!Serial.available()) check_connection();
        g = Serial.read();
        while (!Serial.available()) check_connection();
        b = Serial.read();
        leds[i].r = r;
        leds[i].g = g;
        leds[i].b = b;
      }
      FastLED.show();  // записываем цвета в ленту
    }
     
    ПАмАгите,умираю уже неделю над проблемой((
    H6xgug-pSZs.jpg y_z8Iflildg.jpg
     
  17. parovoZZ

    parovoZZ Гуру

    ну вырежь седьмой светодиод. Ленты надо покупать в нормальных магазах, а не тащить говно из кетая.
     
  18. smesher

    smesher Нерд

    К сожалению ,в городе не нашел "нормальных" мест, а заказал с Али по лучшим отзывам
     
  19. ostrov

    ostrov Гуру

    В нормальных магазинах то же самое гавно из кетая, но дороже. Сами магазины эти ленты не делают, инфа 100%.
     
  20. ostrov

    ostrov Гуру

    Это куда столько инклюдов? Аж в глазах рябит.