Робот застрял в углу

mrbin
Offline
Зарегистрирован: 01.02.2015

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

hubll
Offline
Зарегистрирован: 08.03.2015

обычно код показывают, или хотите, чтобы все угадывали?

Joiner
Offline
Зарегистрирован: 04.09.2014

задать минимальное время между срабатываниями, если меньше - то назад.

mrbin
Offline
Зарегистрирован: 01.02.2015
//левая сторона
const int LeftMotor1 = 4;//"Dir B" on motor-shield
const int LeftMotor2 = 5;//"Dir B" on motor-shield
const int LeftMotorSpeed = 9;//"PWM B" on motor-shield
const int LeftBumper = A0;

//правая сторона
const int RightMotor3 = 6;//"Дир "на мотор-щит
const int RightMotor4 = 7;//"Дир "на мотор-щит
const int RightMotorSpeed = 10;//"PWM A" on motor-shield
const int RightBumper = A1;
/////////////////////////////////////////////////////////////////////////

void setup()
{
  pinMode(LeftBumper , INPUT);
  pinMode (LeftMotorSpeed, OUTPUT);
  pinMode (LeftMotor1, OUTPUT);
  pinMode (LeftMotor2, OUTPUT);
  
  pinMode(RightBumper, INPUT);
  pinMode (RightMotorSpeed, OUTPUT);
  pinMode (RightMotor3, OUTPUT);
  pinMode (RightMotor4, OUTPUT); 
}



void loop()
{
 
  vpered();  // езда вперед 
  analogWrite(LeftMotorSpeed,120);
  analogWrite(RightMotorSpeed,120);
 
  
  
  
  if(digitalRead(LeftBumper)==HIGH)//если кнопка нажата ...
{
   stopm();//СТОП МОТРЫ 
   delay(200); 
   nazad();//ЗДАТЬ НАЗАД
   delay(200);
  //Поворачиваем  на право
  vpravo();
  analogWrite(LeftMotorSpeed,140);
  analogWrite(RightMotorSpeed,140);
  delay(1500); 
}
  
 if(digitalRead(RightBumper)==HIGH)//если кнопка нажата ...
{
   stopm();//СТОП МОТРЫ 
   delay(200); 
   nazad();//ЗДАТЬ НАЗАД
   delay(200);
  //Поворачиваем на лево
  vlevo(); //поворот на месте влево
  analogWrite(LeftMotorSpeed,140);
  analogWrite(RightMotorSpeed,140);
  delay(1500); 
}  



}

  //---------------------------------------------------------
//функция езды вперед----------------------------------------
void vpered() {
  //вращение левого мотора вперед
  digitalWrite(LeftMotor1, HIGH);
  digitalWrite(LeftMotor2, LOW); 
  //-----------------------------
  //вращение правого мотора вперед
  digitalWrite(RightMotor3, HIGH);
  digitalWrite(RightMotor4, LOW); 
  //-----------------------------  
}

//функция езды назад
void nazad() {
  //вращение левого мотора назад
  digitalWrite(LeftMotor1,LOW );
  digitalWrite(LeftMotor2, HIGH); 
  //----------------------------- 
  //вращение правого мотора назад
  digitalWrite(RightMotor3,LOW );
  digitalWrite(RightMotor4, HIGH); 
 
  //----------------------------
}

//функция езды на месте влево
void vlevo() {
  //вращение левого мотора назад
  digitalWrite(LeftMotor1, LOW);
  digitalWrite(LeftMotor2,HIGH ); 
  //-----------------------------
  //вращение правого мотора вперед
  digitalWrite(RightMotor3, HIGH);
  digitalWrite(RightMotor4,LOW ); 
  //-----------------------------  
}

//функция езды на месте вправо
void vpravo() {
  //вращение правого мотора назад
  digitalWrite(LeftMotor1,HIGH);
  digitalWrite(LeftMotor2,LOW  );
  //----------------------------
  //вращение левого мотора вперед
  digitalWrite(RightMotor3,LOW);
  digitalWrite(RightMotor4,HIGH  ); 
  //-----------------------------
}

//функция стоп
void stopm() {
  //стоп правого мотора назад
  digitalWrite(LeftMotor1, HIGH);
  digitalWrite(LeftMotor2, HIGH);
  //----------------------------
  //стоп левого мотора вперед
  digitalWrite(RightMotor3, HIGH);
  digitalWrite(RightMotor4, HIGH); 
  //-----------------------------
}  
  

 

 

mrbin
Offline
Зарегистрирован: 01.02.2015

вот код,а как задать подскажите,я вот в этом и не могу разобратся,как время задать между срабатываниями датчиков

Joiner
Offline
Зарегистрирован: 04.09.2014

