Програма робота міні-сумо частина3 - 18 березень 2018 - servodroid - центр робототехніки для початківців

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

Як і раніше, нам не обійтися без якогось плану. У попередній статті нашим планом була принципова електрична схема. У програмування план, називається алгоритмом. Хтось із вас знає, що це таке, хтось просто чув, але є й ті, хто не знав і перший раз чує.

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

В принципі все вірно, але цю маленьку програму ми можемо виконати в обід, ввечері або після кожного прийому їжі. Але ми не врахували важливі фактори, які можуть звести на НІ всі наші старання. Спочатку ми говорили про ранок. Це важливий фактор і якщо його не врахувати, то чистити зуби доведеться лежачи в ліжку і з закритими очима. Тому завжди у будь-якої програми повинно бути якесь початок і кінець з можливістю повторення циклу. Повторюваним циклом для людини є наступний день, де знову буде ранок, і знову потрібно буде чистити зуби. Тому додамо до нашої програми наступний алгоритм (послідовність дій).

«Прокинутися. Встати з ліжка. »Якщо на цьому етапі зупинити створення алгоритму та перейти відразу до чищення зубів то програма зупиниться (зависне). Чому? Тому що ми знову не врахували всіх факторів. Ви стоїте посеред своєї спальні і не можете виконати наступну команду; «Беремо зубну щітку», так як щітка знаходиться у ванній, а в неї потрібно ще дійти. Ну, якщо ви спите у ванній, то немає проблем - програма виконається! Але в більшості випадків нормальні люди сплять в іншій кімнаті. Такий підхід називається логічним, тобто осмисленим. Всі наші дії повинні бути розумними і містити певний сенс, інакше поставлена ​​мета не буде досягнута. Тому «Прокинутися. Встати з ліжка. Піти в ванну кімнату », буде найкращим варіантом.

Повернемося до робота. Як же тепер нам скласти план дій робота міні-сумо на рингу? У нас є правила, де чітко позначена мета - «Виштовхнути противника за межі рингу». Але для її досягнення потрібно враховувати певні чинники. Основний фактор це не вийти за межі кола самому, а якщо бути точніше, то не вийти за білу кордон кола. Ось що у нас вийшло:

Програма робота міні-сумо частина3 - 18 березень 2015 - servodroid - центр робототехніки для початківців

Мал. 1 Алгоритм поведінки робота на рингу.

На малюнку 1 ви бачите блок-схему. За всіма правилами, саме так прийнято складати алгоритми. Наочно і зрозуміло.

Перший блок - «Початок». З цього моменту програма починає виконання дій робота після включення. Перше що він повинен буде зробити - це знайти противника, блок «Пошук мети». Наступний блок нашої схеми у вигляді ромба «Мета знайдена?». Це означає, що перед нами буде стояти вибір дій по досягненню певного події. Якщо мета знайдена (Так), то ми продовжимо виконання програми і перейдемо до наступної частини програми «Атакувати», але якщо мета не знайдена (Ні), то логічніше за все продовжити її пошук. Програма зациклиться на цьому моменті, поки робот не виявить супротивника. При атаці робот рухається вперед на супротивника, намагаючись виштовхнути його за межі рингу, в цей момент працює блок «Досягнуто край рингу?», Якщо край рингу не досягнуть, то атака триває, але якщо датчики виявили білу смугу краю, то атака припиняється і програма переходить до наступного блоку «Від'їжджаємо назад» і «Розворот». Після розвороту, цикл основної програми повторюється, тобто вона починається з самого початку і робот знову шукає противника. Так зроблено неспроста. Якщо в момент атаки, противнику вдалося втекти від нашого робота, то ми повинні повернутися до його пошуки не виїхавши за край рингу. З теорією все. Перейдемо до практики.

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

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

Програма робота міні-сумо частина3 - 18 березень 2015 - servodroid - центр робототехніки для початківців

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

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

