roboforum.ru

Технический форум по робототехнике.
Текущее время: 04 май 2025, 02:31

Часовой пояс: UTC + 4 часа




Начать новую тему Ответить на тему  [ Сообщений: 25 ]  На страницу 1, 2  След.
Автор Сообщение
 Заголовок сообщения: Не пашет датчик края ринга с Ардуино
СообщениеДобавлено: 19 авг 2016, 21:57 
Не в сети
Аватара пользователя

Зарегистрирован: 19 авг 2016, 08:04
Сообщения: 44
Откуда: Село на юго-востоке Нижегородской области
прог. языки: Безграмотный
Друзья! Прошу помощи. Я собрал робота на Ардуино мини про по схеме с Серводроида. Все пашет (про глюк с питанием отдельно спрошу), но плохо работают датчики края ринга, вернее совсем не пашут. Обычные IR-светодиод и фототранзистор. Выход с них включен на АЦП контроллера и там должно оцениваться 28-30 - светлый фон, 700-850 - темный. Сумобот ездит, как будто и нет датчика края.
В тоже время, если я ставлю эту лопату с датчиками на другую плату (минисумо Гунтиса, с датагора) датчики прекрасно и устойчиво работают. Там все просто - высокий уровень с датчика - черный фон, низкий - граница. Можно применить любые китайские датчики и все прекрасно работает. Но там со "зрением" засада.
Меня это достало, хочу чтоб тупо работало - 1-ринг, 0-край.
Вся загвоздка в том, что я могу что угодно спаять, но программировать я не умею совсем. А так как я уже почти дед, а не школьник, начинать учиться поздновато.
Скетч находится здесь,www.servodroid.ru/Droid/files/Mini_sumo3.zip
Может там косяк какой, а? Прошу помощи в правке скетча.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Не пашет датчик края ринга с Ардуино
СообщениеДобавлено: 20 авг 2016, 00:46 
Не в сети
скрытый хозяин вселенной :)
Аватара пользователя

Зарегистрирован: 18 сен 2006, 12:26
Сообщения: 18018
Откуда: Тверь по прозвищу Дверь
прог. языки: псевдокод =) сила в алгоритме!
ФИО: глубокоуважаемый Фёдор Анатольевич
неплохо бы сделать вывод значения показаний сенсора в терминал и посмотреть какие цифры получаются на чёрном и на белом фоне.
в скетче настроен порог срабатывания на уровне 100, возможно надо сдвинуть этот порог.

_________________
<telepathmode>На вопросы отвечает Бригадир Телепатов!</telepathmode>
Всё уже придумано до нас!


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Не пашет датчик края ринга с Ардуино
СообщениеДобавлено: 20 авг 2016, 10:13 
Не в сети
Аватара пользователя

Зарегистрирован: 19 авг 2016, 08:04
Сообщения: 44
Откуда: Село на юго-востоке Нижегородской области
прог. языки: Безграмотный
Я по-разному менял с 10 и до 800. Что-то меняется, но все равно выезжает за край.
С помощью IDE+CP2101 можно организовать вывод на терминал, или нужно ГиперТерминал и как-то соединяться?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Не пашет датчик края ринга с Ардуино
СообщениеДобавлено: 20 авг 2016, 10:53 
Не в сети
Аватара пользователя

Зарегистрирован: 18 апр 2009, 22:18
Сообщения: 10668
в студии ардуины есть меню, в нём "инструменты" и там "монитор порта". в коде скетча всё просто - стандартный ввод/вывод через уарт https://www.arduino.cc/en/Reference/Serial, http://arduino.ru/Reference/Serial. вывод допустим через принт https://www.arduino.cc/en/Serial/Print, http://arduino.ru/Reference/Serial/Print
в окне монитора порта настраивается битрейт порта (в коде это Serial.begin(битрейт)) и какими символами кодируется конец строки.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Не пашет датчик края ринга с Ардуино
СообщениеДобавлено: 20 авг 2016, 12:08 
Не в сети
Аватара пользователя

Зарегистрирован: 19 авг 2016, 08:04
Сообщения: 44
Откуда: Село на юго-востоке Нижегородской области
прог. языки: Безграмотный
Открыл монитор порта, СОМ3/9600, залил скетч, в мониторе пусто. Какие действия дальше?


