Страница 1 из 1

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

Добавлено: Пн окт 22, 2012 17:10:45
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. Схема подключения и исходники ниже. Могу прокомментировать код. Знание на уровне чайника.

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

Добавлено: Пн окт 22, 2012 23:29:50
Аlex
робот начинает крутиться на месте
Интересно, а что он должен делать, если
робот поворачивает пока край не исчезнет
? :)
Или я что-то недопонял ? :roll:

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

Добавлено: Вт окт 23, 2012 15:33:05
afagorn
Робот не должен падать со стала. Край стола найден и робот поворачивает, пока край не исчезнет и едет дальше.

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

Добавлено: Вт окт 23, 2012 17:37:50
Ser60
Еслы Вы занимаетесь робототехникой, может быть сможете сказать как реализуется управление моторами в низковольтных роботах. Мне нужно чтобы он работал при изменении напряжения батарей от 3В до 2В. В таких условиях L293 - это зло. Я придумал схему, но хочется узнать кто еще как делает. Не понял какая связь между рукой и краем стола? Рука загораживает край стола или еще что?

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

Добавлено: Вт окт 23, 2012 17:54:05
BCluster
Вы меня простите, но я не удержался от этого
afagorn писал(а):DNIWE
Напомнило ))))))))) http://pikabu.ru/story/quotrusskie_nazy ... uot_558600

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

Добавлено: Вт окт 23, 2012 19:52:13
afagorn
Ser60 писал(а):Еслы Вы занимаетесь робототехникой, может быть сможете сказать как реализуется управление моторами в низковольтных роботах. Мне нужно чтобы он работал при изменении напряжения батарей от 3В до 2В. В таких условиях L293 - это зло. Я придумал схему, но хочется узнать кто еще как делает. Не понял какая связь между рукой и краем стола? Рука загораживает край стола или еще что?
У меня робот отлично работает и при 9 вольтах. А можно схемку в студию?
Про край стола Я наверное зря сказал. Вообщем если перед датчиком ставим руку на секунд 10, то робот начинает крутиться на одном месте. А если быстро поставить и убрать то все как надо работает.

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

Добавлено: Вт окт 23, 2012 20:33:53
afagorn
Товарищи, кажется, что Я понял где ошибка.
В функции днище, а точнее в цикле while. В этом цикле мне нужно что бы переменная х постоянно "обновлялась". В эту переменную "стекаются" данные о том если перед датчиком препятствие или нету. Помогите как это реализовать.

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

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

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

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

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

Добавлено: Ср окт 24, 2012 09:20:35
BCluster
У вас там этот while будет бесконечно исполняться. Потому что x не меняется. И если он к моменту вызова цикла будет > 50 - у вас будет бесконечный цикл. В противном случае он вообще не исполнится. Сейчас посмотрю более детально

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

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