Самое простое можно попробовать в строках 44 и 57 увеличить паузу, delay(1000),например. т.е. дать ему побольше времени откатить назад.

Мне так кажется.

mrbin
Offline
Зарегистрирован: 01.02.2015

ну да это проще,но хотелось что бы еще по другому сооброжал

Joiner
Offline
Зарегистрирован: 04.09.2014

mrbin пишет:

ну да это проще,но хотелось что бы еще по другому сооброжал

Что-то настоящие программисты молчат. Я в программировании не очень силен, но мне кажется надо двигаться всторону "Блинк без делей", т.е. по счетчику миллисекунд фиксировать время между срабатываниями датчиков, и если оно меньше какого-то заданного интервала, то действовать как-то иначе.

Puhlyaviy
Puhlyaviy аватар
Offline
Зарегистрирован: 22.05.2013

Нужно учить матчасть. Например посмотреть как ездють роботы пылесосы. Они едут в одну сторону. И потому не попадают в углы.

Joiner
Offline
Зарегистрирован: 04.09.2014

Puhlyaviy пишет:
Нужно учить матчасть. Например посмотреть как ездють роботы пылесосы. Они едут в одну сторону. И потому не попадают в углы.

Если задать правильный алгоритм, то робот и лабиринты будет проходить.......

Правильного алгоритма я не помню, но где-то он обязательно  описан.

Puhlyaviy
Puhlyaviy аватар
Offline
Зарегистрирован: 22.05.2013

Joiner пишет:

Puhlyaviy пишет:
Нужно учить матчасть. Например посмотреть как ездють роботы пылесосы. Они едут в одну сторону. И потому не попадают в углы.

Если задать правильный алгоритм, то робот и лабиринты будет проходить.......

Правильного алгоритма я не помню, но где-то он обязательно  описан.


Правильный алгоритм прохождения лабиринта всегда идти по правой стене. :)
то что я и написал. Пылесосы всегда в одну сторону поворачивают.

Клапауций 999
Offline
Зарегистрирован: 06.06.2015

Puhlyaviy пишет:
Правильный алгоритм прохождения лабиринта всегда идти по правой стене. :) то что я и написал. Пылесосы всегда в одну сторону поворачивают.

всегда по левой стороне - неправильный алгоритм?

Joiner
Offline
Зарегистрирован: 04.09.2014

Здесь про алгоритм http://www.myrobot.ru/articles/logo_mazesolving.php Там надо идти всегда направо, но иногда приходится и налево :)

Но там вроде датчик только впереди, а у товарища два боковых. Алгоритм будет несколько иной.

Puhlyaviy
Puhlyaviy аватар
Offline
Зарегистрирован: 22.05.2013

Joiner пишет:

Здесь про алгоритм http://www.myrobot.ru/articles/logo_mazesolving.php Там надо идти всегда направо, но иногда приходится и налево :)

Но там вроде датчик только впереди, а у товарища два боковых. Алгоритм будет несколько иной.


Не будет он иной. Хоть 5 датчиков. Самый простой вариант всегда поварачивай в одну сторону! Не нравится придумывай алгоритмы с запоминанием и лидарами и прочими плюшками. Но судя по вопросу в данной теме, товарищ ожидает что кто то ему сделает просто так.

mrbin
Offline
Зарегистрирован: 01.02.2015

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

Puhlyaviy
Puhlyaviy аватар
Offline
Зарегистрирован: 22.05.2013

mrbin пишет:

каждый в своем силен.


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

В любом микропроцесоре тикают тактовые часы. Берите их и засекайте.

Клапауций 999
Offline
Зарегистрирован: 06.06.2015

mrbin пишет:

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

ок. вы научитесь засекать время между срабатыванием датчиков, и шо?

каков алгоритм выхода из угла, если второй датчик сработал через 3секунды, через 15 секунд, одновременно сработали - 0 секунд?

 

Joiner
Offline
Зарегистрирован: 04.09.2014

Клапауций 999 пишет:

ок. вы научитесь засекать время между срабатыванием датчиков, и шо?

каков алгоритм выхода из угла, если второй датчик сработал через 3секунды, через 15 секунд, одновременно сработали - 0 секунд?

Если 15 секунд, то он не в углу, если секунда, к примеру, значит в какой-то щели, значит подальше задом сдать.

SU-27-16
SU-27-16 аватар
Offline
Зарегистрирован: 13.08.2012

Joiner пишет:

SU-27-16 пишет:

Joiner пишет:

mrbin пишет:
Умники ,сами них.я незнаете.

:)))))))))))))))))

Хули Иглессиаса зовёте ? весь форум заточен на то - что задай вопрос нормально - понятный будет ответ !

Человек просил объяснить как время измерить между срабатываниями датчиков. Ну типа Превмиллис-Курентмиллис

