Не пашет датчик края ринга с Ардуино

Как собрать и запрограммировать робота на Arduino(Freeduino, Roboduino, Seeduino ...). Используем Wiring и Processing.

Не пашет датчик края ринга с Ардуино

Сообщение ol82 » 19 авг 2016, 21:57

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

Re: Не пашет датчик края ринга с Ардуино

Сообщение Myp » 20 авг 2016, 00:46

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

Re: Не пашет датчик края ринга с Ардуино

Сообщение ol82 » 20 авг 2016, 10:13

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

Re: Не пашет датчик края ринга с Ардуино

Сообщение Angel71 » 20 авг 2016, 10:53

в студии ардуины есть меню, в нём "инструменты" и там "монитор порта". в коде скетча всё просто - стандартный ввод/вывод через уарт 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(битрейт)) и какими символами кодируется конец строки.
Аватара пользователя
Angel71
 
Сообщения: 10668
Зарегистрирован: 18 апр 2009, 22:18

Re: Не пашет датчик края ринга с Ардуино

Сообщение ol82 » 20 авг 2016, 12:08

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

Re: Не пашет датчик края ринга с Ардуино

Сообщение Myp » 20 авг 2016, 12:28

надо написать вывод данных в компорт
после строки вычисления показаний датчика вывести показания в порт
R_Sensor=analogRead(15);
Serial.print("R_Sensor: ");
Serial.print(R_Sensor);

тоже самое и для левого сенсора
<telepathmode>На вопросы отвечает Бригадир Телепатов!</telepathmode>
Всё уже придумано до нас!
Аватара пользователя
Myp
скрытый хозяин вселенной :)
 
Сообщения: 18018
Зарегистрирован: 18 сен 2006, 12:26
Откуда: Тверь по прозвищу Дверь
прог. языки: псевдокод =) сила в алгоритме!
ФИО: глубокоуважаемый Фёдор Анатольевич

Re: Не пашет датчик края ринга с Ардуино

Сообщение ol82 » 20 авг 2016, 12:52

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

Re: Не пашет датчик края ринга с Ардуино

Сообщение Myp » 20 авг 2016, 22:56

чёрный цвет хоть не маркером рисовал? маркер например ИК отражает нормально.
вобще судя по цифрам, разброс достаточно большой, и вроде должно работать.

выложи код твой, может кто-то разберётся.
<telepathmode>На вопросы отвечает Бригадир Телепатов!</telepathmode>
Всё уже придумано до нас!
Аватара пользователя
Myp
скрытый хозяин вселенной :)
 
Сообщения: 18018
Зарегистрирован: 18 сен 2006, 12:26
Откуда: Тверь по прозвищу Дверь
прог. языки: псевдокод =) сила в алгоритме!
ФИО: глубокоуважаемый Фёдор Анатольевич

Re: Не пашет датчик края ринга с Ардуино

Сообщение ol82 » 21 авг 2016, 09:49

Так код-то тот самый скетч с Серводроида.

Добавлено спустя 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 мс
     }

}


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

Re: Не пашет датчик края ринга с Ардуино

Сообщение Eruman » 21 авг 2016, 10:04

Код, похоже, адекватный.

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

Кстати, полезно было бы поправить код так, и посмотреть, что выводится во время пересечения границы.
Код: Выделить всё
// Подключение модуля ультрозвукового сенсора
#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 мс
     }

}

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

Re: Не пашет датчик края ринга с Ардуино

Сообщение ol82 » 21 авг 2016, 13:50

Eruman писал(а):Может с чего датчиками не так? Если от программы не зависит, сталобыть аппаратно шшупать нужно.
Кстати, полезно было бы поправить код так, и посмотреть, что выводится во время пересечения границы.
[/code]

Блин, датчики - 3 сосны. 300ом на светодиод, с фотодиода выход и подтяжка 47к на +.
Спасибо, поправил, вывелось дофига всего, (монитор.txt). А нельзя из скетча выделить кусок, по которому можно проверить правильность подключения моторов? Тут много чего напутать можно. Хочу убедиться, что правильно их соединил.
Поведение сейчас такое: рывками задницей выезжает с ринга и уже на белом поле начинает поворачиваться и искать цель. Найдя - едет вперед!
Еще вопрос, имеет ли значение левый и правый сенсор, на плате напутал при разводке и они у меня поменяны. Но это, наверное, можно поправить в скетче.
Вложения
Монитор.txt
(6.5 КиБ) Скачиваний: 348
Аватара пользователя
ol82
 
Сообщения: 44
Зарегистрирован: 19 авг 2016, 08:04
Откуда: Село на юго-востоке Нижегородской области
прог. языки: Безграмотный

Re: Не пашет датчик края ринга с Ардуино

Сообщение Eruman » 21 авг 2016, 18:43

Ну так сразу ясно: при старте пятится - стало быть перекинуть провода на моторах, или поменять код в подпрограммах, например:
Код: Выделить всё
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
}

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

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

Сенсоры у вас оцениваются в программе сразу парой, поэтому их порядок не важен. А вот когда решите поворот делать от края в соответствии с его положением относительно бота, тогда придется разобраться.
Соединяй и здравствуй.
Аватара пользователя
Eruman
 
Сообщения: 897
Зарегистрирован: 12 авг 2010, 15:10
Откуда: Астраханская обл.

Re: Не пашет датчик края ринга с Ардуино

Сообщение ol82 » 21 авг 2016, 23:00

Мистика какая-то. Но ведь когда он засекает банку из под 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 ардуины тоже самое. Едет напропалую, пофигу все границы. Где еще что смотреть, не знаю.
Аватара пользователя
ol82
 
Сообщения: 44
Зарегистрирован: 19 авг 2016, 08:04
Откуда: Село на юго-востоке Нижегородской области
прог. языки: Безграмотный

Re: Не пашет датчик края ринга с Ардуино

Сообщение Eruman » 21 авг 2016, 23:13

Видео на ютуб. Ссылку сюда в соответствующий тэг.

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

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

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

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


то есть, пока на черном круге, бот вращается, и ищет цель.
Соединяй и здравствуй.
Аватара пользователя
Eruman
 
Сообщения: 897
Зарегистрирован: 12 авг 2010, 15:10
Откуда: Астраханская обл.

Re: Не пашет датчик края ринга с Ардуино

Сообщение ol82 » 21 авг 2016, 23:54

А не должно быть наоборот, как здесь:
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:
Аватара пользователя
ol82
 
Сообщения: 44
Зарегистрирован: 19 авг 2016, 08:04
Откуда: Село на юго-востоке Нижегородской области
прог. языки: Безграмотный

След.

Вернуться в Arduino и другие Xduino

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

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