You are on page 1of 15

ТЕХНОЛОГИЧНО УЧИЛИЩЕ ЕЛЕКТРОННИ СИСТЕМИ

към ТЕХНИЧЕСКИ УНИВЕРСИТЕТ - СОФИЯ

Kурсова работа

Тема: Автоматично навигиране на лазерна


система чрез лицево разпознаване

Изготвено от: Научен ръководител:


Александър Бояджиев и Теодор Василев Енчо Шахънов
СОФИЯ
2022

1. Увод

Обикновено изграждането на неща и проекти е с точна и


определена цел. Първи срок ние създадохме проекти с решаващи
проблеми, които имахме, като: безжична система за управляване на
бутон чрез мобилно приложение и реле, контролиращо се от уебсайт.
Но понякога, ни идват идеи за проекти, които нямат за задача да
решат конкретен проблем. Точно такава е идеята на нашата
лице-разпознаващата лазерна система. Искахме да направим нещо
нестандартно и интересно, добавайки елемнти на забава. Проектът
представлява сравнително компактна “кула” в която се съдържат 2
серво мотора, лазерен диод, както и плоча и метална скоба за
прикрепване и стабилност. С малко калибрация лазерната система
става много точна и стабилна.

1
2. Първа част - Компоненти

2.1. Избор на мотор

Първия компонент на който се спряхме беше серво


мотора. Това бе най-важния ни избор. Но първо какво е серво
мотор и защо го използвахме в сравнение с други видове
мотори?

1. Серво мотор

Сервомоторът е електрически
двигател, който се използва за
управление на устройства.
Контролира линейни и ъглови
местоположения, скорости и
ускорение с прецизност.
Сервомоторите обикновено са
малки и с ниска мощност.

2
Масата, редовността на движението и ефективността също са
важни характеристики на серводвигателя. Дизайнът на сервомотора
включва радиално намагнетизиран ротор, а не зъби, което обяснява
защо серводвигателите имат по-малко полюси. Минималният брой
полюси налага използването на обратна връзка за намаляване на
грешката. При високи обороти на двигателя броят на полюсите
оказва влияние върху точността на спиране и въртящия момент.
Цената им е разумна в сравнение с нивото на прецизност, което
осигуряват.

2. Стъпков мотор

Ротор с постоянни магнити и


фиксиран статор, който носи
намотките, съставлява един
стъпков мотор. Стъпковите
мотори имат голям брой
полюси, обикновено 50 или
повече, което ги отличава от
другите видове двигатели. В
последователност от стъпки
роторът се върти.

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

3. Нашият избор

В крайна сметка избрахме серво мотора, защото


предпочетохме прецизността, скоростта и масата пред
издръжливостта и добрата надеждност на стъпковия мотор. Моделът,
който използваме е MG996R понеже има метални зъбчатки за висока
издръжливост и при 5V има скорост от 0.17 s/60º, което намерихме
перфектно за нашия проект. Много важна част също е факта, че са
сравнително евтини тези качествени серво мотори.

2.2. Лазерен диод

За лазерния диод не отдадохме


много време за избиране. Трябваше ни
нещо малко, леко и евтино, за да може
да го заменим ако се изгори диода.
Взехме диод с изходна мощност 5mW,
дължина на вълната 650nm, и работно
напрежение 5v.

4
2.3. Breadboard и Arduino

Сервотата и Arduino-то се свързват чрез използването на един


breadboard като към микроконтролера са вързани общата земя и
двата сигнални пина на сервотата.

2.4. Захранване на частите

Двата серво мотора се захранват от собствени захранващите


блокове на 5V. Лазерният диод също се захранва от 5V блок.
Arduino-то се захранва от USB порта, понеже не му е нужен
допълнителния ток и трябва да използваме серийния порт на
лаптопа.

5
Втора част - Практика

3.1. Блоксхема

6
3.2. Избор на IDE

Избора на IDE зависеше от кода, който смятахме да доразвием.


Избора беше между програм на C# използвайки .NET обвивка за
OpenCV в Visual Studio и програма на Python използвайки самото
OpenCV в Visual Studio Code. Накрая решихме да изберем Python
програмата, понеже беше по-подържана и обновена. IDE-то което
използвахме е Visual Studio Code, коeто е редактор на програмен код,
направен от Microsoft за Windows, Linux и macOS. Характеристиките
му включват поддръжка за отстраняване на грешки, подчертаване на
синтаксиса, интелигентно завършване на код, фрагменти,
рефакторинг на код и вграден Git.

