Всем привет! Я пока что новенький в этой теме. Прошу у Вас помощи
Пояснение к плате:
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.
Код:
Ситуация такая: я собрал эту схему на макетной плате, все замечательно работало, проблем не возникало, я развел схему и заказал платы, распаял эту схему на плате, первая версия платы была с 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, никаких случайных соединений где их быть не должно - нет. Поэтому я и пришел сюда, в слезах и отчаянии..
Пояснение к плате:
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, никаких случайных соединений где их быть не должно - нет. Поэтому я и пришел сюда, в слезах и отчаянии..
Изменено: