ЭЛЕКТРОНИКА Arduino-проект начинает некорректно работать при пайки компонентов.

Lamardo

✩✩✩✩✩✩✩
21 Ноя 2021
23
0
Коллеги, добрый день! Заранее скажу, что новичек в этой теме, но немного интересующийся.

Идея проекта:
Есть двойной стол (один большой, за которым сидят 2 человека, столешница 2.7м длиной). По краю стола (во стороны стены) наклеена адресная светодиодна лента WS2812b, суммарно 78 светодиодов. два энкодера представляют два пульта управления для каждого из пользователей стола. каждый из них управляет своей половиной стедодиодной ленты.

Схема состоит из 2 экнодеров, Светодиоднйо ленты WS2812B на 78 светодиодов, ардуино нано и китайского БП AC/DC 5v 2a.

Где можно нормально рисовать схемы без скачивания сторонних программ я не нашел, поэтому накалякал где получилось.
1723829944524.png
Есть небольшие различия в пинах, но это не существенно. Единственное, что важно - на схеме + от блока питания подключается в путь VIN. Я же подключал к пину 5V ардуино.
DIN ленты - D9;
Энкодер 1:
S1 - D6
S2 - D7
KEY - D8
Энкодер 2:
S1 - D3
S2 - D4
KEY - D5

Проблема:
Я собрал преокт на макетной плате - все работает практически идеально, за исключением некоторых недороботок в коде. Но тут не об этом, с фактической точки зрения - нет никаких нареканий.
Когда я спаиваю эту схему (Для подключения я использую Советский МГШВ 0.2 мм) система начинает работать некорректно.
Как проявляется:
1) включаю одну половину, выключиваю на максимальную яркость.
2) Включаю вторую половину - вся лента тухнет и не включается, пока не нажмешь кнопку RESET на ардуино, или не выключить и заново не включить Блок питания

или, если просто включить одну половину и подождать некоторое время - такой же исход. Лента выключается, и не реагирует на органы управления.

опять же повторюсь, на макетнйо плане все эффекты и обе половины работают отлично на максимальной яркости.

Примечание:
для удобства управления, 1 из энкодеров подключается по проводам длинной в ~2.5-3 метра. Однако, если я просто использую тестовый скрипт,который просто выводит полученный сигнал (нажатие, поворот вправо, влево, нажатие и поворот и тд), то все отрабатывает корректно на дистанции 3м.
2 Энкодер подключается на проводах ~0.8м.
Лента - 30см.

Подскажите пожалуйста, что я делаю не атк и где совершаю ошибки? Выглядит проблема так, как будто проблема в питании, но как исправить - не знаю. Буду благодарен любому совету или догадке. Спасибо.

на всякий случай прикладываю проект. Думаю, проблема не в нем, но может будет полезно:
Проект:
#include <EncButton.h>
#include <FastLED.h>

#define LED_COUNT 78
#define LED_PIN 9

CRGB leds[LED_COUNT];

class EncoderClass {
  public:
    EncButton state;
    String name;
    int brightness = 55;
    int rainbow_speed = 155;
    bool isRainbow = false;
    bool isPressed = false;
    bool isHold = false;
    int first_led;
    int last_led;
    byte counter_static = 0; // Переменная для отслеживания положения энкодера в диапазоне 0-255
    byte counter_dynamic = 0;

    EncoderClass(EncButton _state, String _name, int _first_led, int _last_led) {
      state = _state;
      name = _name;
      first_led = _first_led;
      last_led = _last_led;
    }