я уже кому-то писал аналогию.....

варим яйца кур....
закипела вода... запоминаем время начала варки..... oldTime = скока щас есть время по процессору
каждую секунду следим - не стало-ли Текущее Время больше чем на 7 мин ( варка яиццццц ) от oldTime

меньше - пусть кипит !
больше - сварились ! под холодную воду их !

 

Joiner
Offline
Зарегистрирован: 04.09.2014

mrbin пишет:

..робот заехал в угол.....

Ну что там с роботом? Получилось?

mrbin
Offline
Зарегистрирован: 01.02.2015

Потихоньку разбираюсь

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

Joiner пишет:

Правильного алгоритма я не помню, но где-то он обязательно  описан.

У Вас неверный подход.

Правильного алгоритма пригодного на все случаи жизни в природе не существует.

Значит, нужно его изобретать самому.

Сложно?

Ничего подобного!

Просто представьте, что не робот, а именно Вы оказались в углу, и нужно из него выбраться. Что будете делать? Вы ведь сумеете выбраться из лабиринта? Подробно опишите собственную последовательность действий. По-русски. А потом просто переведите ее на С++. И все, ничего сложного.

mrbin
Offline
Зарегистрирован: 01.02.2015

Да по русски описать не проблема,а вот на си некоторые функции сделать проблема

Puhlyaviy
Puhlyaviy аватар
Offline
Зарегистрирован: 22.05.2013

mrbin пишет:

Да по русски описать не проблема,а вот на си некоторые функции сделать проблема

вы удивитесь насколько легко переложить алгоритм на любой язык програмирования...

проблема только в том что вы не можете составить алгоритм...

это не типа 
уперся

подождал

повернул

уперся

алгоритм это более детально

представляйте что вам нужно осмыслено двигать ногами.

уперся потому что от лба пришел глухой звук в датчики слуха

отключил все

подал сигнал мышче на правой ноге поднять ногу

подал сигнал мышцам переставить ногу назад на 2 градуса..

проверил не пришел ли опять глухой стук от лба :)

 

mrbin
Offline
Зарегистрирован: 01.02.2015

Легко опытному программисту,а для чайника тяжеловато

mrbin
Offline
Зарегистрирован: 01.02.2015

да я и не программист ,так просто заинтересовало,увлекло.

Puhlyaviy
Puhlyaviy аватар
Offline
Зарегистрирован: 22.05.2013

mrbin пишет:

да я и не программист ,так просто заинтересовало,увлекло.

вот тут я не понял

если меня что то заинтересовало и увлекло. я буду сидеть и читать горы книг и вникать и пробывать...

а вас что увлекло и заинтересовало, ожидание что кто то в интернет для вас все сделает? в чем смысл?

 

mrbin
Offline
Зарегистрирован: 01.02.2015

так я ни кого и не прошу ,за меня делать,сижу читаю, изучаю.

Puhlyaviy
Puhlyaviy аватар
Offline
Зарегистрирован: 22.05.2013

mrbin пишет:

так я ни кого и не прошу ,за меня делать,сижу читаю, изучаю.

ну ждемс тогда

mrbin
Offline
Зарегистрирован: 01.02.2015

вот допустим если не трудно вам конечно

if(digitalRead(LeftBumper)==HIGH)//если кнопка нажата ...
{  
  // запоминаем время начатия
  LeftBumperPressTime = millis();
  vpravo();
  analogWrite(LeftMotorSpeed,140);
  analogWrite(RightMotorSpeed,140);
  delay(100); 
}

сработал левый датчик,запоминаем время начатия,при этом поворачиваем на право,отсчитываем допустим две секунды,если в течении двух секунд не сработал правый датчик едем прямо,вот в отчете времени не могу понять

Puhlyaviy
Puhlyaviy аватар
Offline
Зарегистрирован: 22.05.2013

а чего тут понимать то?

1000millis = 1 second 

Joiner
Offline
Зарегистрирован: 04.09.2014

mrbin пишет:

 

сработал левый датчик,запоминаем время начатия,при этом поворачиваем на право,отсчитываем допустим две секунды,если в течении двух секунд не сработал правый датчик едем прямо,вот в отчете времени не могу понять

Время можно измерять примерно как зесь http://arduino.ru/tutorials/BlinkWithoutDelay

 

Puhlyaviy
Puhlyaviy аватар
Offline
Зарегистрирован: 22.05.2013

Joiner пишет:

Время можно измерять примерно как зесь http://arduino.ru/tutorials/BlinkWithoutDelay

то есть, ты добавляешь гавна в вентиляторе?

давай без всяких заумных оптимизаций... пусть пишет как может....

Joiner
Offline
Зарегистрирован: 04.09.2014

Puhlyaviy пишет:

