Маршрут робота.

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

Маршрут робота.

Сообщение afagorn »

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

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

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

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

Мозги atmega328. Управление двигателями происходит через L293D. Схема подключения и исходники ниже. Могу прокомментировать код. Знание на уровне чайника. Могу так же скинуть исходники.
Вложения
Схема улитка.png
"Улитка". Идеал. Но не знаю как реализовать
(3.41 КБ) 418 скачиваний
Схема 1.png
Получается, но робот не поворачивает строго на 90 градусов.
(4.06 КБ) 428 скачиваний
Реклама
Аватара пользователя
vem566
Друг Кота
Сообщения: 4736
Зарегистрирован: Вс янв 24, 2010 13:14:02
Откуда: Омск

Re: Маршрут робота.

Сообщение vem566 »

Дык при движении нужна система отслеживания положения. Экзотику типа гироскопов не рассматриваю, но обратная связь должна быть. Простейший вариант поворота робота на угол - величина поворота колеса, которое поворачивает при полном стопе противоположного. Т. е. датчик на колесе. Зубчатый венец + электромагнитный датчик, оптопара на отражение или подобное. Можно шаговые двигатели на ход приспособить и считать число шагов. Короче программно-аппаратный контроль перемещения. Мозгов меги вполне хватит на подобное.
Реклама
Alexey123
Грызет канифоль
Сообщения: 280
Зарегистрирован: Чт ноя 04, 2010 09:56:34

Re: Маршрут робота.

Сообщение Alexey123 »

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

Re: Маршрут робота.

Сообщение afagorn »

Alexey123 писал(а):Я отвечал в одной из тем про движение улиткой.
Товарищ, скиньте ссылку.
Реклама
Эиком - электронные компоненты и радиодетали
Alexey123
Грызет канифоль
Сообщения: 280
Зарегистрирован: Чт ноя 04, 2010 09:56:34

Re: Маршрут робота.

Сообщение Alexey123 »

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

Re: Маршрут робота.

Сообщение 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;
}
}
Реклама
Ответить

Вернуться в «Умные мысли»