ЭЛЕКТРОНИКА Troubleshooting arduino + jdy-31 + ws2812 (сгорела arduino)

fr33dman

✩✩✩✩✩✩✩
23 Фев 2024
7
0
Всем привет! Я пока что новенький в этой теме. Прошу у Вас помощи

Пояснение к плате:
INPUT - Клеммник 4 pin
OUTPUT - Клеммник 6 pin
LM2596 - DC-DC
С1-2 — Конденсатор керамический 0.1 мкФ, 25 В
С3 — Конденсатор электролитический 100 мкФ, 63В
С4 — Конденсатор электролитический 1000 мкФ, 25В
С5-7 — Конденсатор электролитический 1 мкФ, 25 В
L1 — Ферритовое кольцо + намотка из медного провода 1мм x 6 витков (примерно 33мГ)
D1-3 — Диоды какие-то
D4 — Диод Шоттки 40В 3А
D5-7 — Стабилитрон BZX55C5V1
R1-3 — Резистор 1.6 кОм (ссылки нет - куплены на рынке)
R4-8 — Резистор 300 Ом 0.25 ватт (ссылки нет - куплены на рынке)
На SL, BL и HZ приходит либо 12V либо 0V (это пины с фишки фонаря стоп сигнала на тачке, сзади стоит реле, которое включает/выключает питание на эти пины)
К OUTPUT подключаются две ленты ws2812 (50 светодиодов в каждой), Vout это питание 5V, S1 - сигнал для первой ленты, S2 - для второй. Во время тестов я запитывался от блока питания компьютера, с разъема molex, плюс кидал только на SL, ну землю соответственно на GND.
Перемычка между A7 и A5 это костыль, не прочитав даташит при разводке платы я, думая что любой аналоговый пин может работать как дижитал, ляпнул сигнал на ленту к A7 который мне показался ближе. Узнав же что A7 является только analog читающим входом мне пришлось костылить перемычку с A5 на A7.

Код:

C:
#define NO_HARDWARE_PIN_SUPPORT
#include <FastLED.h>
#define NUM_LED_SL 56
#define DATA_PIN_SL 15 // First LED
#define NUM_LED_HZ 56
#define DATA_PIN_HZ 19 // Second LED
#define SL_SIGNAL 12 // Side light
#define BL_SIGNAL 8 // Break light
#define HZ_SIGNAL 2 // Hazard

typedef struct Buffer {
    char* arr;
    int size;
    int engaged;
  int lastMessageEndpoint;
    void (*ReadBytes)(struct Buffer*, char*, int);
  bool (*Avaliable)(struct Buffer*);
  char* (*GetMessage)(struct Buffer*);
} buffer;

void buffer_ReadBytes(buffer* self, char* bytes, int bytesSize) {
    if (bytesSize + self->engaged > self->size) {
        int newSize = self->size + bytesSize + 5;
        self->arr = realloc(self->arr, (newSize) * sizeof(char));
        *(self->arr + newSize - 1) = '\0';
        self->size = newSize;
    }
    memcpy((self->arr + self->engaged), bytes, bytesSize);
    self->engaged += bytesSize;
}

bool buffer_Availiable(buffer* self) {
  for (int i = 0; i < self->engaged; i++) {
    if (*(self->arr + i) == ';') {
      self->lastMessageEndpoint = i;
      return true;
    }
  }
  return false;
}

char* buffer_GetMessage(buffer* self) {
  int messageSize = self->lastMessageEndpoint;
  int newSize = self->size - messageSize - 1;

  // create result msg
  char* result = malloc((messageSize + 1) * sizeof(char));
  memcpy(result, self->arr, messageSize);
  *(result + messageSize) = '\0';

  // create new array
  char* newArr = calloc(newSize, sizeof(char));
  memcpy(newArr,(self->arr + messageSize + 1), newSize);
 
  free(self->arr);
  self->arr = newArr;
  self->engaged = self->engaged - self->lastMessageEndpoint - 1;
  return result;
}


buffer NewBuffer(int bufferSize) {
    buffer buff;
    buff.ReadBytes = buffer_ReadBytes;
  buff.Avaliable = buffer_Availiable;
  buff.GetMessage = buffer_GetMessage;
    buff.arr = calloc(bufferSize, sizeof(char));
    *(buff.arr + bufferSize - 1) = '\0';
    buff.size = bufferSize;
    buff.engaged = 0;
    return buff;
}

// define leds
CRGB sl[NUM_LED_SL];
CRGB hz[NUM_LED_HZ];

// define read buffer
buffer buff = NewBuffer(20);

// define colors
int SL_R = 10;
int SL_G = 10;
int SL_B = 10;

int HZ_R = 10;
int HZ_G = 10;
int HZ_B = 10;

