Проблема со скетчем
- Войдите на сайт для отправки комментариев
Пнд, 16/04/2018 - 19:03
Здравствуйте, у меня проблема со скетчем:
(он для работы робота пылесоса)
Проблема в следующем не работает левый электродвигатель ни в ручном режиме ни в автомате... в чем может быть причина? я новичек и не сильно разбираюсь, но раньше все работало а в один прекрасный момент левый двигатель перестал работать.
Двигатель проверил, все ок. думал проблема в драйвере 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);
}
Я в тупике, помогите, пожалуйста
попробуйте установку режимов работы пулесоса поставить сразу после функции void setup
контроллер не понимает в каком режиме ему работать , режим 0.
Еще возможно часть драйвера вышла из строя, попробуйте в вашей программе проверки поставить en1 ,en2 поставить не 255,
а 150 например. Если мотору работают ,значит драйвер цел