Страница 1 из 1
Маршрут робота.
Добавлено: Ср окт 17, 2012 17:34:53
afagorn
Здравствуйте, здравствуйте, товарищи!
И вот у меня проблема появилась. Вообщем есть робот. Робот трехколесный. Поворачивает как танк, за счет двух колес. Платформа круглая.
Этот робот должен ездить по столу, но так что бы он не падал, и так что бы этот робот проезжал всю площадь стола. Датчик УЗ, находящийся на дне платформы, спереди, определяет край стола.
У меня есть два варианта маршрута. Первый у меня пока плохо получается реализовать, а вот второй Я никак не могу воплотить в жизнь. Подскажите как это сделать. Или можете предложить свой вариант маршрута и его реализацию.
Мозги atmega328. Управление двигателями происходит через L293D. Схема подключения и исходники ниже. Могу прокомментировать код. Знание на уровне чайника. Могу так же скинуть исходники.
Re: Маршрут робота.
Добавлено: Ср окт 17, 2012 19:06:58
vem566
Дык при движении нужна система отслеживания положения. Экзотику типа гироскопов не рассматриваю, но обратная связь должна быть. Простейший вариант поворота робота на угол - величина поворота колеса, которое поворачивает при полном стопе противоположного. Т. е. датчик на колесе. Зубчатый венец + электромагнитный датчик, оптопара на отражение или подобное. Можно шаговые двигатели на ход приспособить и считать число шагов. Короче программно-аппаратный контроль перемещения. Мозгов меги вполне хватит на подобное.
Re: Маршрут робота.
Добавлено: Ср окт 17, 2012 19:18:06
Alexey123
Я отвечал в одной из тем про движение улиткой.
Re: Маршрут робота.
Добавлено: Ср окт 17, 2012 19:40:50
afagorn
Alexey123 писал(а):Я отвечал в одной из тем про движение улиткой.
Товарищ, скиньте ссылку.
Re: Маршрут робота.
Добавлено: Ср окт 17, 2012 20:02:10
Alexey123
Re: Маршрут робота.
Добавлено: Сб окт 20, 2012 10:19:01
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;
}
}