    void tick(CRGB leds[], int R, int G, int B) {
      state.tick();

      int temp_brightness = -1;
      int temp_rainbow_speed = -1;

      if (state.right()) {
        if (isPressed) {
          temp_brightness = brightness - 10;
        } else if (isRainbow) {
          temp_rainbow_speed = rainbow_speed - 10;
        }
      }

      if (state.left()) {
        if (isPressed) {
          temp_brightness = brightness + 10;
        } else if (isRainbow) {
          temp_rainbow_speed = rainbow_speed + 10;
        }
      }

      if (state.rightH()) {
        // При прокрутке с зажатием вправо увеличиваем счетчик
        counter_static += 5;
      }

      if (state.leftH()) {
        // При прокрутке с зажатием влево уменьшаем счетчик
        counter_static -= 5;
      }

      // Обновляем счетчик в пределах от 0 до 255
      counter_static = max(0, min(255, counter_static));

      // Преобразуем значение счетчика в оттенок цвета по радуге
      int hue = map(counter_static, 0, 255, 0, 255);

      if (temp_brightness > 0 && temp_brightness < 256) {
        brightness = temp_brightness;
        Serial.print(name);
        Serial.print(".brightness: ");
        Serial.println(brightness);
      }

      if (temp_rainbow_speed > 0 && temp_rainbow_speed < 256) {
        rainbow_speed = temp_rainbow_speed;
        Serial.print(name);
        Serial.print(".rainbow_speed: ");
        Serial.println(rainbow_speed);
      }

      if (state.click()) {
        isPressed = !isPressed;
        Serial.print(name);
        Serial.print(".isPressed: ");
        Serial.println(isPressed);
      }

      if (state.hold()) {
        if (!isHold) {
          isRainbow = !isRainbow;
          isHold = true;
        }
        Serial.print(name);
        Serial.print(".isRainbow: ");
        Serial.println(isRainbow);
      } else {
        isHold = false;
      }

      // Изменяем яркость каждого светодиода на отрезке
      for (int i = first_led; i <= last_led; i++) {
        if (!isPressed) {
          leds[i] = CRGB(0, 0, 0); // Если не нажата кнопка, выключаем светодиоды
        } else if (!isRainbow) {
          leds[i] = CHSV(hue, 255, 255); // Устанавливаем цвет по радуге с учетом яркости
          leds[i].fadeToBlackBy(255 - brightness); // Изменяем яркость светодиода
        }
      }
      
      if (isRainbow) {
        for (int i = first_led; i <= last_led; i++) {         
          if (state.click()) { // Если кнопка нажата, выходим из цикла
            isRainbow = false;
            break;
          }
          leds[i] = CHSV(counter_dynamic + i * 2, 255, 255);
        }
        counter_dynamic++;
        delay(map(rainbow_speed, 5, 255, 0.0, 7.0));
      }

    }
};

EncoderClass encoder2(EncButton(3, 4, 5), "enc1", 0, LED_COUNT / 2);
EncoderClass encoder1(EncButton(6, 7, 8), "enc2", LED_COUNT / 2 + 1, LED_COUNT - 1);

void setup() {
  Serial.begin(9600); // Инициализация последовательной связи
  FastLED.addLeds<WS2812B, LED_PIN, GRB>(leds, LED_COUNT);
}

void loop() {
  encoder1.tick(leds, 255, 255, 100); // Устанавливаем цвет и яркость для первого отрезка
  encoder2.tick(leds, 255, 0, 0); // Устанавливаем цвет и яркость для второго отрезка

  FastLED.show();
}
 
Изменено:

Lamardo

✩✩✩✩✩✩✩
21 Ноя 2021
23
0
@Сотнег, Ну другого источника нет, Система не подключена к ноутбуку. Работает только от БП. Грубо говоря, есть 2 оголенных провода (которые потом покрываются темоусадкой, с замыканием проблем нет). к каждому из них припаяны контакты штекера БП, по 2 контакта от 2 энкодеров, 1 от ленты и идет он в ардуину.
Схемотично выглядит так:
1723839256748.png
 
Изменено:

Сотнег

★★★★★★★
15 Янв 2020
4,261
1,468
@Lamardo,
лучше сфоткайте реальную сборку.

В коде loop() поставьте хотя бы delay(25);
А вообще, FastLED.show(); нужно делать только в случае, если изображение изменилось.
 

Lamardo

✩✩✩✩✩✩✩
21 Ноя 2021
23
0
@Сотнег, на звание пайщика со стажемя не презентую, понимаю, ччто питание сделано очень страшно.
photo_4_2024-08-17_22-13-55.jpgphoto_1_2024-08-17_22-13-55.jpgphoto_2_2024-08-17_22-13-55.jpgphoto_3_2024-08-17_22-13-55.jpg

Переодически (Мне не удалось понять как и почему) лента полностью заливается белым (+- белым, почти все пиксели разного оттенка, но вцелом - очень светлые). И так же все описанные мною выше проблемы.


в консоли ардуино выводится что-то типо:
22:10:15.369 -> enc1.brightness: 95

22:10:15.401 -> enc1.brightness: 105

22:10:15.490 -> enc1.brightness: 115

22:10:15.693 -> .isPressed: 0

22:10:15.693 -> ��}���ڳ�^�c���s�y�����o���~}�l�w�+�}�E������m��v�?y���^��ʣ����������Z�������|��巵����6O�W�1������enc1.isRc1�������Be.isRainbow: 1

22:11:32.096 -> .isRainbow: 1

22:11:32.762 -> enc1.isPressed: 1

22:11:44.747 -> enc1.isPressed: 0

22:11:47.635 -> enc2.isPressed: 1