Joiner пишет:

Время можно измерять примерно как зесь http://arduino.ru/tutorials/BlinkWithoutDelay

то есть, ты добавляешь гавна в вентиляторе?

давай без всяких заумных оптимизаций... пусть пишет как может....

Не совсем понял, чем неугодил.

Я имел в виду что замеряемый интервал времени = currentMillis - previosMillis

А дальше проверяй условие какой датчик сработал, сколько времени между срабатываниями, что в данной ситуации делать

Puhlyaviy
Puhlyaviy аватар
Offline
Зарегистрирован: 22.05.2013

Joiner пишет:

Не совсем понял, чем неугодил.

Я имел в виду что замеряемый интервал времени = currentMillis - previosMillis

А дальше проверяй условие какой датчик сработал, сколько времени между срабатываниями, что в данной ситуации делать

тем что путаешь человека.... путь который ты предлагаешь не является очевидным и понятным.. если ты попробуешь сам написать алгоритм по описаному тобой.. то скорее всего получиться такой пирог что окосеешь :)

он научился запоминать время срабатывания датчиков... ему на данный момент осталось сделать всего один не большой шаг...

буквально функция в пару строчек :)

Joiner
Offline
Зарегистрирован: 04.09.2014

Puhlyaviy пишет:

всего один не большой шаг...

буквально функция в пару строчек :)

Т.к. я сам новичок

Интересненько..... Буду ждать результат

mrbin
Offline
Зарегистрирован: 01.02.2015

вот эти пару строк и не могу понять как зделать

Puhlyaviy
Puhlyaviy аватар
Offline
Зарегистрирован: 22.05.2013

mrbin пишет:

вот эти пару строк и не могу понять как зделать

а чего делать то? после строки где запоминаете время касания

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

тупо одна строчка IF праваясторона-леваясторона<2000 повертаем на180 градусов влево...

mrbin
Offline
Зарегистрирован: 01.02.2015

Примерно вот так?

if(LeftBumper- RightBumper <= INTERVAL)

 

Puhlyaviy
Puhlyaviy аватар
Offline
Зарегистрирован: 22.05.2013

mrbin пишет:

Примерно вот так?

if(LeftBumper- RightBumper <= INTERVAL)

 

угу и дальше добавь ему поворот. на забудь что у тебя там и так дальше поворот уже вписал обычный.. 

и тоже самое вставить в обработку нажатия другой кнопки.. только наоборот.

Joiner
Offline
Зарегистрирован: 04.09.2014

mrbin пишет:

Примерно вот так?

if(LeftBumper- RightBumper <= INTERVAL)

 

Пиши полностью что получилось, может кто-нибудь подскажет где косяк.

mrbin
Offline
Зарегистрирован: 01.02.2015

Позже 

Joiner
Offline
Зарегистрирован: 04.09.2014

Puhlyaviy пишет:

.... то просто сделайте поворот болееееееееееее длинныыыыыыым. плюс потом выполниться еще поворт который у вас дальше по програме выполняется и получиться что робот просто разверулся

тупо одна строчка IF праваясторона-леваясторона<2000 повертаем на180 градусов влево...

Как он сделает более длинный поворот, если воткнулся в угол? Надо сделать более длинный откат назад.

Puhlyaviy
Puhlyaviy аватар
Offline
Зарегистрирован: 22.05.2013

Joiner пишет:

Как он сделает более длинный поворот, если воткнулся в угол? Надо сделать более длинный откат назад.

молча... у него 2 колеса и он поворачивается на месте :)

mrbin
Offline
Зарегистрирован: 01.02.2015

и он круглый ,так что сможет

Joiner
Offline
Зарегистрирован: 04.09.2014

mrbin пишет:

и он круглый ,так что сможет

Понятненько :)

mrbin
Offline
Зарегистрирован: 01.02.2015

зделал вот так,не идет

if(digitalRead(RightBumper)==HIGH)//если кнопка нажата ...
{
  RightBumperPressTime = millis();
  
  if(LeftBumper -RightBumper <=INTERVAL )
  {
 
  nazad();
  analogWrite(LeftMotorSpeed,140);
  analogWrite(RightMotorSpeed,140);
  delay(100); 
 }
}

 

denis_n73
Offline
Зарегистрирован: 24.07.2015

RightBumper я так понимаю это пин кнопки и вы его используете для сравнения времени??? О_о

mrbin
Offline
Зарегистрирован: 01.02.2015

да

mrbin
Offline
Зарегистрирован: 01.02.2015

Да

denis_n73
Offline
Зарегистрирован: 24.07.2015

посмотри пример BlinkWithoutDelay.

А еще отлавливай фронты нажатия кнопки для фиксирования начала замера времени с момента нажатия кнопки.