Технический форум по робототехнике.
ol82 » 19 авг 2016, 21:57
Друзья! Прошу помощи. Я собрал робота на Ардуино мини про по схеме с Серводроида. Все пашет (про глюк с питанием отдельно спрошу), но плохо работают датчики края ринга, вернее совсем не пашут. Обычные IR-светодиод и фототранзистор. Выход с них включен на АЦП контроллера и там должно оцениваться 28-30 - светлый фон, 700-850 - темный. Сумобот ездит, как будто и нет датчика края.
В тоже время, если я ставлю эту лопату с датчиками на другую плату (минисумо Гунтиса, с датагора) датчики прекрасно и устойчиво работают. Там все просто - высокий уровень с датчика - черный фон, низкий - граница. Можно применить любые китайские датчики и все прекрасно работает. Но там со "зрением" засада.
Меня это достало, хочу чтоб тупо работало - 1-ринг, 0-край.
Вся загвоздка в том, что я могу что угодно спаять, но программировать я не умею совсем. А так как я уже почти дед, а не школьник, начинать учиться поздновато.
Скетч находится здесь,www.servodroid.ru/Droid/files/Mini_sumo3.zip
Может там косяк какой, а? Прошу помощи в правке скетча.
Myp » 20 авг 2016, 00:46
неплохо бы сделать вывод значения показаний сенсора в терминал и посмотреть какие цифры получаются на чёрном и на белом фоне.
в скетче настроен порог срабатывания на уровне 100, возможно надо сдвинуть этот порог.
ol82 » 20 авг 2016, 10:13
Я по-разному менял с 10 и до 800. Что-то меняется, но все равно выезжает за край.
С помощью IDE+CP2101 можно организовать вывод на терминал, или нужно ГиперТерминал и как-то соединяться?
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(битрейт)) и какими символами кодируется конец строки.
ol82 » 20 авг 2016, 12:08
Открыл монитор порта, СОМ3/9600, залил скетч, в мониторе пусто. Какие действия дальше?
- Вложения
-

Myp » 20 авг 2016, 12:28
надо написать вывод данных в компорт
после строки вычисления показаний датчика вывести показания в порт
R_Sensor=analogRead(15);
Serial.print("R_Sensor: ");
Serial.print(R_Sensor);
тоже самое и для левого сенсора
ol82 » 20 авг 2016, 12:52
Да, получилось. Видимо, черный цвет у меня слишком светлый. Временный бумажный полигон. Но "Гунтисовский" бот легко все видел. И какое значение поставить в скетч? Все равно со значением в 100 все должно работать.

- Вложения
-

-

Myp » 20 авг 2016, 22:56
чёрный цвет хоть не маркером рисовал? маркер например ИК отражает нормально.
вобще судя по цифрам, разброс достаточно большой, и вроде должно работать.
выложи код твой, может кто-то разберётся.
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 мс
}
}
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 мс
}
}
ol82 » 21 авг 2016, 13:50
Eruman писал(а):Может с чего датчиками не так? Если от программы не зависит, сталобыть аппаратно шшупать нужно.
Кстати, полезно было бы поправить код так, и посмотреть, что выводится во время пересечения границы.
[/code]
Блин, датчики - 3 сосны. 300ом на светодиод, с фотодиода выход и подтяжка 47к на +.
Спасибо, поправил, вывелось дофига всего, (монитор.txt). А нельзя из скетча выделить кусок, по которому можно проверить правильность подключения моторов? Тут много чего напутать можно. Хочу убедиться, что правильно их соединил.
Поведение сейчас такое: рывками задницей выезжает с ринга и уже на белом поле начинает поворачиваться и искать цель. Найдя - едет вперед!
Еще вопрос, имеет ли значение левый и правый сенсор, на плате напутал при разводке и они у меня поменяны. Но это, наверное, можно поправить в скетче.
- Вложения
-
Монитор.txt
- (6.5 КиБ) Скачиваний: 367
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
}
т.е. поменять направление их вращения. Для заднего хода тоже исправить на обратные.
Повороты нужно будет проверить отдельно.
Я бы просто провода на моторах перепаял, меньше возиться. Если они конечно доступны.

Сенсоры у вас оцениваются в программе сразу парой, поэтому их порядок не важен. А вот когда решите поворот делать от края в соответствии с его положением относительно бота, тогда придется разобраться.
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 ардуины тоже самое. Едет напропалую, пофигу все границы. Где еще что смотреть, не знаю.
Eruman » 21 авг 2016, 23:13
Видео на ютуб. Ссылку сюда в соответствующий тэг.
По программе: у вас простой алгоритм работы бота. Все должно работать как часы.
А без датчиков у вас на портах наводки гуляют, вот и срабатывает что-попало.
Следуя вашим пояснениям по работе датчиков: У вас бот оценивает поле, и если светло - то проверяет УЗ-датчик. Если рядом никого нет, то поворачивает налево. Если рядом кто-то есть - атакует.
Иначе, если темное поле, то отъезжает и разворачивается.
Если у вас черный круг и белая граница, то должно быть:
- Код: Выделить всё • Развернуть
if (R_Sensor>100 and L_Sensor>100)
то есть, пока на черном круге, бот вращается, и ищет цель.
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 секунд:Фактически, все дело было в темном/светлом круге. Настолько очевидно, что сразу и не видно.
Добавлено спустя 2 минуты 45 секунд:Большое спасибо всем, Eruman-у особенно.
