Обнаружение края стола

Обсуждаем контроллеры компании Atmel.
Ответить
Открыл глаза
Аватара пользователя
Сообщения: 50
Зарегистрирован: Вс июл 03, 2011 23:15:06
Откуда: Москва

Сообщение afagorn »

Здравствуйте, здравствуйте, товарищи!

И вот у меня проблема появилась. Вообщем есть робот. Робот трехколесный. Поворачивает как танк, за счет двух колес. Платформа круглая.

Этот робот должен ездить по столу, но так что бы он не падал, и так что бы этот робот проезжал всю площадь стола. Датчик УЗ, находящийся на дне платформы, спереди, определяет край стола.

Движение робота осуществляется хаотично. Сначала робот едет вперед от 300 до 1000 миллисекунд, потом поворачивает вправо от 300 до 1000 миллисекунд, потом так же налево. от 300 до 1000 миллисекунд, Функция DNIWE (днище) детектит край стола. Если край найден, то робот поворачивает пока край не исчезнет. Все работает прекрасно до того момента пока перед УЗ датчиком не будет долго находится край стола. То есть если оставить долго руку перед датчиком, то робот начинает крутиться на месте. Если быстро убрать, то он поворачивает сколько ему и полагается. Наверное что-то не так с функцией. Вот исходники
Спойлер

Код: Выделить всё

int trigPin2 = 4;
int echoPin2 = 7;
int trigPin1 = 13;
int echoPin1 = 12;
int in4 = 11;
int in3 = 10;
int in2 = 2;
int in1 = 8;
int state = 0;
int n = 300;
int en1 = 5;
int en2 = 4;

int duration1;
int duration;
long distance2;
int ledLevel;
long distance1;
int ledLevel1;

void setup() {


Serial.begin(9600);
pinMode(trigPin2,OUTPUT);
pinMode(echoPin2,INPUT);
pinMode(trigPin1,OUTPUT);
pinMode(echoPin1,INPUT);

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

void loop() {
//Запускаем двигатели
digitalWrite(in1,HIGH);
digitalWrite(in2,LOW);
digitalWrite(in3,HIGH);
digitalWrite(in4,LOW);
delay(random(300,1000));
DNIWE(ledLevel1, in1, in2, in3, in4);

//Поворот направо
digitalWrite(in1,HIGH);
digitalWrite(in2,LOW);
digitalWrite(in3,LOW);
digitalWrite(in4,HIGH);
delay(random(300,1000));
DNIWE(ledLevel1, in1, in2, in3, in4);

//Дальше проезжаем вперед
digitalWrite(in1,LOW);
digitalWrite(in2,HIGH);
digitalWrite(in3,HIGH);
digitalWrite(in4,LOW);
delay(random(300,1000));
DNIWE(ledLevel1, in1, in2, in3, in4);

//Поворачиваем налево
digitalWrite(in1,LOW);
digitalWrite(in2,HIGH);
digitalWrite(in3,HIGH);
digitalWrite(in4,LOW);
DNIWE(ledLevel1, in1, in2, in3, in4);

//все что написано внизу Я взял с этого сайта. Там все подробно описанно. http://research.andbas.com/2011/12/hc-sr04.html
long distance1 = getDistance(trigPin1, echoPin1);//тут берется расстояние от первой пары датчиков
ledLevel1 = (int) (distance1*10)<=255?255-distance1*10:0;//тут вычисляется уровень который нужно подать на моторчик

long distance2 = getDistance(trigPin2, echoPin2); // тут от второй
ledLevel = (int) (distance2*10)<=255?255-distance2*10:0;//тут вычисляется уровень который нужно подать на моторчик

}

long getDistance(int trig, int echo) //эта функция возвращает расстояние в сантиметрах до объекта перед сенсором
{
digitalWrite(trig, LOW);//тут высталяем на вход тригер логический нуль
delayMicroseconds(2);
digitalWrite(trig, HIGH);//ставим единицу
delayMicroseconds(10);//ждем пока сигнал отразится
digitalWrite(trig, LOW);//ставим нуль
long duration = pulseIn(echo,HIGH);//слушаем эфир (она вычитает сколько микросекунд прошло)
long distacne_cm = duration/29/2;
return distacne_cm;
}

int DNIWE(int x, int y1, int y2, int y3, int y4) //х это переменная ledLevel1
{ 
if (x >= 150)
{
while(x > 50){ //пока перед датчиком не окажется повехность стола, робот будет вращаться.
digitalWrite(y1, LOW);
digitalWrite(y2, HIGH);
digitalWrite(y3, HIGH);
digitalWrite(y4, LOW);
}
x = 0;
return x;
}
}
Мозги atmega328. Управление двигателями происходит через L293D. Схема подключения и исходники ниже. Могу прокомментировать код. Знание на уровне чайника.
Реклама
Модератор
Аватара пользователя
Сообщения: 4614
Зарегистрирован: Чт мар 18, 2010 23:09:57
Откуда: Планета Земля

Сообщение Аlex »

робот начинает крутиться на месте
Интересно, а что он должен делать, если
робот поворачивает пока край не исчезнет
? :)
Или я что-то недопонял ? :roll:
Контактная информация:
Реклама
Открыл глаза
Аватара пользователя
Сообщения: 50
Зарегистрирован: Вс июл 03, 2011 23:15:06
Откуда: Москва