7
3.3. Комуникация между микроконтролера и компютъра

Използвахме стандартния сериен протокол за комуникация


между Arduino и компютър - UART. UART е изключително надежден
протокол, тъй като данните между двете устройства се изпращат
директно. За комуникация между двата компонента този протокол
използва два проводника: Tx (предаване) и Rx (получаване).
Скоростта на предаване, дължината на данните, началният бит, стоп
битът и битът за четност трябва да бъдат договорени както от
предавателя, така и от приемника, преди данните да могат да бъдат
предавани. Скоростта на предаване се използва от UART за
изчисляване на времето, необходимо за изпращане на бит. Най-често
срещаната скорост на UART е 9600 бод или 9600 бита в секунда.
Чрез този протокол компютъра комуникира с микроконтролера.

8
4. Трета част - Софтуер

4.1. Лицево разпознаване

Програмата ни е написана на Python, като лицевото


разпознаване става чрез използването на OpenCV, което е библиотека
от функции за програмиране, насочени главно към компютърно
зрение в реално време. Разпознаването става чрез използването на
каскадни класификатори, базирани на характеристики на Haar. Този

метод използва машинно обучение за обучение на каскадна функция


от голям брой положителни и отрицателни снимки. След това се
използва за намиране на обекти в други снимки. Тук също задаваме
и серийния порт с който ще комуникираме и скоростта на
комуникация. Чрез cv2.VideoCapture() можем да зададем коя
камера, свързана към компютъра ни, ще използваме.
След това прилагаме метода за класифициране на обекти чрез
класификаторите на Haar.

9
С cv2.rectangle() създаваме правоъгълник около
разпознатия обект - лице.

След това му прилагаме


текста “Face” за по-лесно
разбиране.

След пресмятане на ъгъла


на камерата, калибриране
и пресмятане на
получените от
разпознаването
координати, програмата
проверява дали дължината
на координатите на оста X
и оста Y са с дължина три
бита. След като е
направена тази проверка,
двата координата се слагат
в една променлива.
Променливата следва да
бъде енкодирана във
формата “utf-8” и
изпратена на по-рано
зададения сериен порт.

10
4.2. Интерпретация на координатите върху микроконтролера

Компилирания за платката Arduino код има за цел да преведе

изпратените чрез серийна комукомуникация данни в използващи се

физически градуси на двете респективни серво мотора.

В началото на програмата създаваме

променливите в които ще седят отделните част

на координатите на двете оси. Също създаваме

и инициализираме два обекта (сервота).

След като биват създадени двата серво

обекта, програмата им задава начална

позиция, която е калибрирана при

конструирането на кулата.

По време на продължителния

void loop() проверяваме дали на

получаваме сигнал от компютъра с

дължина повече от пет бита. Ако

получим такъв сигнал, означава

11
че компютъра е изпратил координати на микроконтролера.

Низа от 6 бита бива разделен на две групи от три променливи за

двете оси.

След пресмятането им, финализираните позиции биват

зададени на респективните им сервота.

Този код е изцяло написан чрез ползата на Arduino IDE, което

съдържа текстов редактор за писане на код, зона за съобщения,

текстова конзола, лента с инструменти с бутони за общи функции и

поредица от менюта. То се свързва с хардуера на Arduino, за да качва

програми и да комуникира с тях чрез UART протокола, който

обсъдихме в точка 3.3.

12
Използвани източници
https://elextutorial.com/learn-arduino/arduino-serial-communication-write-port-e
xample-test-begin/
https://docs.arduino.cc/software/ide-v1/tutorials/arduino-ide-v1-basics
shorturl.at/glwH3
https://workspace.google.com/marketplace/app/code_blocks/100740430168
https://docs.opencv.org/3.4/db/d28/tutorial_cascade_classifier.html
https://www.electronicoscaldas.com/datasheet/MG996R_Tower-Pro.pdf

13
Съдържание

Увод 1

Първа част - Компоненти 2


2.1. Избор на мотор 2
2.2. Лазерен диод 4
2.3. Breadboard и Arduino 5
2.4. Захранване на частите 5

Втора част - Практика 6


3.1. Блоксхема 6
3.2. Избор на IDE 7
3.3. Комуникация между микроконтролера и компютъра 8

Трета част - Софтуер 9


4.1. Лицево разпознаване 9
4.2. Интерпретация на координатите върху микроконтролера 11

Използвани източници 13

Съдържание 14

14

You might also like