22:11:48.433 -> enc2.isPressed: 0

22:11:48.975 -> enc2.isPressed: 1

22:11:49.457 -> enc2.isPressed: 0

22:11:51.078 -> enc2.isPressed: 1

22:11:54.296 -> ������������������������������������<����������������<��
 

Сотнег

★★★★★★★
15 Янв 2020
4,261
1,468
@Lamardo,
да, лапшу из чёрных проводов по фотографиям никак не проверить, даже если на них лента появится...
В общем, артефакты ваши похожи на проблему в схеме питания объекта "плата+лента".

Вы код исправили?
 

Lamardo

✩✩✩✩✩✩✩
21 Ноя 2021
23
0
@Сотнег, нет, пока оставил, потому что это скорее косметические доработки. Хотелось бы сначала добиться корректной работы схемы. Сегодня постараюсь сделать немного аккуратнее часть питания. Всегда была сложности в припаивании кучи проводов в 1 место.


Подскажите пожалуйста, эта проблема может связана с проводами, которые я использую, сечения, качества или ещё чего?
Или же это скорее проблема краевой пайки?
Или все сразу?)


Upd: немного изменил схему пайки, на мой взял стало симпотичнее.
IMG_20240818_120614.jpgIMG_20240818_120818.jpg

Однако, проблема осталась, прикрепляю видео.
Яндекс диск
 
Изменено:

Lamardo

✩✩✩✩✩✩✩
21 Ноя 2021
23
0
@Сотнег, Я исправил код ,но появилась другая проблема.
Ардуинку мрут как мухи. Уже 3 померла. Просто перестает отвечать бутлодер и не удается прошить. Есть и другая - прошивается, но вообще не рабоатет скрипт. Прошил на банальный блинк - не рабоатет. Проверил внешним светодиодом пин d13 - ничего.
 

Сотнег

★★★★★★★
15 Янв 2020
4,261
1,468
@Lamardo,
может и сдохнуть диод на плате, если питание у вас течёт через плату на ленту...

Ещё один повод подозревать ошибку в схеме питания.
 

Сотнег

★★★★★★★
15 Янв 2020
4,261
1,468
@Lamardo,
там на VIN стабилизатор стоит, после которого дорожка соединяется с пином 5V.
И если питание у вас уже стабилизированное на 5V, тогда пин менять не надо.

И плату это в любом случае не спасёт, если лента сосёт питание от платы.
 

Lamardo

✩✩✩✩✩✩✩
21 Ноя 2021
23
0
@Сотнег, я, конечно, не презентую на звание электрика, но у меня просто все провода соединяются в точке. Все земли и - от БП просто спаены в 1 узел. Я не представляю как может быть такое, что лента сосет от платы, при этом будучи соединенной в 1 узел с БП
IMG_20240818_140559_474.jpg

(немного непонятно на фото, некорректно написал "+ лента". Имеется ввиду "2 энкодера и лента")
 

Сотнег

★★★★★★★
15 Янв 2020
4,261
1,468
@Lamardo,
никак не может, если у ленты прямой доступ к общему источнику питания, и контакт не отвалился.

Вы код исправили - проблема с лентой не исчезла?
 

Lamardo

✩✩✩✩✩✩✩
21 Ноя 2021
23
0
@Сотнег, я добавил delay и немного неправильный код с fastled. Лента вела себя странно, но думаю, проблема в коде. Потом изменил код и плата перестала прошиваться. Уже пока нет сил снова менять плату, уже последняя осталась :cry:

@Сотнег, пересобрал, переписал код:
C++:
#include <EncButton.h>
#include <FastLED.h>

#define LED_COUNT 78
#define LED_PIN 9

CRGB leds[LED_COUNT];
bool needsUpdate = false; // Флаг для отслеживания необходимости обновления ленты

class EncoderClass {
  public:
    EncButton state;
    String name;
    int brightness = 55;
    int rainbow_speed = 155;
    bool isRainbow = false;
    bool isPressed = false;
    bool isHold = false;
    int first_led;
    int last_led;
    byte counter_static = 0;
    byte counter_dynamic = 0;

    EncoderClass(EncButton _state, String _name, int _first_led, int _last_led) {
      state = _state;
      name = _name;
      first_led = _first_led;
      last_led = _last_led;
    }