Вложения:
ps1.png
ps1.png [ 73.42 КиБ | Просмотров: 2827 ]
Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Не пашет датчик края ринга с Ардуино
СообщениеДобавлено: 20 авг 2016, 12:28 
Не в сети
скрытый хозяин вселенной :)
Аватара пользователя

Зарегистрирован: 18 сен 2006, 12:26
Сообщения: 18018
Откуда: Тверь по прозвищу Дверь
прог. языки: псевдокод =) сила в алгоритме!
ФИО: глубокоуважаемый Фёдор Анатольевич
надо написать вывод данных в компорт
после строки вычисления показаний датчика вывести показания в порт
R_Sensor=analogRead(15);
Serial.print("R_Sensor: ");
Serial.print(R_Sensor);

тоже самое и для левого сенсора

_________________
<telepathmode>На вопросы отвечает Бригадир Телепатов!</telepathmode>
Всё уже придумано до нас!


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Не пашет датчик края ринга с Ардуино
СообщениеДобавлено: 20 авг 2016, 12:52 
Не в сети
Аватара пользователя

Зарегистрирован: 19 авг 2016, 08:04
Сообщения: 44
Откуда: Село на юго-востоке Нижегородской области
прог. языки: Безграмотный
Да, получилось. Видимо, черный цвет у меня слишком светлый. Временный бумажный полигон. Но "Гунтисовский" бот легко все видел. И какое значение поставить в скетч? Все равно со значением в 100 все должно работать. :(


Вложения:
White.png
White.png [ 27.14 КиБ | Просмотров: 2819 ]
Black.png
Black.png [ 31.13 КиБ | Просмотров: 2827 ]
Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Не пашет датчик края ринга с Ардуино
СообщениеДобавлено: 20 авг 2016, 22:56 
Не в сети
скрытый хозяин вселенной :)
Аватара пользователя

Зарегистрирован: 18 сен 2006, 12:26
Сообщения: 18018
Откуда: Тверь по прозвищу Дверь
прог. языки: псевдокод =) сила в алгоритме!
ФИО: глубокоуважаемый Фёдор Анатольевич
чёрный цвет хоть не маркером рисовал? маркер например ИК отражает нормально.
вобще судя по цифрам, разброс достаточно большой, и вроде должно работать.

выложи код твой, может кто-то разберётся.

_________________
<telepathmode>На вопросы отвечает Бригадир Телепатов!</telepathmode>
Всё уже придумано до нас!


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Не пашет датчик края ринга с Ардуино
СообщениеДобавлено: 21 авг 2016, 09:49 
Не в сети
Аватара пользователя

Зарегистрирован: 19 авг 2016, 08:04
Сообщения: 44
Откуда: Село на юго-востоке Нижегородской области
прог. языки: Безграмотный
Так код-то тот самый скетч с Серводроида.

Добавлено спустя 36 секунд:
Или его прям сюда вставить?


Код:
// Подключение модуля ультрозвукового сенсора
#include <Ultrasonic.h>


//объявление глобальных переменных
int L_Sensor=0; //Левый сенсор
int R_Sensor=0; //Правый сенсор
float dist_cm=0; // Значение расстояния
Ultrasonic ultrasonic(4, 2); // Назначение портов УЗ сенсора. Trig, Echo



void setup()// Модуль инициализации
{
pinMode( 15 , INPUT); // Вход правого сенсора
pinMode( 17 , INPUT); // Вход левого сенсора
pinMode(3, OUTPUT); //B-B     Назад  - Левый мотор
pinMode(5, OUTPUT); //B-1A    Вперед - Левый мотор
pinMode(6, OUTPUT); //A-B     Назад  - Правый мотор
pinMode(9, OUTPUT); //A-1A    Вперед - Правый мотор
Serial.begin(9600); // Активация передачи данных через терминал
delay(5000); // Задержка старта 5 сек.
}

void go_forward()  //Атакуем движение вперед
{
    analogWrite(3, 0);    //LEFT MOTOR
    analogWrite(5, 255);  //LEFT MOTOR
    analogWrite(6, 0);    //RIGHT MOTOR
    analogWrite(9, 255);  //RIGHT MOTOR
}

