123
Главная » 2015 » Март » 18 » "ПРОГРАММА" РОБОТА МИНИ-СУМО ЧАСТЬ3
23:21
"ПРОГРАММА" РОБОТА МИНИ-СУМО ЧАСТЬ3


ПРОГРАММА" РОБОТА МИНИ-СУМО. Заключительная статья по сборке робота мини-сумо. В первой части статьи "Шасси для робота мини-сумо" было подробно рассказано о том как изготовить шасси робота. В этой статье подробно разберём составление программы для робота. Наш робот готов. У него есть шасси, функцию «мозгов» выполнит микроконтроллер, а связь с внешним миром осуществят датчики. Но, не смотря на все это, он так и будет стоять на столе неподвижно. И чтобы этого не случилось, в наше творение пора вдохнуть жизнь, так сказать, почувствовать себя «создателем» окончательно. Программа, которую мы создадим, не только оживит робота, но и заставит его вести себя на ринге осмысленно и логично.


 

***

 

 

1. Основа программы-алгоритм.

 

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

 

Не буду использовать научные термины, скажу просто, Алгоритм – это описание  последовательности неких действий. Вся наша жизнь – это различные действия; мы ходим, говорим, двигаем руками и ногами, вертим головой. У всего этого есть свой смысл - алгоритм, последовательность, которая определяет наше поведение, и его можно составить и описать. Для наглядности приведу пример из жизни. Вы каждое утро чистите зубы. Попробуйте описать, как вы это делаете, как бы составьте программу для себя. Вот что получится: «Берем зубную щетку. Выдавливаем пасту. Чистим зубы движениями влево-вправо.  Полощем рот. Моем щетку».

 

В принципе все верно, но эту маленькую программу мы можем выполнить в обед, вечером или после каждого приема пищи.  Но мы не учли важные факторы, которые могут свести на НЕТ все наши старания. Изначально мы говорили про утро. Это важный фактор и если его не учесть, то чистить зубы придется лежа в постели и с закрытыми глазами. Поэтому всегда у любой программы должно быть какое-то начало и конец с возможностью повторения цикла. Повторяющимся циклом для человека является следующий день, где снова будет утро, и снова нужно будет чистить зубы. Поэтому добавим к нашей программе следующий алгоритм (последовательность действий).

 

«Проснуться. Встать с постели...» Если на этом этапе остановить создания алгоритма и перейти сразу к чистке зубов то программа застопорится (зависнет). Почему? Потому что мы снова не учли всех факторов. Вы стоите посреди своей спальни и не можете выполнить следующую команду; «Берем зубную щетку», так как щетка находится в ванной, а в нее нужно еще дойти. Ну, если вы спите в ванной, то нет проблем – программа выполнится! Но в большинстве случаев нормальные люди спят в другой комнате. Такой подход называется логическим, то есть осмысленным. Все наши действия должны быть разумными и содержать определенный смысл, иначе поставленная цель не будет достигнута. Поэтому «Проснуться. Встать с постели. Пойти в ванную комнату», будет наилучшим вариантом.

 

Вернемся к роботу. Как же теперь нам составить план действий робота мини-сумо на ринге? У нас есть правила, где четко обозначена цель - «Вытолкнуть противника за пределы ринга». Но для ее достижения нужно учитывать определенные факторы. Основной фактор это не выйти за пределы круга самому, а если быть точнее, то не выйти за белую границу круга. Вот что у нас получилось:

 

Рис. 1 Алгоритм поведения робота на ринге.

 

На рисунке 1 вы видите блок-схему. По всем правилам, именно так принято составлять  алгоритмы. Наглядно и понятно.

 

