Взываю о помощи, я никак не могу понять почему ничего не получается. Делаю наипростейшую машинку с наипростейшей схемой. у меня уже какой раз возникают просто неизвестные проблемы. в том числе и сейчас. я подключил все абсолютно правильно и точно, все перепроверил, поставил на тестировку. вроде все моторчики крутились как надо, нужное напряжение подавалось, и тут просто без дыма, без ничего, моторчики начинают работать, что то начинает кипеть и микросхемы взрываются с хлопком. вот тут даже видно на картинках как отлетели куски пластика. я вообще не понимаю как такое возможно.напряжение в цепи около 8 вольт. черный понижающий преобразователь до 5 вольт питает ардуино, 8 вольт от батарей идут напрямую в драйвера. все подключал точно и корректно. за отсуствием шим портов в достаточном количестве, комбинировал программный и аналоговый шимы. прикреплю сюда код
#include <SoftPWM.h>
const int IN1 = 2;
const int IN2 = 3;
const int IN3 = 4;
const int IN4 = 5;
const int IN5 = 6;
const int IN6 = 7;
const int IN7 = 9;
const int IN8 = 10;
int i = 0;
const bool hardwarePWMPins[] = {
false, false, false, true, false, true, true, false, false,
true, true, true, false, false, false, false, false, false, false, false
};
const int Engine1[2] = { IN1, IN2 };
const int Engine2[2] = { IN3, IN4 };
const int Engine3[2] = { IN5, IN6 };
const int Engine4[2] = { IN7, IN8 };
// const int Pin_Ox_1 = A2;
// const int Pin_Oy_1 = A3;
// const int Pin_Ox_2 = A4;
// const int Pin_Oy_2 = A5;
// const int Pin_Ox_3 = A4;
// const int Pin_Oy_3 = A5;
// const int Pin_Button = A1;
// int sensorValue = 0;
bool isHardwarePWM(int pin) {
if (pin >= 0 && pin < sizeof(hardwarePWMPins)) {
return hardwarePWMPins[pin];
}
return false;
}
void setup() {
SoftPWMBegin();
SoftPWMSet(IN1, 0);
SoftPWMSet(IN3, 0);
SoftPWMSet(IN6, 0);
pinMode(IN2, OUTPUT);
pinMode(IN4, OUTPUT);
pinMode(IN5, OUTPUT);
pinMode(IN7, OUTPUT);
pinMode(IN8, OUTPUT);
Serial.begin(9600);
Serial.println("System started");
}
void loop() {
static unsigned long timer = 0;
if (millis() - timer >= 5000) {
timer = millis();
Serial.print("Action ");
Serial.print(i);
Serial.print(": ");
switch (i) {
case 0:
EngineControl(-255, Engine1);
Serial.println("Engine 1 ➔ FORWARD 100%");
break;
case 1:
EngineControl(127, Engine1);
Serial.println("Engine 1 ➔ BACKWARD 50%");
break;
case 2:
EngineControl(0, Engine1);
Serial.println("Engine 1 ➔ STOPPED");
break;
// Тестирование мотора 2
case 3:
EngineControl(-255, Engine2);
Serial.println("Engine 2 ➔ FORWARD 100%");
break;
case 4:
EngineControl(127, Engine2);
Serial.println("Engine 2 ➔ BACKWARD 50%");
break;
case 5:
EngineControl(0, Engine2);
Serial.println("Engine 2 ➔ STOPPED");
break;
// Тестирование мотора 3
case 6:
EngineControl(-255, Engine3);
Serial.println("Engine 3 ➔ FORWARD 100%");
break;
case 7:
EngineControl(127, Engine3);
Serial.println("Engine 3 ➔ BACKWARD 50%");
break;
case 8:
EngineControl(0, Engine3);
Serial.println("Engine 3 ➔ STOPPED");
break;
// Тестирование мотора 4
case 9:
EngineControl(-255, Engine4);
Serial.println("Engine 4 ➔ FORWARD 100%");
break;
case 10:
EngineControl(127, Engine4);
Serial.println("Engine 4 ➔ BACKWARD 50%");
break;
case 11:
EngineControl(0, Engine4);
Serial.println("Engine 4 ➔ STOPPED");
break;
case 12:
// Все моторы вперед 100%
EngineControl(-255, Engine1);
EngineControl(-255, Engine2);
EngineControl(-255, Engine3);
EngineControl(-255, Engine4);
Serial.println("All engines ➔ FORWARD 100%");
break;
case 13:
// Все моторы назад 50%
EngineControl(127, Engine1);
EngineControl(127, Engine2);
EngineControl(127, Engine3);
EngineControl(127, Engine4);
Serial.println("All engines ➔ BACKWARD 50%");
break;
case 14:
// Левая сторона вперед, правая назад (поворот)
EngineControl(-200, Engine1);
EngineControl(-200, Engine3);
EngineControl(200, Engine2);
EngineControl(200, Engine4);
Serial.println("Left side FORWARD, Right side BACKWARD (Rotation)");
break;
case 15:
// Разнонаправленное движение (имитация танка)
EngineControl(-200, Engine1);
EngineControl(200, Engine2);
EngineControl(200, Engine3);
EngineControl(-200, Engine4);
Serial.println("Tank-style rotation");
break;
case 16:
// Диагональное движение (если моторы расположены по углам)
EngineControl(-150, Engine1);
EngineControl(0, Engine2);
EngineControl(0, Engine3);
EngineControl(-150, Engine4);
Serial.println("Diagonal movement (forward-left)");
break;
case 17:
// Волновое движение (последовательный запуск)
EngineControl(-200, Engine1);
EngineControl(0, Engine2);
EngineControl(0, Engine3);
EngineControl(0, Engine4);
Serial.println("Wave movement - Engine 1 active");
break;
case 18:
EngineControl(0, Engine1);
EngineControl(-200, Engine2);
EngineControl(0, Engine3);
EngineControl(0, Engine4);
Serial.println("Wave movement - Engine 2 active");
break;
case 19:
EngineControl(0, Engine1);
EngineControl(0, Engine2);
EngineControl(-200, Engine3);
EngineControl(0, Engine4);
Serial.println("Wave movement - Engine 3 active");
break;
case 20:
EngineControl(0, Engine1);
EngineControl(0, Engine2);
EngineControl(0, Engine3);
EngineControl(-200, Engine4);
Serial.println("Wave movement - Engine 4 active");
break;
case 21:
// Все моторы остановлены
EngineControl(0, Engine1);
EngineControl(0, Engine2);
EngineControl(0, Engine3);
EngineControl(0, Engine4);
Serial.println("All engines ➔ STOPPED");
break;
}
i = (i >= 21) ? 0 : i + 1;
}
// int Ox_1 = DeadZone(map(analogRead(Pin_Ox_1), 0, 1023, -255, 255), 5);
// int Oy_1 = DeadZone(map(analogRead(Pin_Oy_1), 0, 1023, -255, 255), 5);
// int Ox_2 = DeadZone(map(analogRead(Pin_Ox_2), 0, 1023, -255, 255), 5);
// int Oy_2 = DeadZone(map(analogRead(Pin_Oy_2), 0, 1023, -255, 255), 5);
// int Ox_3 = DeadZone(map(analogRead(Pin_Ox_3), 0, 1023, -255, 255), 5);
// int Oy_3 = DeadZone(map(analogRead(Pin_Oy_3), 0, 1023, -255, 255), 5);
}
// int DeadZone(int Number, int DeadZone) {
// if (abs(Number) <= DeadZone) {
// return 0;
// }
// if (Number > 0) {
// return map(Number, DeadZone, 255, 0, 255);
// } else {
// return map(Number, -DeadZone, -255, 0, -255);
// }
// }
static void EngineControl(int ThrottleValue, const int Engine[2]) {
int IN1 = Engine[0];
int IN2 = Engine[1];
if (ThrottleValue > 0) {
if (isHardwarePWM(IN1)) {
analogWrite(IN1, ThrottleValue);
} else {
SoftPWMSet(IN1, ThrottleValue);
}
if (isHardwarePWM(IN2)) {
analogWrite(IN2, 0);
} else {
SoftPWMSet(IN2, 0);
}
return;
}
if (ThrottleValue < 0) {
if (isHardwarePWM(IN2)) {
analogWrite(IN2, abs(ThrottleValue));
} else {
SoftPWMSet(IN2, abs(ThrottleValue));
}
if (isHardwarePWM(IN1)) {
analogWrite(IN1, 0);
} else {
SoftPWMSet(IN1, 0);
}
return;
}
if (ThrottleValue == 0) {
if (isHardwarePWM(IN1)) {
analogWrite(IN1, 0);
} else {
SoftPWMSet(IN1, 0);
}
if (isHardwarePWM(IN2)) {
analogWrite(IN2, 0);
} else {
SoftPWMSet(IN2, 0);
}
return;
}
}



