Робот ведет себя неадекватно
- Войдите на сайт для отправки комментариев
По моей программе робот должен доезжать до ближайшейго препятствия и объехать вокруг него. Я установил на робота серво вместе с ультразвуковым датчиком расстояния. Для начала я сделал скетч с циклом, в котором робот должен был ехать вперед, пока расстояние будет больше определенного. Тогда все работало нормально. Потом я дописал этот скетч, после чего робот стал как бы дергаться, и вал серво тоже дрожит. При этом робот периодически двигается вперед, но сразу же останавливается. вот текст программы:
#define M11 5
#define M12 6
#define M21 11
#define M22 10
#include <Ultrasonic.h>
#include <Servo.h>
float dist, rast; //Функции для измерения расстояния и положения серво
Ultrasonic dalnomer(12, 13);
Servo MyServo;
void setup() {
MyServo.attach(9);
pinMode(M11, OUTPUT); //Контакты для двигателей
pinMode(M12, OUTPUT);
pinMode(M21, OUTPUT);
pinMode(M22, OUTPUT);
}
void loop() {
MyServo.write(90); //Серво смотрит прямо
do{
dist = dalnomer.read(CM); //Считываем расстояние с дальномера
goPered(255); //Едем вперед
}while(dist>5); //Пока расстояние больше 5 см
goStop(); //Остановка
delay(1000); //Задержка
//Если убрать код начиная отсюда
MyServo.write(180); //Поворачиваем серво налево
dist = dalnomer.read(CM); //Считываем расстояние с дальномера
if(dist>30){ //Проверка на отсутствие стенки
do{
dist = dalnomer.read(CM);
goPered(255);
}while(dist>10); //Езда вперед
}
else{ //То же самое, только в правую сторону
MyServo.write(180);
dist = dalnomer.read(CM);
if(dist>30){
do{
dist = dalnomer.read(CM);
goPered(255);
}while(dist>10);
}
}
rast = MyServo.read(); //На какой угол повернут серво?
if(rast==0){ //Если налево, то
MyServo.write(180); //поворачиваем направо
dist = dalnomer.read(CM); //проверка на отсутствие стенки
if(dist>30){ //если нет, то
goPravo(255); delay(1000); //Поворачиваем направо
MyServo.write(90); //Серво смотрит прямо
}
}
if(rast==180){ //Симметричная ситуация
MyServo.write(0);
dist = dalnomer.read(CM);
if(dist>30){
goLevo(255); delay(1000);
MyServo.write(90);
}
}
} //до сюда, то робот выполняет то, что было в начале функции loop, как планировалось
//то есть едет вперед до ближайшего препятствия. По плану, если присоединить код который я дописал,
//он должен проверить если возможность повернуть, и после этого обогнуть препятствие. Но вместо этого,
//он даже не двигается с места
int goPered(int Skorost){ //Движение вперед
analogWrite(M12, LOW);
analogWrite(M21, LOW);
analogWrite(M11, Skorost);
analogWrite(M22, Skorost);}
int goNazad(int Skorost){ //Движение назад
analogWrite(M11, LOW);
analogWrite(M22, LOW);
analogWrite(M12, Skorost);
analogWrite(M21, Skorost);}
int goLevo(int Skorost){ //Поворот налево
analogWrite(M12, LOW);
analogWrite(M22, LOW);
analogWrite(M11, Skorost);
analogWrite(M21, LOW);}
int goPravo(int Skorost){ //Поворот направо
analogWrite(M11, LOW);
analogWrite(M21, LOW);
analogWrite(M12, Skorost);
analogWrite(M22, LOW);}
void goStop(){ //Остановка
digitalWrite(M12, LOW);
digitalWrite(M11, LOW);
digitalWrite(M21, LOW);
digitalWrite(M22, LOW);}
MyServo.write(90);
}
}
Срочно нужна помощь, если дадите совет - буду благодарен
P.S. Драйвер двигателя - мостовой, на основе микросхемы L293;
P.P.S. До проверки всей программы, робот доезжал до стенки нормально. теперь и этот кусок кода не работает(Я ничего в нем не менял)
А в 33 строке у вас правильное условие? Что-то мне кажется оно нелогичным.
Да ведь он даже двигаться не начинает, то есть первый цикл не проходит. Да и то что в условии такое расстояние, пока не важно, потому что он должен хотя бы доехать до стенки и развернуться. Я это потом подкорректирую
Подключите к роботу ПК и выводите в порт через Serial.println(); какой кусок кода исполняется в каждый момент времени.
Заметил, что когда колеса крутятся, LD светодиод на плате (желтый) горит. А когда он не горит, колеса не крутятся. О чем это может говорить?
Как Вы думаете, сколько разновидностей плат с L239D и светодиодами можно прикупить на Aliexpress - одну или десяток?
Раз не работает даже тот код, который якобы работал, так может аппаратная проблема?
Перепроверьте все подключения, их правильность и качество. От чего питается вся эта конструкция? Может тупо батарейка села? Да и что за конструкция-то? Какие моторы? Чем управляются? Как подключены (схема)?
Только не говорите, что стандартные моторы, через стандартный шилд, по стандартной схеме. Нет таких!
Возвращайтесь к минимальному коду, добивайтесь, чтобы он заработал.
NaughtyFox,
то, что Вы выложили даже не компилируется, как оно у Вас ездить может?
Я, конечно, понимаю, что скорее всего Вы что-то намудрили с текстом при выкладывании, но
1. Как нам с этим разбираться? Откуда нам знать что там у Вас на самом деле в коде?
2. Такие ошибки говорят об общей аккуратности работы с программой, которую Вам необходимо прокачивать, иначе ни одна программа у Вас никогда не заработает.
3. Никогда не используйте фразу "Я ничего в нем не менял" - вызывает в зависимости от настроение либо саркастическую ухмылку, либо раздражение.
Подключите к роботу ПК и выводите в порт через Serial.println(); какой кусок кода исполняется в каждый момент времени.
Не уверен, что подключить робота к ПК хорошая идея, но направление мысли правильное - для отладки необходима индикация режимов. Собственно, именно с этой целью на робота обычно устанавливают дисплей: либо Нокиевский, либо какой-нибудь вариант 128х64. По минимуму - хотя бы одноразрядный 7-сегментный индикатор.
Получается робот такой не надежный что этот экран очень востребован.
MyServo.write(90); do{ dist = dalnomer.read(CM); Serial.println(dist); goPered(255); }while(dist>5); goStop(); MyServo.write(180);Решил добавлять строки по отдельности к уже работающему коду. После добавления 8 строчки (поворот серво), у меня код выше работает хорошо, но серво в конце не поворачивается. Решил проверить серво на другом скетче - нормально поворачивается
Возможно все это еще и на бредборде дюпонами собрано :)
Я добавил задержки, теперь код работает правильно. Спасибо!
Я добавил задержки, теперь код работает правильно. Спасибо!
Ну вот - delay() рулит, да и похрен, что пока механизм отрабатывает кнопки не нажимаются!