Здравейте.
В тази статия искам да опиша процеса на сглобяване на първия си робот с Arduino. Материалът ще бъде полезен на други новаци като мен, които искат да създадат нещо като "самобегла количка". Статията представлява описание на етапите на работа с моите допълнения по различни нюанси. Линк към финалния код (вероятно не най-идеалният) е предоставен в края на статията.

По възможност включвах сина си (8 години) в процеса. Какво точно му се получаваше и какво не — за това съм отделил част от статията, може би на някого ще му е полезно.
Общо описание на робота
Първо няколко думи за самия робот (идея). Не исках да сглобя нещо типично в началото. В същото време комплектът с компоненти беше доста стандартен — шаси, мотори, ултразвуков сензор, сензор за линия, светодиоди, звуков сигнал. Първоначално от този "супов набор" бе измислен робот, който охранява своята територия. Той се движи към нарушителя, който е преминал линията на кръга, а след това се връща в центъра. Обаче в този вариант беше необходима нарисувана линия, плюс излишна математика, за да остане постоянно в кръга.
Затова след известно размисъл промених идеята и реших да направя робот-"ловец". В началото той се завърта около оста си, избирайки близка цел (човек). Ако "жертвата" бъде открита, "ловецът" включва мигача и сирената и започва да се движи към нея. Когато човекът се отдалечи/избяга, роботът избира нова цел и я преследва и така нататък. Такъв робот не се нуждае от ограничен кръг и може да работи на открито.
Както виждате, това до голяма степен напомня на играта "гоненица". Въпреки че в крайна сметка роботът не стана достатъчно бърз, той честно взаимодействува с хората около него. Особено това харесва на децата (понякога, обаче, изглежда, че те ще го стъпчат, сърцето ми трепка…). Мисля, че за популяризиране на техническото конструиране това е добро решение.
Структура на робота
И така, определихме се с идеята, да преминем към компоновката. Списъкът на елементите се формира от това, което роботът трябва да може. Тук всичко е напълно очевидно, затова веднага ще погледнем номерацията:

Мозъците на робота — платка arduino uno (1); беше в поръчания набор от Китай. За нашите цели, тя е напълно достатъчна (ориентираме се на количеството използвани пинове). От същия комплект взехме готово шаси (2), на което се прикрепят две водещи колела (3) и едно задно (свободно въртящо се) (4). В комплекта имаше и готова батерийна кутия (5). Отпред на робота има ултразвуков сензор (HC-SR04) (6), отзад — драйвер за двигатели (L298N) (7), в централната част — светодиод-мигалка (8), и малко отстрани — звукова сигнализация (9).
На етапа на компоновка проверяваме:
— дали всичко ще се побере
— дали ще е балансирано
— дали ще е рационално разпределено
Частично това вече беше направено от нашите китайски колеги. Така, тежката батерийна кутия е поставена в центъра и под нея стоят водещите колела. Всички останали платки са леки, може да се поставят по периферията.
Нюанси:
- В шасито от комплекта има много фабрични отвори, но не успях да разбера каква е логиката им. Двигателите и акумулаторният блок бяха закрепени без проблеми, а след това започна 'приготвянето' с пробиването на нови отвори, за да се закрепи съответната платка.
- Латунните стойки и други крепежни елементи от запасите наистина помогнаха (понякога трябваше да импровизирам).
- Изведох проводниците от всяка платка през клиповете (отново намерени в запасите). Много удобно, всички проводници лежат красиво и не се мотаят.
Отделни блокове
Сега ще премина през блоковете и ще разкажа индивидуално за всеки един.
Батерийният отсек
Ясно е, че роботът трябва да има добър източник на енергия. Възможностите могат да бъдат различни, аз избрах вариант с 4 акумулатора АА. В общото те дават около 5 В, и такова напрежение може директно да се подаде на пин 5V на платката arduino (минавайки стабилизатора).
Разбира се, имах известно напрежение, но това решение е напълно работещо.
Тъй като захранването е необходимо навсякъде, за удобство направих два конектора в центъра на робота: единият 'раздава' земя (вдясно), а другият — 5 В (вляво).

Двигатели и драйвер
Първо за закрепването на двигателите. Закрепването е заводско, но е направено с големи допуски. С други думи, двигателите могат да "се клатят" на няколко милиметра наляво-надясно. За нашата задача това не е критично, но на някои места може да повлияе (роботът може да започне да отклонява). За всеки случай зададох двигателите строго паралелно и ги фиксирах с лепило.

За управление на двигателите, както писах по-горе, се използва драйвер L298N. Според документацията, той има три пина на всеки двигател: един за регулиране на скоростта и два пина за посоката на въртене. Има един важен момент. Оказва се, че ако захранващото напрежение е 5 V, то регулирането на скоростта просто не работи! Тоест, или изобщо не се върти, или се върти на максимум. Ето такава особеност, заради която "убих" няколко вечери. В крайна сметка, намерих споменаване някъде на един от форумите.
Всъщност, ниската скорост на въртене ми бе необходима при завъртане на робота — за да има време да сканира пространството. Но, тъй като с такъв замисъл нищо не се получи, трябваше да направя по друг начин: малко завъртане — спиране — завъртане — спиране и т.н. Пак не е толкова елегантно, но работи.
Още тук ще добавя, че след всяко преследване роботът избира произволна посока за ново завъртане (по или против часовниковата стрелка).
Ултразвуков сензор