Заранее благодарю за любую помощь!
#include <SoftPWM.h>
const int IN1 = 2;
const int IN2 = 3;
const int IN3 = 4;
const int IN4 = 5;
const int IN5 = 6;
const int IN6 = 7;
const int IN7 = 9;
const int IN8 = 10;
int i = 0;
const bool hardwarePWMPins[] = {
false, false, false, true, false, true, true, false, false,
true, true, true, false, false, false, false, false, false, false, false
};
const int Engine1[2] = { IN1, IN2 };
const int Engine2[2] = { IN3, IN4 };
const int Engine3[2] = { IN5, IN6 };
const int Engine4[2] = { IN7, IN8 };
// const int Pin_Ox_1 = A2;
// const int Pin_Oy_1 = A3;
// const int Pin_Ox_2 = A4;
// const int Pin_Oy_2 = A5;
// const int Pin_Ox_3 = A4;
// const int Pin_Oy_3 = A5;
// const int Pin_Button = A1;
// int sensorValue = 0;
bool isHardwarePWM(int pin) {
if (pin >= 0 && pin < sizeof(hardwarePWMPins)) {
return hardwarePWMPins[pin];
}
return false;
}
void setup() {
SoftPWMBegin();
SoftPWMSet(IN1, 0);
SoftPWMSet(IN3, 0);
SoftPWMSet(IN6, 0);
pinMode(IN2, OUTPUT);
pinMode(IN4, OUTPUT);
pinMode(IN5, OUTPUT);
pinMode(IN7, OUTPUT);
pinMode(IN8, OUTPUT);
Serial.begin(9600);
Serial.println("System started");
}
void loop() {
static unsigned long timer = 0;
if (millis() - timer >= 5000) {
timer = millis();
Serial.print("Action ");
Serial.print(i);
Serial.print(": ");
switch (i) {
case 0:
EngineControl(-255, Engine1);
Serial.println("Engine 1 ➔ FORWARD 100%");
break;
case 1:
EngineControl(127, Engine1);
Serial.println("Engine 1 ➔ BACKWARD 50%");
break;
case 2:
EngineControl(0, Engine1);
Serial.println("Engine 1 ➔ STOPPED");
break;
// Тестирование мотора 2
case 3:
EngineControl(-255, Engine2);
Serial.println("Engine 2 ➔ FORWARD 100%");
break;
case 4:
EngineControl(127, Engine2);
Serial.println("Engine 2 ➔ BACKWARD 50%");
break;
case 5:
EngineControl(0, Engine2);
Serial.println("Engine 2 ➔ STOPPED");
break;
// Тестирование мотора 3
case 6:
EngineControl(-255, Engine3);
Serial.println("Engine 3 ➔ FORWARD 100%");
break;
case 7:
EngineControl(127, Engine3);
Serial.println("Engine 3 ➔ BACKWARD 50%");
break;
case 8:
EngineControl(0, Engine3);
Serial.println("Engine 3 ➔ STOPPED");
break;
// Тестирование мотора 4
case 9:
EngineControl(-255, Engine4);
Serial.println("Engine 4 ➔ FORWARD 100%");
break;
case 10:
EngineControl(127, Engine4);
Serial.println("Engine 4 ➔ BACKWARD 50%");
break;
case 11:
EngineControl(0, Engine4);
Serial.println("Engine 4 ➔ STOPPED");
break;
case 12:
// Все моторы вперед 100%
EngineControl(-255, Engine1);
EngineControl(-255, Engine2);
EngineControl(-255, Engine3);
EngineControl(-255, Engine4);
Serial.println("All engines ➔ FORWARD 100%");
break;
case 13:
// Все моторы назад 50%
EngineControl(127, Engine1);
EngineControl(127, Engine2);
EngineControl(127, Engine3);
EngineControl(127, Engine4);
Serial.println("All engines ➔ BACKWARD 50%");
break;
case 14:
// Левая сторона вперед, правая назад (поворот)
EngineControl(-200, Engine1);
EngineControl(-200, Engine3);
EngineControl(200, Engine2);
EngineControl(200, Engine4);
Serial.println("Left side FORWARD, Right side BACKWARD (Rotation)");
break;
case 15:
// Разнонаправленное движение (имитация танка)
EngineControl(-200, Engine1);
EngineControl(200, Engine2);
EngineControl(200, Engine3);
EngineControl(-200, Engine4);
Serial.println("Tank-style rotation");
break;
case 16:
// Диагональное движение (если моторы расположены по углам)
EngineControl(-150, Engine1);
EngineControl(0, Engine2);
EngineControl(0, Engine3);
EngineControl(-150, Engine4);
Serial.println("Diagonal movement (forward-left)");
break;
case 17:
// Волновое движение (последовательный запуск)
EngineControl(-200, Engine1);
EngineControl(0, Engine2);
EngineControl(0, Engine3);
EngineControl(0, Engine4);
Serial.println("Wave movement - Engine 1 active");
break;
case 18:
EngineControl(0, Engine1);
EngineControl(-200, Engine2);
EngineControl(0, Engine3);
EngineControl(0, Engine4);
Serial.println("Wave movement - Engine 2 active");
break;
case 19:
EngineControl(0, Engine1);
EngineControl(0, Engine2);
EngineControl(-200, Engine3);
EngineControl(0, Engine4);
Serial.println("Wave movement - Engine 3 active");
break;
case 20:
EngineControl(0, Engine1);
EngineControl(0, Engine2);
EngineControl(0, Engine3);
EngineControl(-200, Engine4);
Serial.println("Wave movement - Engine 4 active");
break;
case 21:
// Все моторы остановлены
EngineControl(0, Engine1);
EngineControl(0, Engine2);
EngineControl(0, Engine3);
EngineControl(0, Engine4);
Serial.println("All engines ➔ STOPPED");
break;
}
i = (i >= 21) ? 0 : i + 1;
}
// int Ox_1 = DeadZone(map(analogRead(Pin_Ox_1), 0, 1023, -255, 255), 5);
// int Oy_1 = DeadZone(map(analogRead(Pin_Oy_1), 0, 1023, -255, 255), 5);
// int Ox_2 = DeadZone(map(analogRead(Pin_Ox_2), 0, 1023, -255, 255), 5);
// int Oy_2 = DeadZone(map(analogRead(Pin_Oy_2), 0, 1023, -255, 255), 5);
// int Ox_3 = DeadZone(map(analogRead(Pin_Ox_3), 0, 1023, -255, 255), 5);
// int Oy_3 = DeadZone(map(analogRead(Pin_Oy_3), 0, 1023, -255, 255), 5);
}
// int DeadZone(int Number, int DeadZone) {
// if (abs(Number) <= DeadZone) {
// return 0;
// }
// if (Number > 0) {
// return map(Number, DeadZone, 255, 0, 255);
// } else {
// return map(Number, -DeadZone, -255, 0, -255);
// }
// }
static void EngineControl(int ThrottleValue, const int Engine[2]) {
int IN1 = Engine[0];
int IN2 = Engine[1];
if (ThrottleValue > 0) {
if (isHardwarePWM(IN1)) {
analogWrite(IN1, ThrottleValue);
} else {
SoftPWMSet(IN1, ThrottleValue);
}
if (isHardwarePWM(IN2)) {
analogWrite(IN2, 0);
} else {
SoftPWMSet(IN2, 0);
}
return;
}
if (ThrottleValue < 0) {
if (isHardwarePWM(IN2)) {
analogWrite(IN2, abs(ThrottleValue));
} else {
SoftPWMSet(IN2, abs(ThrottleValue));
}
if (isHardwarePWM(IN1)) {
analogWrite(IN1, 0);
} else {
SoftPWMSet(IN1, 0);
}
return;
}
if (ThrottleValue == 0) {
if (isHardwarePWM(IN1)) {
analogWrite(IN1, 0);
} else {
SoftPWMSet(IN1, 0);
}
if (isHardwarePWM(IN2)) {
analogWrite(IN2, 0);
} else {
SoftPWMSet(IN2, 0);
}
return;
}
}



Заранее благодарю за любую помощь!