void go_left() // поиск цели или движение налево
{     
    analogWrite(3, 0);   //LEFT MOTOR
    analogWrite(5, 100); //LEFT MOTOR
    analogWrite(6, 100); //RIGHT MOTOR
    analogWrite(9, 0);   //RIGHT MOTOR
}

void go_back () //двидение назад
{
    analogWrite(3, 255); //LEFT MOTOR
    analogWrite(5, 0);   //LEFT MOTOR
    analogWrite(6, 255); //RIGHT MOTOR
    analogWrite(9, 0);   //RIGHT MOTOR
}
void go_right () //поиск цели или движение направо
{
    analogWrite(3, 100);  //LEFT MOTOR
    analogWrite(5, 0);    //LEFT MOTOR
    analogWrite(6, 0);    //RIGHT MOTOR
    analogWrite(9, 100);  //RIGHT MOTOR
}

void go_stop() //остановка
{
    analogWrite(3, 255); //LEFT MOTOR
    analogWrite(5, 255); //LEFT MOTOR
    analogWrite(6, 255); //RIGHT MOTOR
    analogWrite(9, 255); //RIGHT MOTOR
}

void check_sensor() // Подпрограмма проверки сенсоров.
{
  R_Sensor=analogRead(15); // считываем показания с правого сенсора
  Serial.print("R_Sensor: ");
  Serial.print(R_Sensor);
  delay(10); // Ожидание преобразования АЦП
  L_Sensor=analogRead(17);// считываем показания с левого сенсора
  Serial.print("L_Sensor: ");
  Serial.print(L_Sensor);
  delay(10); // Ожидание преобразования АЦП
  dist_cm = ultrasonic.Ranging(CM);
  delay(10);// Ожидание преобразования
}


void loop()
{
  check_sensor(); // Проверяем сенсоры

 
  if (R_Sensor<100 and L_Sensor<100)
   {
     if (dist_cm>40) //Если дистанция до объекта больше 40 см то
         {
           go_left(); // поиск цели
         }
         else
         {
           go_forward(); //если поймана цель атакуем
         }
   }
    else
     {
     go_stop();      //Стоп!
     delay(100);     //Джем 100 мс
     go_back();      //Движемся назад
     delay(1000);    //1 секунду.
     go_right();     //Поворачиваем направо
     delay(300);     //300 мс
     go_forward();   //Движемся вперед
     delay(300);     //300 мс
     }

}




Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Не пашет датчик края ринга с Ардуино
СообщениеДобавлено: 21 авг 2016, 10:04 
Не в сети
Аватара пользователя

Зарегистрирован: 12 авг 2010, 15:10
Сообщения: 897
Откуда: Астраханская обл.
Код, похоже, адекватный.

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

Кстати, полезно было бы поправить код так, и посмотреть, что выводится во время пересечения границы.
Код:
// Подключение модуля ультрозвукового сенсора
#include <Ultrasonic.h>


//объявление глобальных переменных
int L_Sensor=0; //Левый сенсор
int R_Sensor=0; //Правый сенсор
float dist_cm=0; // Значение расстояния
Ultrasonic ultrasonic(4, 2); // Назначение портов УЗ сенсора. Trig, Echo



void setup()// Модуль инициализации
{
pinMode( 15 , INPUT); // Вход правого сенсора
pinMode( 17 , INPUT); // Вход левого сенсора
pinMode(3, OUTPUT); //B-B     Назад  - Левый мотор
pinMode(5, OUTPUT); //B-1A    Вперед - Левый мотор
pinMode(6, OUTPUT); //A-B     Назад  - Правый мотор
pinMode(9, OUTPUT); //A-1A    Вперед - Правый мотор
Serial.begin(9600); // Активация передачи данных через терминал
delay(5000); // Задержка старта 5 сек.
}

void go_forward()  //Атакуем движение вперед
{
    analogWrite(3, 0);    //LEFT MOTOR
    analogWrite(5, 255);  //LEFT MOTOR
    analogWrite(6, 0);    //RIGHT MOTOR
    analogWrite(9, 255);  //RIGHT MOTOR
}

void go_left() // поиск цели или движение налево
{     
    analogWrite(3, 0);   //LEFT MOTOR
    analogWrite(5, 100); //LEFT MOTOR
    analogWrite(6, 100); //RIGHT MOTOR
    analogWrite(9, 0);   //RIGHT MOTOR
}