Още едно желязо, където трябваше да търся компромисно решение. Ултразвуковият сензор дава нестабилни цифри при реални препятствия. Всъщност, това беше предвидимо. Идеално работи на състезания, където има гладки, равни и перпендикулярни повърхности, но ако пред него "преминават" нечии крака — тук е необходимо да се въведе допълнителна обработка.
Като такава обработка поставих на три измервания. След тестове с реални деца (по време на тестовете, нито едно дете не пострада!), се оказа, че е напълно достатъчен за нормализиране на данните. Физиката тук е проста: имаме сигнали, отразени от необходимите обекти (даващи нужната дистанция) и отразени от по-далечни, например, стени. Вторите представляват случайни изхвърляния в измерванията от вида 45, 46, 230, 46, 46, 45, 45, 310, 46… Именно тези медианният филтър отстранява.
След целия процес получаваме разстоянието до най-близкия обект. Ако то е по-малко от определена прагова стойност — тогава включваме сигнализацията и се насочваме директно към "нарушителя".
Сирена и мигачи
Вероятно, най-простите елементи от всичко изброено. Те са видими на снимките по-горе. По хардуера тук няма какво да се пише, така че сега ще преминем към кода.
Програма за управление
Не виждам смисъл да описвам кода в детайли, на когото му трябва — линкът е в края на статията, там всичко е достатъчно четливо. Но би било добре да обясня общата структура.
Първото, което трябваше да осмисля: роботът е устройство за работа в реално време. По-скоро, трябваше да си спомня, защото съм се занимавал с електроника и преди, и сега. Значи, веднага забравяме за извикването на delay(), което много хора харесват да използват в примерните скечове, и което просто "замразява" програмата за указаното време. Вместо това, както съветват опитни хора, въвеждаме таймери за всеки блок. Изминал е нужният период — извършваме действие (увеличаваме яркостта на светодиода, включваме двигателя и т.н.).
Таймерите могат да бъдат взаимосвързани. Например, пиещата звукова сигнализация работи синхронно с мигачите. Това леко опростява програмата.
Естествено, всичко разделяме на отделни функции (мигател, звук, завиване, движение напред и т.н.). Ако не го направим по този начин, по-късно ще е трудно да се разбере какво откъде и накъде.
Нюанси в педагогиката
Всичко, което описах по-горе, правих в свободното си време вечер. В неспешен режим отделих около три седмици за робота. На това можех да приключа, но още обещах да ви разкажа за работата с детето. Какво е възможно на такава възраст?
Работа по инструкция
Първо проверявахме всяка част поотделно — светодиоди, звукова сигнализация, мотори, сензори и т.н. Има голямо количество готови примери — някои директно в средата на разработката, други могат да се намерят в интернет. Това, безспорно, радва. Вземаме кода, свързваме частта, уверяваме се, че работи, и след това започваме да променяме по наша задача. Свързванията по схемата и под известния мой контрол детето ги прави само. Това е добре. Да работиш точно по инструкция също е необходимо.
Ред за работа („от частното към общото“)
Това е сложен момент. Нужно е да възпитаваме, че голям проект ("да направим робот") се състои от малки задачи ("да свържем сензор", "да свържем мотори"…), а те, от своя страна, от още по-малки стъпки ("да намерим програма", "да свържем платка", "да заредим фърмуер"…). Изпълнявайки повече или по-малко ясни задачи от долно ниво, ние "закриваме" задачите от средно ниво, а от тях вече се получава общият резултат. Обяснявах, но мисля, че осъзнаването ще дойде още дълго време.
Монтаж
Сверление, резби, винтове, гайки, запояване и миризмата на колофон — как да се мине без това. Детето получи основен скилл "Работа с поялник" — успяхме да запоим няколко съединения (аз малко помогнах, няма да крия). Не забравяйте за обяснението на техниката за безопасност.
Работа на компютър
Програмата за робота я написах аз, но все пак успяхме да постигнем някакви странични резултати.
Първо: английски. В училище едва-едва започнаха, затова ние "с трудности" разбирахме какво е pishalka, migalka, yarkost и прочее транслит. Разбрахме поне това. Аз осъзнавано не започнах да използвам родни английски думи, тъй като до това ниво все още не сме стигнали.
Второ: ефективна работа. Учили сме горещи комбинации от клавиши, как бързо да изпълняваме типови операции. Периодично, когато пишехме програмата, ние сменяхме местата с сина ми, и аз казвах какво да се направи (замяна, търсене и т.н.). Трябваше да повтарям отново и отново: "избери с двойно кликване", "държи Shift", "държи Ctrl" и така нататък. Процесът на обучение не е бърз, но мисля, че уменията постепенно ще се отложат "в подсъзнанието".
Скрит текстМожете да кажете, че описаното по-горе е почти очевидно. Но, честно, тази есен ми се случи да преподавам информатика в 9-класници в едно училище. Това е ужас. Учениците не знаят такива елементарни неща, като Ctrl + Z, Ctrl + C и Ctrl + V, маркиране на текст с натиснат Shift или двойно кликване на дума и други. Това, като се има предвид, че те вече учат информатика трета година… Направете извод сами.
Трето: слепи печат. Коментарите в кода оставих на детето да печата (нека тренира). Веднага поставихме ръцете правилно, за да може пръстите постепенно да запомнят разположението на клавишите.
Както виждате, при нас все още само започва. Уменията и знанията ще продължим да ги усъвършенстваме и в живота ще са полезни.
Между другото, за перспектива...
По-нататъшно развитие
Роботът е готов, движи се, мига и пищи. Какво следва сега? Вдъхновени от постигнатото, планираме да го доразвиваме. Имаме идея за дистанционно управление — подобно на лунохода. Би било интересно, докато седим пред условен пульт, да контролираме движението на робота, който е в съвсем различно място. Но това вече ще бъде отделна история...
И накрая, всъщност, героите на тази статия (видеото при кликване):
Благодаря за вниманието!
→
Източник: habr.com
