Здравствуйте, здравствуйте, товарищи!
И вот у меня проблема появилась. Вообщем есть робот. Робот трехколесный. Поворачивает как танк, за счет двух колес. Платформа круглая.
Этот робот должен ездить по столу, но так что бы он не падал, и так что бы этот робот проезжал всю площадь стола. Датчик УЗ, находящийся на дне платформы, спереди, определяет край стола.
У меня есть два варианта маршрута. Первый у меня пока плохо получается реализовать, а вот второй Я никак не могу воплотить в жизнь. Подскажите как это сделать. Или можете предложить свой вариант маршрута и его реализацию.
Мозги atmega328. Управление двигателями происходит через L293D. Схема подключения и исходники ниже. Могу прокомментировать код. Знание на уровне чайника. Могу так же скинуть исходники.
Маршрут робота.
Маршрут робота.
- Вложения
-
- Схема улитка.png
- "Улитка". Идеал. Но не знаю как реализовать
- (3.41 КБ) 418 скачиваний
-
- Схема 1.png
- Получается, но робот не поворачивает строго на 90 градусов.
- (4.06 КБ) 428 скачиваний
- Реклама
Re: Маршрут робота.
Дык при движении нужна система отслеживания положения. Экзотику типа гироскопов не рассматриваю, но обратная связь должна быть. Простейший вариант поворота робота на угол - величина поворота колеса, которое поворачивает при полном стопе противоположного. Т. е. датчик на колесе. Зубчатый венец + электромагнитный датчик, оптопара на отражение или подобное. Можно шаговые двигатели на ход приспособить и считать число шагов. Короче программно-аппаратный контроль перемещения. Мозгов меги вполне хватит на подобное.
Re: Маршрут робота.
Я отвечал в одной из тем про движение улиткой.
Re: Маршрут робота.
Товарищ, скиньте ссылку.Alexey123 писал(а):Я отвечал в одной из тем про движение улиткой.
Re: Маршрут робота.
Да, я Вам и писал.
http://radiokot.ru/forum/viewtopic.php?f=3&t=74127
http://radiokot.ru/forum/viewtopic.php?f=3&t=74127
- Реклама
Re: Маршрут робота.
Товарищи, выбрал Я хаотичное движение. Сначала робот едет вперед от 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;
}
}