void setup() {
  pinMode(SL_SIGNAL, INPUT_PULLUP);
  pinMode(BL_SIGNAL, INPUT_PULLUP);
  pinMode(HZ_SIGNAL, INPUT_PULLUP);
  pinMode(13, OUTPUT);
  FastLED.addLeds<NEOPIXEL, DATA_PIN_SL>(sl, NUM_LED_SL);
  FastLED.addLeds<NEOPIXEL, DATA_PIN_HZ>(hz, NUM_LED_HZ);
  Serial.begin(9600);
}

uint32_t tmr = 0;
int sig_sl = 0;
int sig_bl = 0;
int sig_hz = 0;

void loop() {
  sig_sl = digitalRead(SL_SIGNAL);
  sig_bl = digitalRead(BL_SIGNAL);
  sig_hz = digitalRead(HZ_SIGNAL);

  tmr ++;
  if (tmr >= 100) {
    digitalWrite(13, HIGH);
  }
  if (tmr == 200) {
    digitalWrite(13, LOW);
    tmr = 0;
  }
  // read data from BT
  int avaliableBytes = Serial.available(); // amount bytes in stack
  if (avaliableBytes > 0) {
    char* c = calloc(avaliableBytes + 1, sizeof(char));
    *(c + avaliableBytes - 1) = '\0';
    int storedBytes = Serial.readBytes(c, avaliableBytes);  // read bytes from serial com port from bluetooth module
    buff.ReadBytes(&buff, c, storedBytes);
    free(c);
    if (buff.Avaliable(&buff)) {
      char* msg = buff.GetMessage(&buff);
      Serial.println(msg);
      
      // parse msg
      bool end = false;
      int res_idx = 0;
      int res[4];
      int idx = 0;
      int len = 0;
      while (!end) {
        if (*(msg + idx) == ',' | *(msg + idx) == '\0') {
          char str_int[len + 1];
          memcpy(&str_int, msg + idx - len, len);
          str_int[len] = '\0';
          res[res_idx] = atoi(str_int);
          if (res_idx == 4) {
            end = true;
          }
          res_idx ++;
          len = 0;
        } else {
          len ++;
        }
        idx ++;
      }

      free(msg);
      if (*res == 1) {
        SL_R = *(res + 1);
        SL_G = *(res + 2);
        SL_B = *(res + 3);
      } else if (*res == 2) {
        HZ_R = *(res + 1);
        HZ_G = *(res + 2);
        HZ_B = *(res + 3);
      }
    }
  }
  if (sig_hz == HIGH) { // example usage of signal
    for (int i = 0 ; i < NUM_LED_HZ; i++ ) {
      hz[i].setRGB(HZ_R, HZ_G, HZ_B);
    }
  }
  if (sig_sl == HIGH) { // example usage of signal
    for (int i = 0 ; i < NUM_LED_SL; i++ ) {
      sl[i].setRGB(SL_R, SL_G, SL_B);
    }
  }
  FastLED.show();
}

Ситуация такая: я собрал эту схему на макетной плате, все замечательно работало, проблем не возникало, я развел схему и заказал платы, распаял эту схему на плате, первая версия платы была с bluetooth модулем JDY-31, который я отпаял с его обвязочной платы и припаял напрямую на его место на моей плате - через некоторое время arduino nano сгорела, я понял что скорее всего это было связано с тем что выход 3.3 выход aduino не выдержал потребление модуля и сгорел стабилизатор на arduino (был хлопок, после него светодиоды rx tx и pwr горели постоянно, как я понял это значит что где-то че-то выгорело на ардуине), во второй версии платы я сделал более качественную распайку всей схемы, плюс подключил bluetooth модуль немного по другому: оставил модуль на его подложке (которая как я понял преобразовывает логические уровни + стабилизирует питания для модуля до его 3.3V), я подключил Vin модуля к 5V arduino, GND к GND, tx к rx а rx к tx - в целом какое то время моя сборка работала исправно и стабильно. Я оставил плату на часа полтора поработать - типо стресс тест. Прийдя через это время плата работала, светодиоды горели все тем же цветом без лагов, потом я уже вспомнил, что лента запоминает режим, и arduino мог умереть в это время, а так как лента горела - я бы этого и не понял. В общем - после подключения к блютусу - лента не реагировала на эти действия, я решил нажать reset - никакого результата, выключил БП - после этого БП не включался какое-то время (полагаю что это какой то режим защиты самого блока питания при микро КЗ или еще чем то), после включения БП - arduino уже не работала, подключение по usb и попытка перепрошивки не дала никакого результата: programmer is not responding. Что убивает мою arduino я выяснить не смог, проверил мультиметром все напруги на питаниях - криминала не нашел, на Vout как и должно быть ~5V, на D12 как и должно быть ~5V, на Vin arduino 12V, никаких случайных соединений где их быть не должно - нет. Поэтому я и пришел сюда, в слезах и отчаянии..
Снимок экрана 2024-02-23 в 22.00.44.png
Снимок экрана 2024-02-23 в 21.47.37.pngIMG_3381.pngIMG_3378.pngIMG_3379.pngIMG_3380.png
 