На самому початку програми при необхідності підключаються додаткові модулі. Потім оголошуються глобальні змінні. Далі йде блок ініціалізації контролера. У ньому визначаються призначення портів, вхід це або вихід і інші настройки. Так само з цього блоку можуть бути викликані додаткові допоміжні підпрограми. Якщо бути коротким, то в цьому місці програма виробляє попередні налаштування контролера. Цей блок виконується один раз при старті або перезавантаження контролера. Зверніть увагу, в блоці додана рядок «затримка 5 сек». До загальних правил написання програми це не відноситься, але для робота міні-сумо необхідно. У правилах сказано, що після команди судді роботи повинні почати рух після закінчення 5 секунд. Дану затримку можна виконувати в основному циклі програми, так як вона буде постійно повторюватися, і поведінка робота зміниться не в кращу сторону.

У блоці основного циклу програми буде виконуватися основний алгоритм поведінки робота на рингу, який ми розглянули на Рис. 1. У процесі роботи основного циклу можна буде звертатися до підпрограм. Програмісти дуже часто, для оптимізації та скорочення коду використовують підпрограми. Наприклад, програму руху вперед або назад, логічніше виділити в окремі модулі, і не включати в основне тіло програми. Вона від цього стане величезною, абсолютно не читається, а знайти помилку або зробити невелику зміну буде дуже проблематично.

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

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

Програма робота міні-сумо частина3 - 18 березень 2015 - servodroid - центр робототехніки для початківців

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

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

Програма робота міні-сумо частина3 - 18 березень 2015 - servodroid - центр робототехніки для початківців

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

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

Програма робота міні-сумо частина3 - 18 березень 2015 - servodroid - центр робототехніки для початківців

Мал. 5 USB-UART (TTL) адаптер.

На рис. 6 показано, як правильно потрібно з'єднати контролер і адаптер.

Мал. 6. З'єднання контролера з USB-UART адаптером.

На відміну від прийнятого з'єднання сигнальних ліній, замість RX-TX і TX-RX ці лінії потрібно з'єднувати безпосередньо: RX-RX, TX-TX. При першому підключенні адаптера до комп'ютера автоматично почнеться установка драйверів пристрою. Слід дочекатися закінчення установки. Ще однією особливістю контролера є відсутність програмного скидання Reset в момент програмування. Це звичайно трохи незручно, але не настільки щоб відмовитися від Pro Mini. Досить натиснути кнопку Reset на контролері після того, як напис «Компілювання» зміниться на «Завантаження», Рис. 7.

Програма робота міні-сумо частина3 - 18 березень 2015 - servodroid - центр робототехніки для початківців

Мал. 7. Відображення інформації про хід програмування МК.

У цьому розділі я не буду детально зупинятися на описі команд, директив та операторів. Передбачається, що ви вже маєте деякі базові знання. В іншому випадку потрібно звернутися до документації на офіційному сайті або іншими джерелами в мережі .Напісаніе коду програми ми будемо виконувати чітко за планом або алгоритму, який ми склали. У певні блоки алгоритму я додав код, який ми зараз розглянемо докладніше на рис. 8.

Програма робота міні-сумо частина3 - 18 березень 2015 - servodroid - центр робототехніки для початківців

Мал. 8. Написання початкового блоку програми.

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

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

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

Чому ми задіємо для одного двигуна два порти? Все просто; якщо на контакти мотора подати напругу він почне крутитися в одну зі сторін, скажімо за годинниковою стрілкою. Але якщо змінити полярність, тобто поміняти «плюс» і «мінус» - вал моторчика буде крутитися в інший бік. Це властивість ми і будемо використовувати для повноцінних маневрів.

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

У цьому циклі виконується основна програма контролера. З нього не можна вийти зовсім або завершити його. З нього можливі лише виклики зовнішніх процедур, так званих підпрограм.

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

Програма робота міні-сумо частина3 - 18 березень 2015 - servodroid - центр робототехніки для початківців

Мал. 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

Якщо в момент атаки ми наїхали на край рингу і виявили білу смугу, то нам потрібно зупинитися, здати назад, розвернутися і проїхати трохи вперед, потім знову відновити пошук. Для цього по порядку викликаємо процедури:

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 чат з робототехніки ми їх обговоримо!

Схожі статті