Проблема со скетчем

DimkaTDS
Offline
Зарегистрирован: 16.04.2018

Здравствуйте, у меня проблема со скетчем:

(он для работы робота пылесоса)

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

Двигатель проверил, все ок. думал проблема в драйвере l298n

но написал проверочный скетч (он в конце) и моторы крутятся не меняя соединений.

Я уже три дня толком не могу спать из-за этой хрени, помогите разобраться, пожалуйста.

#include <Ultrasonic.h>//подключаем библиотеку сонара

Ultrasonic ultrasonic(3, 12);//указываем выходы тригер и эхо дальномера

#include <IRremote.h>// подключаем библиотеку ик

IRrecv irrecv (A0); //назначаем a0 пин на ик прием
decode_results results;

#include<Servo.h>//подключение библиотеки для запуска мотора пылесоса
Servo motor;

int UP1 = 9; // определяем переменные для 1-го двигателя (левый)
int IN1 = 4;
int IN2 = 5;

int UP2 = 6; // определяем переменные для 2-го двигателя (правый)
int IN3 = 7;
int IN4 = 8;

int RBP = 10;
int LBP = 11;
int rezim;//переменная для режимов
float dist; //переменная для дистанции
int rdm; //переменная для случайного значения
int rele = 2; //переменная для реле
int pilesos; //переменная для включения выключения пылесоса



void setup()
{

Serial.begin(9600);

irrecv.enableIRIn(); // запускаем прием инфракрасного сигнала

pinMode (A0, INPUT);//пин A0 вход

pinMode (UP1, OUTPUT);// назначаем выходы для первого мотора(левый)
pinMode (IN1, OUTPUT);
pinMode (IN2, OUTPUT);

pinMode (UP2, OUTPUT);// назначаем выходы для второго мотора (правый)
pinMode (IN3, OUTPUT);
pinMode (IN4, OUTPUT);
pinMode (RBP, INPUT);//правый бампер
pinMode (LBP, INPUT);//левый бампер
pinMode (rele, OUTPUT);
rezim = 0; //присваиваем переменной режим нулевое значение
motor.attach(13);//присваиваем порт мотору и калибровка регулятора при запуске
motor.writeMicroseconds(2300);
delay(1500);
motor.writeMicroseconds(800);
delay(1500);
}

