Проблема со скетчем
- Войдите на сайт для отправки комментариев
Пнд, 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 например. Если мотору работают ,значит драйвер цел