Первый блок – «Начало». С этого момента программа начинает выполнение действий  робота после включения. Первое что он должен будет сделать – это найти противника, блок «Поиск цели».  Следующий блок нашей схемы в виде ромбика «Цель найдена?». Это означает, что перед нами будет стоять выбор действий по достижению определенного события. Если цель найдена (Да), то мы продолжим выполнение программы и перейдем к следующей части программы «Атаковать», но если цель не найдена (Нет), то логичнее всего продолжить ее поиск.  Программа зациклится на этом моменте, пока робот не обнаружит противника. При атаке робот движется вперед на противника, пытаясь вытолкнуть его за пределы ринга, в этот момент работает блок «Достигнут край ринга?», если край ринга не достигнут, то атака продолжается, но если датчики обнаружили белую полосу края, то атака прекращается и программа переходит к следующему блоку «Отъезжаем назад» и «Разворот». После разворота, цикл основной программы повторяется, то есть она начинается с самого начала и робот снова ищет противника. Так сделано неспроста. Если в момент атаки, противнику удалось улизнуть от нашего робота, то мы должны вернуться к его поиску не выехав за край ринга. С теорией все. Перейдем к практике.

 

 

2. Правила написания программ для Arduino.

 

Хоть я и говорил что с теоретической частью покончено, но нам следует изучить принцип построения программы для микроконтроллеров Arduino, хотя эти принципы будут верными и для других МК семейства  AVR.

 

Рис. 2 Метод написания программы для Arduino.

 

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

 

В самом начале программы при необходимости подключаются дополнительные модули. Затем объявляются глобальные переменные.  Далее идет блок инициализации контроллера. В нем определяются назначения портов, вход это или выход и другие настройки. Так же из этого блока могут быть вызваны дополнительные вспомогательные подпрограммы. Если быть кратким, то в этом месте программа производит предварительные настройки контроллера. Этот блок выполняется один раз при старте или перезагрузке контроллера. Обратите внимание, в блоке  добавлена строчка «задержка 5 сек». К общим правилам написания программы это не относится, но для робота мини-сумо  необходимо. В правилах сказано, что после команды судьи роботы должны начать движение по истечении 5 секунд.  Данную задержку нельзя выполнять в основном цикле программы, так как она будет постоянно повторяться, и поведение робота изменится не в лучшую сторону.

 

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

 

 

3. Средство разработки Arduino IDE.

 

Скачайте  с сайта Arduino.ru последнюю версию Arduino IDE. Программа не требует какой-то специальной установки, достаточно распаковать содержимое архива в нужное место. В конце данной статьи находится файл библиотеки УЗ дальномера Ultrasonic. Его следует распаковать в папку Libraries.

Запускаем приложение. Проверяем правильность установки библиотеки, заходим в меню, «Файл» - «Примеры». Почти в самом низу должен появиться пункт Ultrasonic как на рис. 3.

 

Рис. 3  Проверка правильности установки библиотеки Ultrasonic.

 

Если все нормально, переходим в пункт «Сервис» - «Плата». Нам необходимо выбрать нашу плату – Arduino Pro Mini 5v.

 

Рис. 4  настройка платы контроллера

 

Последовательный порт необходимо выбрать тот, который появится после подключения Arduino к компьютеру. Следует немного сказать по поводу Arduino Pro Mini. В отличие от других контроллеров семейства Arduino, у Pro Mini нет встроенного модуля соединения с компьютером. Он поставляется отдельно в виде платы адаптера  USB to UART(TTL) и при помощи четырех проводков соединяется с платой контроллера. 

 

Рис. 5 USB-UART (TTL) адаптер.

 

На рис. 6 показано, как правильно нужно соединить контроллер и адаптер.

 

Рис. 6. Соединение контроллера с USB-UART адаптером.

 

В отличии от принятого соединения сигнальных линий, вместо RX-TX и TX-RX эти линии нужно соединять напрямую: RX-RX, TX-TX. При первом подключении  адаптера к компьютеру  автоматически начнется установка драйверов устройства. Следует дождаться окончания установки. Еще одной особенностью контроллера является отсутствия программного сброса Reset в момент программирования. Это конечно немного неудобно, но не настолько чтобы отказаться от Pro Mini. Достаточно нажать кнопку Reset на контроллере после того, как надпись «Компилирование» сменится на «Загрузка», Рис. 7.

 

Рис. 7. Отображение информации о ходе программирования МК.

 

 

4. Пишем код.

 

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

 

Рис. 8. Написания начального блока программы.

 

Первый блок: директива # подключает к нашему проекту библиотеку управления модулем .