Изменено:

vortigont

★★★★★★✩
24 Апр 2020
1,022
541
Saint-Petersburg, Russia
Не надо на Vinардуины подавать 12 вольт, запитайте её от ЛМки которая уже есть на плате. Зачем зазря перегружать линейный стаб на ардуине то
 
  • Лойс +1
Реакции: dina

fr33dman

✩✩✩✩✩✩✩
23 Фев 2024
7
0
@vortigont, согласен, это было странное мое решение, после того как я заказал платы я уже понял, что можно было подать питание с лмки, в следующей версии платы я именно так и сделаю, но все таки мне кажется, что вряд ли бы это привело к выгоранию ардуины, все таки ж у нее в даташите прописано что она может выдержать питание 12V
 

VictorArx

★★✩✩✩✩✩
22 Мар 2021
525
86
Подавал на ардуинку 12 вольт на пин , нормально работала. Не рекомендуют, но работает.
 

vortigont

★★★★★★✩
24 Апр 2020
1,022
541
Saint-Petersburg, Russia
работать конечно будет, но стаб в этом случае линейный будет рассеивать вдвое больше мошности чем ест сама ардуинка в тепло. Если на ней висит еще что-то кроме ардуинки, плюсуйте еще и ту нагрузку. В зависимости от нагрузки и качества стаба может это проработает долго, а может и нет. В случае пробоя стаба на ардуинку идет 12 вольт и шансов у нее нет.
 
  • Лойс +1
Реакции: PiratFox

fr33dman

✩✩✩✩✩✩✩
23 Фев 2024
7
0
@vortigont, полагаю, что не это сгубило мою ардуину, сейчас только что проверил мультиметром выходы 3.3v и 5v с ардуины, там именно столько вольт сколько и должно быть - то есть стабилизатор в рабочем состоянии. Может я могу записать какие то тесты, чтобы выяснить в чем проблема? я вообще в тупике, у меня нет ни единой идеи почему такое могло произойти, очень хочу исправить проблему, подскажите может где че мне проверить либо может есть подобные схемы (я не нашел но вдруг вы знаете подобные проекты) чтобы подсмотреть вдруг я чего то не учел
 

fr33dman

✩✩✩✩✩✩✩
23 Фев 2024
7
0
@vortigont, UPDATE: похоже что окирпичилась ардуинка сама по себе, я сегодня залил тот же код на другую (НОВУЮ!!!!) ардуинку, если посмотреть у меня есть код 110-117 строчки, я этим пытался сигнализировать себе исполняется ли код, так вот, новую ардуинку я ни к чему не подключал, только по usb к компьютеру, она даже в макетную плату не была вставлена, так вот - не знаю на сколько я отходил, но когда я пришел я заметил что светодиод L не моргает, попробовав перезалить прошивку я словил то же самое - programmer is not responding! В чем может быть проблема????
 

poty

★★★★★★✩
19 Фев 2020
3,229
940
@fr33dman,
1. Однозначно, от 3,3В лучше ничего не питать.
2. Питание на VIN Вы подаёте после диодов (защита?), а вот на входы - напрямую. Не требуется защита? Я не очень понимаю всех этих выкрутасов с тремя резисторами в делителе, конденсатором и обратно включенным диодом (предполагается, что защита здесь?), но простейшие вычисления 12*1,6/(1,6*2+0,3) дают на входах 5,5В.
По отношению к @fr33dman, может, проблемы с напряжением на USB? Или, возможно, диод на плате Ардуино пробило по каким-то причинам? Какую-то индикацию плата показывает (наличие питания, например).
 

fr33dman

✩✩✩✩✩✩✩
23 Фев 2024
7
0
@poty,
1. Ну тут это я уже понял после того как первую ардуину спалил)
2. вот эти 3 диода D2-4 нужны чтобы разделить сигналы SL, BL и HZ на пины D12, D8 и D2, то есть с этих пинов я понимаю куда конкретно мне пришло питание (включил ли водитель габариты, стоп сигналы или поворотники) поэтому там стоят диоды, после диодов там уже идет питание на адресные ленты и ардуину (ну в питании нам в целом то и не важно откуда питание пришло, главное что оно есть). Вот этот выкрутас с 3 резисторами и конденсаторами - это делитель регулятор через стабилитрон с 12V на 5V, обратно включенные диоды (D5-7) - это и есть стабилитроны, конденсаторы (С5-7) там нужен для надежности, R1-3 это кОмные балластные резисторы, R4-6 это защитные резисторы, а резисторы R7-9 нужны для того чтобы не юзать PULLUP резистор самой ардуины (я его сжег на первой версии поэтому решил перестраховаться), по моим вычислениям там на входах получилось 5.1V, на деле там стабильные 4.98-4.99V