Сообщение afagorn »

Робот не должен падать со стала. Край стола найден и робот поворачивает, пока край не исчезнет и едет дальше.
Друг Кота
Аватара пользователя
Сообщения: 3784
Зарегистрирован: Ср дек 24, 2008 09:58:58

Сообщение Ser60 »

Еслы Вы занимаетесь робототехникой, может быть сможете сказать как реализуется управление моторами в низковольтных роботах. Мне нужно чтобы он работал при изменении напряжения батарей от 3В до 2В. В таких условиях L293 - это зло. Я придумал схему, но хочется узнать кто еще как делает. Не понял какая связь между рукой и краем стола? Рука загораживает край стола или еще что?
Реклама
Эиком - электронные компоненты и радиодетали
Собутыльник Кота
Аватара пользователя
Сообщения: 2512
Зарегистрирован: Пн апр 06, 2009 19:33:29
Откуда: Молдова, Кишинев

Сообщение BCluster »

Вы меня простите, но я не удержался от этого
afagorn писал(а):DNIWE
Напомнило ))))))))) http://pikabu.ru/story/quotrusskie_nazy ... uot_558600
Контактная информация:
Реклама
Открыл глаза
Аватара пользователя
Сообщения: 50
Зарегистрирован: Вс июл 03, 2011 23:15:06
Откуда: Москва

Сообщение afagorn »

Ser60 писал(а):Еслы Вы занимаетесь робототехникой, может быть сможете сказать как реализуется управление моторами в низковольтных роботах. Мне нужно чтобы он работал при изменении напряжения батарей от 3В до 2В. В таких условиях L293 - это зло. Я придумал схему, но хочется узнать кто еще как делает. Не понял какая связь между рукой и краем стола? Рука загораживает край стола или еще что?
У меня робот отлично работает и при 9 вольтах. А можно схемку в студию?
Про край стола Я наверное зря сказал. Вообщем если перед датчиком ставим руку на секунд 10, то робот начинает крутиться на одном месте. А если быстро поставить и убрать то все как надо работает.
Реклама
Открыл глаза
Аватара пользователя
Сообщения: 50
Зарегистрирован: Вс июл 03, 2011 23:15:06
Откуда: Москва

Сообщение afagorn »

Товарищи, кажется, что Я понял где ошибка.
В функции днище, а точнее в цикле while. В этом цикле мне нужно что бы переменная х постоянно "обновлялась". В эту переменную "стекаются" данные о том если перед датчиком препятствие или нету. Помогите как это реализовать.
Друг Кота
Аватара пользователя
Сообщения: 3784
Зарегистрирован: Ср дек 24, 2008 09:58:58

Сообщение Ser60 »

Мне надо чтобы робот работал именно от 2-х батареек по 1.5В. Для питания цифровой части нужно стабильное напряжение 3.3В, и это не проблема. Схема, что мы собрали со студентом описана на вебсайте того проекта

Кстати, тот робот тоже определяет край стола, но просто останавливается, чтобы не падать. Там студент даже свой видео ролик выложил. Впоследствии я придумал и более проcтую и эффективную схему, но она только в голове. Вот и хотелось узнать кто как делал. Большинство роботов в журналах питаются от большего напряжения, как правило в районе 7 - 12В и акумов чуть-ли не машинных. Но меня интересуют именно маленькие роботы и низковольтные.

По поводу кода не думаю что найдется много желающих копать Ваш исходник практически лишенный комментариев и разбираться зачем нужна какая переменная в функциях и какую роль играют их параметры, пока Вы сами это толком все не опишите.
Собутыльник Кота
Аватара пользователя
Сообщения: 2512
Зарегистрирован: Пн апр 06, 2009 19:33:29
Откуда: Молдова, Кишинев

Сообщение BCluster »

У вас там этот while будет бесконечно исполняться. Потому что x не меняется. И если он к моменту вызова цикла будет > 50 - у вас будет бесконечный цикл. В противном случае он вообще не исполнится. Сейчас посмотрю более детально
Контактная информация:
Собутыльник Кота
Аватара пользователя
Сообщения: 2512
Зарегистрирован: Пн апр 06, 2009 19:33:29
Откуда: Молдова, Кишинев

Сообщение BCluster »

Вам надо собвственно в функцию днище добавить, а именно в цикл while
ledLevel1 = (int) (distance1*10)<=255?255-distance1*10:0;//тут вычисляется уровень который нужно подать на моторчик
и проверять этот ledLevel1 в цикле, а не переменную x
Контактная информация:
Ответить

Вернуться в «AVR»