Второй блок: Объявляем переменные и записываем в них начальные значения равные нулю. Обращаю ваше внимание, что мы не будем создавать имена для портов выводов МК. Я намеренно оставил их в цифровом виде, чтобы вам было удобно сверяться с принципиальной схемой. В данном блоке мы объявляем всего три переменные - это левый и правый датчики ринга (_и _) в них будут записаны значения АЦП. А так же переменная расстояния УЗ дальномера (_), в нее запишется расстояние в сантиметрах до препятствия.

Строчка Ultrasonic ultrasonic (4, 2), не что иное, как объявление переменной для УЗ дальномера, взятое из примера подключенной библиотеки. В скобках указаны порты, к которым подключены ножки датчика и .

Третий блок: (), в нем мы настраиваем все входы и выходы микроконтроллера. Входящие сигналы мы будем принимать портами 15, 17, поэтому назначаем им (Вход). Двигателями у нас управляют четыре порта: 3,5 для левого двигателя и 6,9 для правого двигателя, назначаем их как выход .

Почему мы задействуем для одного двигателя два порта? Все просто; если на контакты мотора подать напряжение он начнет крутиться в одну из сторон, скажем по часовой стрелке. Но если изменить полярность, т.е. поменять «плюс» и «минус» - вал моторчика будет крутиться в другую сторону. Это свойство мы и будем использовать для полноценных маневров.

 

5. Основной цикл loop.

 

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

Рассмотрим структуру нашего цикла на основе алгоритма рис. 9

 

Рис. 9. Алгоритм основного цикла Loop.

 

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

 

void check_sensor() // Подпрограмма проверки сенсоров.

{

  R_Sensor=analogRead(15);                     // считываем показания правого датчика

  delay(10);                                                        //задержка для окончания преобразования АЦП

  L_Sensor=analogRead(17);                      // считываем показания левого датчика

  delay(10);                                                        //задержка для окончания преобразования АЦП

  dist_cm = ultrasonic.Ranging(CM);       // считываем показания УЗ дальномера

  delay(10);                                                        // Задержка для окончания преобразования

}

 

 

После получения данных нам нужно их обработать. Сначала мы должны определить свое местоположение, на ринге мы ли нет. Если на ринге проверяем наличие противника в пределах 40 см. Если противника нет, мы его ищем поворачиваясь налево процедура:

 

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_forward()  //Атакуем - движение вперед

{

    analogWrite(3, 0);    //LEFT MOTOR

    analogWrite(5, 255);  //LEFT MOTOR

    analogWrite(6, 0);    //RIGHT MOTOR

    analogWrite(9, 255);  //RIGHT MOTOR

}

 

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

 

{

     go_stop();                     // Остановка

     delay(100);                   //Ждем 10 мс

     go_back();                    //Движемся назад

     delay(1000);                 //1 секунду.

     go_right();                    //Поворачиваем направо

     delay(300);                   //300 мс

     go_forward();             //Движемся вперед

     delay(300);                   //300 мс

     }

 

 

void go_stop() //остановка

{

    analogWrite(3, 255); //LEFT MOTOR

    analogWrite(5, 255); //LEFT MOTOR

    analogWrite(6, 255); //RIGHT MOTOR

    analogWrite(9, 255); //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_forward()  //Атакуем движение вперед

{

    analogWrite(3, 0);    //LEFT MOTOR

    analogWrite(5, 255);  //LEFT MOTOR

    analogWrite(6, 0);    //RIGHT MOTOR

    analogWrite(9, 255);  //RIGHT MOTOR

}

 

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

 

Полный скетч для скачивания, находится в конце статьи.

 

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

 

 

 Архив 1 к статье "Программа робота минисумо". Скачать архив

 Архив 2 к статье "Программа робота минисумо". Скачать архив

 


Если у ВАС возникли вопросы пишите на ФОРУМЕ или в Online чат по робототехнике мы их обсудим!

автор Андрей Андросов www.servodroid.ru

© Внимание! Полное либо частичное копирование материала без разрешения администрации запрещено!

Категория: Роботы для соревнований | Просмотров: 9135 | Добавил: Droid | Рейтинг: 0.0/0
Всего комментариев: 0
avatar