Плата показывает индикацию PWR, с помощью небольшого анализатора собранного из светодиода и резистора я протыкал пины, и обнаружил что Tx и Rx пины при их касании загораются (значит плата работает?)
Пробовал перезалить скетч - получил ошибку:
programmer is not responding
Пробовал перепрошивать бутлоадер через USBASP - получил ошибку:
Expected signature for ATmega328P is 1E 95 0F Double check chip, or use -F to override this check
На выходах ардуины 3.3V и 5V - то что и должно быть - значит стаб работает верно

Касаемо новой ардуинки в которую я залил тот же скетч (мое сообщение выше в Сегодня в 14:20) - сейчас мне удалось с какой то попытки перепрошить бутлоадер через USBASP - ардуинка оживилась, но с ней и не было вот этой проблемы Expected signature for ATmega328P is 1E 95 0F
 

poty

★★★★★★✩
19 Фев 2020
3,229
940
Ну, Ваше объяснение меня не особенно убедило, кроме стабилитронов.
на деле там стабильные 4.98-4.99V
Не факт, что это происходит из-за рассматриваемой цепи, на входе есть защитные диоды на VCC.
signature for ATmega328P is 1E 95 0F
Похоже, что изначально на плате был чип 328, а не 328P.
 

fr33dman

✩✩✩✩✩✩✩
23 Фев 2024
7
0
@poty, не совсем понимаю, что именно не убедило, как я и говорил - я в этой сфере новенький, всю эту схему я собрал из кусочков других схем и решений найденных в интернете, поэтому наверняка тут будут ошибки, подскажите пожалуйста где конкретно я сделал не так и как это можно сделать правильно, буду очень благодарен!


Не факт, что это происходит из-за рассматриваемой цепи на входе есть защитные диоды на VCC.
на входе digital пинов? но я тестил и без подключения ардуины, просто на макетке втыкал - получалось ~5 вольт (это я про вот эти делители со стабилитронами внизу платы если что)


Похоже, что изначально на плате был чип 328, а не 328P.
То есть возможно что плата не умерла а умер бутлоадер а я просто не могу ее перепрошить, да? Как то можно это починить? может нужно через другую ардуину или нужен какой софт специальный? Я пробовал только через arduino ide
 

poty

★★★★★★✩
19 Фев 2020
3,229
940
где конкретно я сделал не так и как это можно сделать правильно
Ну, если Вы считаете, что нет проблем, то смысла изменять на данном этапе нет. Если есть возможность, поставьте стабилитроны на 4,7В. Этого более чем достаточно для надёжной фиксации логической единицы и точно не превысит VCC.
Надобность в R4-R6 вообще не понимаю, как и то, что C5-C7, почему-то, отделены этими резисторами. Но, может, была какая-то гениальная идея в этом.
От VIN точно нужно избавляться, питать с выхода LM2596 на +5В платы.
возможно что плата не умерла а умер бутлоадер а я просто не могу ее перепрошить, да?
Я бы разделил вопрос на 2:
1. С какой радости "умер" бутлоадер?
2. Почему нельзя прошить новый бутлоадер?
Я отвечал на второй вопрос. Для прошивки нового бутлоадера нужно правильно настроить параметры процессора в программаторе. Т.е., это должна быть не просто плата Нано. Как это сделать - есть масса описаний в сети.
 

fr33dman

✩✩✩✩✩✩✩
23 Фев 2024
7
0
@poty, У меня получилось оживить ардуину!!

А теперь по порядку. От Vin избавился, перерезал дорожку и кинул питание с лмки на +5V.
Что делают R4-6 и C5-7 - вообще без понятия, я просто нашел вот эту схему в интернете и сделал так же: делитель напряжения стабилитрон.png
С какой радости умер бутлоадер не знаю, но, я просто тыкал burn bootloader в Arduino IDE через USBASP и попытки эдак с сотой без всяких ошибок и логов, вообще без всякой индикации в самой ide вдруг начали моргать Rx и Tx ардуины - и о чудо она ожила и полноценно продолжила выполнять программу.
В чем была проблема? Вообще не знаю, но главное что она больше не появлялась
 

poty

★★★★★★✩
19 Фев 2020
3,229
940
@fr33dman, эта схема решает другую задачу: обеспечение подтяжки (резистор 1кОм), антидребезг (конденсатор 100нФ), защита входа (резистор 220Ом и стабилитрон NZX5V1B). Её можно применить и так, как у Вас, только она сильно избыточна.