    void tick(CRGB leds[], int R, int G, int B) {
      state.tick();

      int temp_brightness = -1;
      int temp_rainbow_speed = -1;

      if (state.right()) {
        if (isPressed) {
          temp_brightness = brightness - 10;
        } else if (isRainbow) {
          temp_rainbow_speed = rainbow_speed - 10;
        }
        needsUpdate = true; // Отмечаем, что нужно обновить ленту
      }

      if (state.left()) {
        if (isPressed) {
          temp_brightness = brightness + 10;
        } else if (isRainbow) {
          temp_rainbow_speed = rainbow_speed + 10;
        }
        needsUpdate = true; // Отмечаем, что нужно обновить ленту
      }

      if (state.rightH()) {
        counter_static += 5;
        needsUpdate = true; // Отмечаем, что нужно обновить ленту
      }

      if (state.leftH()) {
        counter_static -= 5;
        needsUpdate = true; // Отмечаем, что нужно обновить ленту
      }

      counter_static = max(0, min(255, counter_static));
      int hue = map(counter_static, 0, 255, 0, 255);

      if (temp_brightness > 0 && temp_brightness < 256) {
        brightness = temp_brightness;
        Serial.print(name);
        Serial.print(".brightness: ");
        Serial.println(brightness);
        
      }

      if (temp_rainbow_speed > 0 && temp_rainbow_speed < 256) {
        rainbow_speed = temp_rainbow_speed;
        Serial.print(name);
        Serial.print(".rainbow_speed: ");
        Serial.println(rainbow_speed);
      }

      if (state.click()) {
        isPressed = !isPressed;
        Serial.print(name);
        Serial.print(".isPressed: ");
        Serial.println(isPressed);
        needsUpdate = true; // Отмечаем, что нужно обновить ленту
      }

      if (state.hold()) {
        if (!isHold) {
          isRainbow = !isRainbow;
          isHold = true;
        }
        Serial.print(name);
        Serial.print(".isRainbow: ");
        Serial.println(isRainbow);
        needsUpdate = true; // Отмечаем, что нужно обновить ленту
      } else {
        isHold = false;
      }

      for (int i = first_led; i <= last_led; i++) {
        if (!isPressed) {
          leds[i] = CRGB(0, 0, 0); // Если не нажата кнопка, выключаем светодиоды
        } else if (!isRainbow) {
          leds[i] = CHSV(hue, 255, 255); // Устанавливаем цвет по радуге с учетом яркости
          leds[i].fadeToBlackBy(255 - brightness); // Изменяем яркость светодиода
        }
      }

      if (isRainbow) {
        for (int i = first_led; i <= last_led; i++) {
          if (state.click()) { // Если кнопка нажата, выходим из цикла
            isRainbow = false;
            break;
          }
          leds[i] = CHSV(counter_dynamic + i * 2, 255, 255);
        }
        counter_dynamic++;
        delay(map(rainbow_speed, 5, 255, 0.0, 7.0));
      }
    }
};

EncoderClass encoder2(EncButton(3, 4, 5), "enc1", 0, LED_COUNT / 2);
EncoderClass encoder1(EncButton(6, 7, 8), "enc2", LED_COUNT / 2 + 1, LED_COUNT - 1);

void setup() {
  Serial.begin(9600);
  FastLED.addLeds<WS2812B, LED_PIN, GRB>(leds, LED_COUNT);
}

void loop() {
  encoder1.tick(leds, 255, 255, 100);
  encoder2.tick(leds, 255, 0, 0);

  if (needsUpdate) { // Проверяем, нужно ли обновлять ленту
    FastLED.show();
    needsUpdate = false; // Сбрасываем флаг после обновления
  }

   delay(25);
}


Ничем не помогло, все то же самое. + снова умерла плата. Первое время после сборки какая-то из крайных ног (RX0, TX1, или около того)очень сильно грелась, прям обжагающе. Сейчас же плата умерла и они не горячие. И к тому же, плата перестала реалирвоать на кнопку reset (не мигает светодиод при нажатии на кнопку)
 

bort707

★★★★★★✩
21 Сен 2020
3,016
901
снова умерла плата.
@Lamardo,
я почему-то совсем не удивлен
Я в жизни не видел ни одного опытного сборщика, который паял бы провода напрямую к пинам ардуино, как вы. В крайнем случае паяют к отверстиям в плате ВМЕСТО пинов, но так вот чтобы к пинам с каплями припоя - это бред

А вообще, правильный путь - возьмите макетку, напаяйте на нее две гребенки PBS-15 и просто вставьте туда ардуино - будет держатся лучше пайки. Провода припаяйте в соседние дырки макетки и соедините перемычками.
 

Lamardo

✩✩✩✩✩✩✩
21 Ноя 2021
23
0
@bort707, спасибо за совет, но я не до конца понял как это должно выглядеть. У Вас нет примера? Буду благодарен