void go_back () //двидение назад
{
    analogWrite(3, 255); //LEFT MOTOR
    analogWrite(5, 0);   //LEFT MOTOR
    analogWrite(6, 255); //RIGHT MOTOR
    analogWrite(9, 0);   //RIGHT MOTOR
}
void go_right () //поиск цели или движение направо
{
    analogWrite(3, 100);  //LEFT MOTOR
    analogWrite(5, 0);    //LEFT MOTOR
    analogWrite(6, 0);    //RIGHT MOTOR
    analogWrite(9, 100);  //RIGHT MOTOR
}

void go_stop() //остановка
{
    analogWrite(3, 255); //LEFT MOTOR
    analogWrite(5, 255); //LEFT MOTOR
    analogWrite(6, 255); //RIGHT MOTOR
    analogWrite(9, 255); //RIGHT MOTOR
}

void check_sensor() // Подпрограмма проверки сенсоров.
{
  R_Sensor=analogRead(15); // считываем показания с правого сенсора
  delay(10); // Ожидание преобразования АЦП
  L_Sensor=analogRead(17);// считываем показания с левого сенсора
  delay(10); // Ожидание преобразования АЦП
  dist_cm = ultrasonic.Ranging(CM);
  delay(10);// Ожидание преобразования
}

void display(const char* text) {
  Serial.print(text);
  Serial.print("  R_Sensor:"); Serial.print(R_Sensor);
  Serial.print("  L_Sensor:"); Serial.print(L_Sensor);
  Serial.print("  dist_cm:");  Serial.println(dist_cm);
}

void loop()
{

  check_sensor(); // Проверяем сенсоры
 
  if (R_Sensor<100 and L_Sensor<100)
   {
     display("WALK"); // <----------------------------------------------
     if (dist_cm>40) //Если дистанция до объекта больше 40 см то
         {
           display("SEARCH"); // <----------------------------------------------
           go_left(); // поиск цели
         }
         else
         {
           display("PUSH"); // <----------------------------------------------
           go_forward(); //если поймана цель атакуем
         }
   }
    else
     {
     display("STOP&TURN"); // <----------------------------------------------
     go_stop();      //Стоп!
     delay(100);     //Джем 100 мс
     go_back();      //Движемся назад
     delay(1000);    //1 секунду.
     go_right();     //Поворачиваем направо
     delay(300);     //300 мс
     go_forward();   //Движемся вперед
     delay(300);     //300 мс
     }

}


_________________
Соединяй и здравствуй.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Не пашет датчик края ринга с Ардуино
СообщениеДобавлено: 21 авг 2016, 13:50 
Не в сети
Аватара пользователя

Зарегистрирован: 19 авг 2016, 08:04
Сообщения: 44
Откуда: Село на юго-востоке Нижегородской области
прог. языки: Безграмотный
Eruman писал(а):
Может с чего датчиками не так? Если от программы не зависит, сталобыть аппаратно шшупать нужно.
Кстати, полезно было бы поправить код так, и посмотреть, что выводится во время пересечения границы.
[/code]

Блин, датчики - 3 сосны. 300ом на светодиод, с фотодиода выход и подтяжка 47к на +.
Спасибо, поправил, вывелось дофига всего, (монитор.txt). А нельзя из скетча выделить кусок, по которому можно проверить правильность подключения моторов? Тут много чего напутать можно. Хочу убедиться, что правильно их соединил.
Поведение сейчас такое: рывками задницей выезжает с ринга и уже на белом поле начинает поворачиваться и искать цель. Найдя - едет вперед!
Еще вопрос, имеет ли значение левый и правый сенсор, на плате напутал при разводке и они у меня поменяны. Но это, наверное, можно поправить в скетче.


Вложения:
Монитор.txt [6.5 КиБ]
Скачиваний: 371
Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Не пашет датчик края ринга с Ардуино
СообщениеДобавлено: 21 авг 2016, 18:43 
Не в сети
Аватара пользователя