void loop()
{
/*Код относиться к 3-му режиму (Полной остановки)*/
if (rezim == 3)
{
analogWrite(UP1, 0);//Полная остановка
analogWrite(UP2, 0);
}

/* Код относиться к автоматическому режиму управления*/

if (rezim == 2)
{
float dist = ultrasonic.Ranging(CM); // дистанция в см
Serial.println(dist); // выводим дистанцию в порт
delay(100);


if (dist > 22)
{


digitalWrite(IN1, LOW);//первая скорость
digitalWrite(IN2, HIGH);
analogWrite(UP1, 110);

digitalWrite(IN3, LOW);
digitalWrite(IN4, HIGH);
analogWrite(UP2, 155);
delay(500);

digitalWrite(IN1, LOW);//моторы крутятся вперед на 2 скорости
digitalWrite(IN2, HIGH);
analogWrite(UP1, 130);

digitalWrite(IN3, LOW);
digitalWrite(IN4, HIGH);
analogWrite(UP2, 180);
}

if (dist < 22)
{
/*моторы останавливаются (защита моторов).*/
analogWrite(UP1, 0);
analogWrite(UP2, 0);
delay(1200);

/*моторы крутятся назад на 1 скорости*/
digitalWrite(IN1, HIGH);
digitalWrite(IN2, LOW);
analogWrite(UP1, 110);

digitalWrite(IN3, HIGH);
digitalWrite(IN4, LOW);
analogWrite(UP2, 155);
delay(600);

/*моторы крутятся вперед левый и назад правый поворот на месте*/
digitalWrite(IN1, LOW);
digitalWrite(IN2, HIGH);
analogWrite(UP1, 110);

digitalWrite(IN3, HIGH);
digitalWrite(IN4, LOW);
analogWrite(UP2, 145);
rdm = random(700, 1300);
delay(rdm);


}
}


if (digitalRead(LBP) == HIGH && rezim == 2)
{
analogWrite(UP1, 0); //защита моторов
analogWrite(UP2, 0);
delay(600);

/*моторы крутятся назад на 1 скорости*/
digitalWrite(IN1, HIGH);
digitalWrite(IN2, LOW);
analogWrite(UP1, 110);

digitalWrite(IN3, HIGH);
digitalWrite(IN4, LOW);
analogWrite(UP2, 155);
delay(800);
/*моторы крутятся вперед левый и назад правый поворот на месте*/

digitalWrite(IN1, LOW);
digitalWrite(IN2, HIGH);
analogWrite(UP1, 110);

digitalWrite(IN3, HIGH);
digitalWrite(IN4, LOW);
analogWrite(UP2, 145);
delay(250);
}

if (digitalRead(RBP) == HIGH && rezim == 2)
{
analogWrite(UP1, 0); //защита моторов
analogWrite(UP2, 0);
delay(600);

/*моторы крутятся назад на 1 скорости*/
digitalWrite(IN1, HIGH);
digitalWrite(IN2, LOW);
analogWrite(UP1, 110);

digitalWrite(IN3, HIGH);
digitalWrite(IN4, LOW);
analogWrite(UP2, 155);
delay(600);

/*моторы крутятся вперед правый и назад левый поворот на месте влево*/
digitalWrite(IN1, HIGH);
digitalWrite(IN2, LOW);
analogWrite(UP1, 110);

digitalWrite(IN3, LOW);
digitalWrite(IN4, HIGH);
analogWrite(UP2, 145);
delay(250);
}
/*Установка режимов работы*/
if (irrecv.decode(&results)) // если данные пришли
{

if (results.value == 0XFFA25D)//1 режим ручной(CH-)
{
rezim = 1;
}
if (results.value == 0XFFE21D)//2 режим (автоматическийCH+)
{
rezim = 2;
}
if (results.value == 0XFF629D)//3 режим (Полной остановкиCH)
{
rezim = 3;
}

/* включение передней щетки через реле, а также запуск мотора пылесоса*/

if (results.value == 0XFF22DD) //клавиша |<<
{
digitalWrite(rele, HIGH);
motor.writeMicroseconds(800);

}
if (results.value == 0XFF02FD)//клавиша>>
{
digitalWrite(rele, LOW);
motor.writeMicroseconds(2300);
}


/* Код относиться к ручному управлению пылесосом*/
if (results.value == 0XFF18E7 && rezim == 1) //команда клавиша 2-моторы крутятся вперед
{ analogWrite(UP1, 0); //защита моторов
analogWrite(UP2, 0);
delay(250);

digitalWrite(IN1, LOW);//первая скорость
digitalWrite(IN2, HIGH);
analogWrite(UP1, 110);

digitalWrite(IN3, LOW);
digitalWrite(IN4, HIGH);
analogWrite(UP2, 155);

delay(400);// пауза перед 2 скоростью моторов


digitalWrite(IN1, LOW);//моторы крутятся вперед на 2 скорости
digitalWrite(IN2, HIGH);
analogWrite(UP1, 130);

digitalWrite(IN3, LOW);
digitalWrite(IN4, HIGH);
analogWrite(UP2, 180);

delay(400); //пауза перед 3 скоростью


digitalWrite(IN1, LOW); //моторы крутятся вперед на 3 скорости
digitalWrite(IN2, HIGH);
analogWrite(UP1, 150);

digitalWrite(IN3, LOW);
digitalWrite(IN4, HIGH);
analogWrite(UP2, 210);

}
if (results.value == 0XFF38C7)//клавиша 5
{

analogWrite(UP1, 0); //моторы останавливаются.
analogWrite(UP2, 0);


}

if (results.value == 0XFF4AB5 && rezim == 1) // клавиша 8
{

analogWrite(UP1, 0); //остановка моторов (защита от перегрузок)
analogWrite(UP2, 0);
delay(250);

//моторы крутятся назад на 1 скорости
digitalWrite(IN1, HIGH);
digitalWrite(IN2, LOW);
analogWrite(UP1, 110);

digitalWrite(IN3, HIGH);
digitalWrite(IN4, LOW);
analogWrite(UP2, 155);

delay(400); //пауза перед 2 скоростью моторов

//моторы крутятся назад на 2 скорости
digitalWrite(IN1, HIGH);
digitalWrite(IN2, LOW);
analogWrite(UP1, 120);

digitalWrite(IN3, HIGH);
digitalWrite(IN4, LOW);
analogWrite(UP2, 170);

}

if (results.value == 0XFF10EF && rezim == 1) // клавиша 4 поворот влево
{
analogWrite(UP1, 0); //остановка моторов (защита от перегрузок)
analogWrite(UP2, 0);
delay(250);
//моторы крутятся вперед правый и назад левый поворот на месте влево
digitalWrite(IN1, HIGH);
digitalWrite(IN2, LOW);
analogWrite(UP1, 110);

digitalWrite(IN3, LOW);
digitalWrite(IN4, HIGH);
analogWrite(UP2, 145);

}


if (results.value == 0XFF5AA5 && rezim == 1) //клавиша 6 поворот вправо
{ analogWrite(UP1, 0); //остановка моторов (защита от перегрузок)
analogWrite(UP2, 0);
delay(250);


//моторы крутятся вперед левый и назад правый поворот на месте
digitalWrite(IN1, LOW);
digitalWrite(IN2, HIGH);
analogWrite(UP1, 110);

digitalWrite(IN3, HIGH);
digitalWrite(IN4, LOW);
analogWrite(UP2, 145);

}
irrecv.resume();
}
}

Написал вот такой код, для проверки не меняя соединений и тут все работает как нужно..  в чем может быть проблема?

 

//
int en1=9;
int in1=4;
int in2=5;
//
int en2=6;
int in3=7;
int in4=8;
void setup() {

pinMode(en1, OUTPUT);
pinMode(en2, OUTPUT);
pinMode(in1, OUTPUT);
pinMode(in2, OUTPUT);
pinMode(in3, OUTPUT);
pinMode(in4, OUTPUT); 
}

void loop() {
digitalWrite(in1, LOW);
digitalWrite(in2, HIGH);
analogWrite(en1, 255);

digitalWrite(in3, LOW);
digitalWrite(in4, HIGH);
analogWrite(en2, 255); 

}

Я в тупике, помогите, пожалуйста

mexanic38
Offline
Зарегистрирован: 26.02.2018

попробуйте установку режимов работы пулесоса поставить сразу после функции void setup

контроллер не  понимает в каком режиме ему работать , режим 0.

Еще возможно часть драйвера вышла из строя, попробуйте в вашей программе проверки поставить en1 ,en2 поставить не 255,

а 150 например. Если мотору работают ,значит драйвер цел