Зарегистрирован: 12 авг 2010, 15:10
Сообщения: 897
Откуда: Астраханская обл.
Ну так сразу ясно: при старте пятится - стало быть перекинуть провода на моторах, или поменять код в подпрограммах, например:
Код:
void go_forward()  //Атакуем движение вперед
{
    analogWrite(3, 0);    //LEFT MOTOR
    analogWrite(5, 255);  //LEFT MOTOR
    analogWrite(6, 0);    //RIGHT MOTOR
    analogWrite(9, 255);  //RIGHT MOTOR
}

на такой:
Код:
void go_forward()  //Атакуем движение вперед
{
    analogWrite(3, 255);  //LEFT MOTOR
    analogWrite(5, 0);    //LEFT MOTOR
    analogWrite(6, 255);  //RIGHT MOTOR
    analogWrite(9, 0);    //RIGHT MOTOR
}

т.е. поменять направление их вращения. Для заднего хода тоже исправить на обратные.
Повороты нужно будет проверить отдельно.

Я бы просто провода на моторах перепаял, меньше возиться. Если они конечно доступны. :)

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

_________________
Соединяй и здравствуй.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Не пашет датчик края ринга с Ардуино
СообщениеДобавлено: 21 авг 2016, 23:00 
Не в сети
Аватара пользователя

Зарегистрирован: 19 авг 2016, 08:04
Сообщения: 44
Откуда: Село на юго-востоке Нижегородской области
прог. языки: Безграмотный
Мистика какая-то. Но ведь когда он засекает банку из под Vanish, он едет вперед, т.е. атакует. Ладно, сейчас попробую.
И еще момент. Сейчас вынул ардуину из платы и подключил к СР2102. Вижу, идет какой-то обмен, открываю монитор, а там STOP&TURN R_Sensor:223 L_Sensor:246 dist_cm:0.00 Это что за фигня?

Добавлено спустя 3 часа 9 минут 30 секунд:
Vcc=5,04в, на выходе ИК-сенсоров 4,3/4,3в на темном фоне, и 0,22/0,25в на белом. На выводах 15 и 17 ардуины тоже самое. Едет напропалую, пофигу все границы. Где еще что смотреть, не знаю.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Не пашет датчик края ринга с Ардуино
СообщениеДобавлено: 21 авг 2016, 23:13 
Не в сети
Аватара пользователя

Зарегистрирован: 12 авг 2010, 15:10
Сообщения: 897
Откуда: Астраханская обл.
Видео на ютуб. Ссылку сюда в соответствующий тэг.

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

Следуя вашим пояснениям по работе датчиков: У вас бот оценивает поле, и если светло - то проверяет УЗ-датчик. Если рядом никого нет, то поворачивает налево. Если рядом кто-то есть - атакует.

Иначе, если темное поле, то отъезжает и разворачивается.

Если у вас черный круг и белая граница, то должно быть:
Код:
if (R_Sensor>100 and L_Sensor>100)


то есть, пока на черном круге, бот вращается, и ищет цель.

_________________
Соединяй и здравствуй.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Не пашет датчик края ринга с Ардуино
СообщениеДобавлено: 21 авг 2016, 23:54 
Не в сети
Аватара пользователя

Зарегистрирован: 19 авг 2016, 08:04
Сообщения: 44
Откуда: Село на юго-востоке Нижегородской области
прог. языки: Безграмотный
А не должно быть наоборот, как здесь:
if (R_Sensor>100 and L_Sensor>100)
{
if (dist_cm>40) //Если дистанция до объекта больше 40 см то
{
go_left(); // поиск цели
}
else
{
go_forward(); //если поймана цель атакуем
}
}
Типа если мы на черном фоне (>100), то атакуем7

Добавлено спустя 9 минут:
Пока извилины напрягал, просмотрел Ваш ответ. Поменял галки и бот адекватно стал вести себя.

Добавлено спустя 3 минуты 15 секунд:
Я поставил >200. Еще не очень нравится, что далеко заскакивает за границу. Чем можно поправить, чтоб сразу назад драпал?

Добавлено спустя 4 минуты 9 секунд:
Фактически, все дело было в темном/светлом круге. Настолько очевидно, что сразу и не видно. :D

Добавлено спустя 2 минуты 45 секунд:
Большое спасибо всем, Eruman-у особенно. :beer:


Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 25 ]  На страницу 1, 2  След.

Часовой пояс: UTC + 4 часа


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 2


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
Русская поддержка phpBB
phpBB SEO