- Кружни дијаграм
- Генерирање ПВМ сигнала на ГПИО пину за управљање серво мотором
- Програмирање ПИЦ16Ф8771А за роботску руку
- Симулација кода роботског оружја ПИЦ
- Дизајн ПЦБ-а помоћу ЕасиЕДА-е
- Израчунавање и наручивање узорака на мрежи
- Рад ПИЦ роботске руке
Од производне траке аутомобилске производне индустрије до телехируршких робота у свемиру, роботско оружје можете пронаћи свуда. Механизми ових робота слични су људским који се могу програмирати за сличне функције и повећане могућности. Могу се користити за брже и тачније понављање радњи од људи или у суровим окружењима без ризиковања људског живота. Већ смо направили Рецорд анд Плаи Роботиц Арм користећи Ардуино који се може обучити за обављање одређеног задатка и учинити да се понавља заувек.
У овом упутству користићемо индустријски стандард ПИЦ16Ф877А 8-битни микроконтролер за контролу исте роботске руке с потенциометрима. Изазов овог пројекта је да ПИЦ16Ф877А има само два пина способна за ПВН, али морамо да контролишемо око 5 серво мотора за нашег робота који захтева 5 појединачних ПВМ пинова. Дакле, морамо користити ГПИО пинове и генерисати ПВМ сигнале на ПИЦ ГПИО пиновима користећи тајмер прекиде. Сада бисмо, наравно, могли да надоградимо на бољи микроконтролер или да користимо ИЦ за уклањање мултиплексера да бисмо овде учинили ствари много лакшим. Али ипак, вреди покушати са овим пројектом за искуство учења.
Механичка структура роботске руке коју користим у овом пројекту је у потпуности 3Д штампана за мој претходни пројекат; комплетне датотеке дизајна и поступак склапања можете пронаћи овде. Ако немате 3Д штампач, можете и да направите једноставну роботску руку помоћу картона као што је приказано у вези. Под претпоставком да сте се некако докопали своје роботске руке, идемо даље у пројекат.
Кружни дијаграм
Комплетна шема кола за ову роботску руку засновану на ПИЦ микроконтролеру је приказана испод. Шеме су нацртане помоћу ЕасиЕДА-е.
Шема кола је прилично једноставна; комплетан пројекат напаја 12В адаптер. Тих 12В се затим претвара у + 5В помоћу два регулатора напона 7805. Један је означен са + 5В, а други са + 5В (2). Разлог за постојање два регулатора је тај што када се серво окреће увлачи пуно струје што ствара пад напона. Овај пад напона приморава ПИЦ да се сам поново покрене, стога не можемо да радимо и ПИЦ и серво моторе на истој + 5В шини. Дакле, онај означен са + 5В користи се за напајање ПИЦ микроконтролера, ЛЦД-а и потенциометара, а засебни излаз регулатора који је означен као + 5В (2) користи се за напајање серво мотора.
Пет излазних пинова потенциометра који пружају променљиви напон од 0В до 5В повезани су на аналогне пинове Ан0 до АН4 ПИЦ-а. Будући да планирамо да користимо тајмере за генерисање ПВМ, серво мотори могу бити повезани на било који ГПИО пин. Одабрао сам пинове од РД2 до РД6 за серво моторе, али то може бити било који ГПИО по вашем избору.
С обзиром да програм укључује пуно отклањања грешака, ЛЦД екран од 16к2 такође је повезан са портБ ПИЦ-а. Ово ће приказати радни циклус серво мотора који се контролишу. Поред овога, такође сам проширио везе за све ГПИО и аналогне пинове, за сваки случај ако било који сензор треба да буде повезан у будућности. Коначно, такође сам повезао пин програмера Х1 за директно програмирање ПИЦ-а помоћу пицкит3 помоћу опције програмирања ИЦСП.
Генерирање ПВМ сигнала на ГПИО пину за управљање серво мотором
Једном када је склоп спреман, морамо да смислимо како да генеришемо ПВН сигнале на ГПИО пину ПИЦ-а за управљање серво мотором. Нешто слично смо већ уморили методом прекида Тимер и били смо успешни. Овде ћемо га надоградити, па ако сте овде нови, топло бих вам препоручио да прочитате овај претходни водич пре него што наставите даље.
Сви хоби серво мотори раде на фреквенцији од 50Хз. То значи да ће један комплетни пулсни циклус за серво мотор бити 1/50 (Ф = 1 / Т) што је 20 мс. Од ових комплетних 20мс контролни сигнал је само од 0 до 2мс, док је остатак сигнала увек искључен. Доња слика показује како време УКЉУЧАВАЊА варира само од 0 до 2 мс за ротирање мотора од 0 степени до 180 степени укупног трајања од 20 мс.
Имајући ово на уму, програм морамо написати на такав начин да ПИЦ очита 0 до 1204 са потенциометра и преслика на 0 до 100, што ће бити радни циклус серво мотора. Користећи овај радни циклус можемо израчунати време укључивања серво мотора. Тада можемо иницијализовати прекид тајмера да се прелива у редовном интервалу тако да делује слично функцији миллис () у Ардуину. Уз то можемо да пребацимо статус ГПИО пина на жељени период на висок и искључимо га након 20 мс (један комплетни циклус), а затим поновимо исти поступак. Сад, кад смо разумели логику, уђимо у програм.
Програмирање ПИЦ16Ф8771А за роботску руку
Као и увек комплетан програм са видео записом можете пронаћи на крају ове странице, код се такође може преузети одавде са свим потребним датотекама. У овом одељку ћемо разговарати о логици која стоји иза програма. Програм користи АДЦ модул, тајмер модул и ЛЦД модул за контролу роботске руке. Ако нисте свесни како да користите АДЦ функције или функције тајмера или да повежете ЛЦД са ПИЦ-ом, можете се вратити на одговарајуће везе да бисте их научили. Објашњење у наставку дато је под претпоставком да је читалац упознат са овим концептима.
Конфигурација порта тајмера 0
Најважнији одељак кода је подешавање тајмера 0 на преливање за свако одређено кашњење. Формуле за израчунавање овог кашњења могу се дати као
Кашњење = ((256-РЕГ_вал) * (Пресцал * 4)) / Фосц
Коришћењем регистра ОПТИОН_РЕГ и ТМР0 поставили смо тајмер 0 да ради са предкаларном вредношћу 32, а РЕГ вал постављен на 248. Фреквенција кристала (Фосц) која се користи у нашем хардверу је 20 МХз. Са овим вредностима кашњење се може израчунати као
Кашњење = ((256-248) * (32 * 4)) / (20000000) = 0,0000512 секунди (или) = 0,05 мс
Дакле, сада смо поставили тајмер да се прелива на сваких 0,05 мс. Код за исто је дат у наставку
/ ***** Конфигурација порта за тајмер ****** / ОПТИОН_РЕГ = 0б00000100; // Тимер0 са спољном фреквенцијом и 32 као прескалар // Такође омогућава ПУЛЛ УПс ТМР0 = 248; // Учитавање временске вредности за 0,0001с; делаиВалуе може бити између 0-256 само ТМР0ИЕ = 1; // Омогући бит прекида тајмера у регистру ПИЕ1 ГИЕ = 1; // Омогући глобални прекид ПЕИЕ = 1; // Омогући периферни прекид / *********** ______ *********** /
Од укупног управљачког прозора серво мотора од 0мс до 2мс, можемо га контролисати са резолуцијом од 0,05мсец, што нам омогућава да имамо (2 / 0,05) 40 различитих положаја за мотор између 0 степени до 180 степени. Ову вредност можете додатно смањити ако би је ваш МЦУ могао подржати да би добио више положаја и прецизну контролу.
Рутинска услуга прекида (ИСР)
Сада када имамо тимер 0 постављен на преливање за сваких 0,05 мс, поставићемо заставицу прекида ТМР0ИФ за 0,05 мс. Дакле, унутар функције ИСР можемо ресетовати ту заставицу и повећати променљиву која се зове цоунт за један. Дакле, сада ће се ова променљива повећавати за 1 за сваких 0,05 мс.
воид интеррупт тимер_иср () { иф (ТМР0ИФ == 1) // Ознака тајмера је покренута због преливања тајмера -> постављено на преливање за сваких 0,05 мс { ТМР0 = 248; // Учитавање тајмера Вредност ТМР0ИФ = 0; // Обриши број заставица прекида тајмера ++; // Броји прираст за 1 за сваких 0,05 мс }
Израчунавање радног циклуса и времена
Даље морамо израчунати радни циклус и на време за свих пет серво мотора. Имамо пет серво мотора од којих се сваки користи за контролу појединачног дела руке. Дакле, морамо прочитати АДЦ вредност свих пет и израчунати радни циклус и на време за сваку.
Вредност АДЦ биће у опсегу од 0 до 1024, што се може претворити у радни циклус од 0% до 100% једноставним множењем 0,0976 (100/1024 = 0,0976) на добијену вредност. Овај радни циклус од 0 до 100% мора се затим претворити у време укључења. Знамо да при 100% радном циклусу време укључивања мора бити 2мс (за 180 степени), па ће множењем 0,02 (2/100 = 0,02) 0 до 100 радног циклуса бити претворено у 0 до 2мс. Али тада је постављено да се број наших променљивих тајмера повећава једном за сваких 0,05 мс. То значи да ће вредност бројања бити 20 (1 / 0,05 = 20) за сваких 1 мс. Дакле, морамо помножити 20 са 0,02 да бисмо израчунали тачно време на нашем програму који ће нам дати вредност 0,4 (0,02 * 20 = 0,4). Код за исти је приказан испод, можете га видети пет пута поновљеног за свих 5 пота користећи фор петљу. Добијене вредности се чувају у низу Т_ОН.
фор (инт пот_нум = 0; пот_нум <= 3; пот_нум ++) { инт Пев_вал = Т_ОН; ПОТ_вал = (АДЦ_Реад (пот_нум)); // Очитавање вредности ПОТ помоћу АДЦ Дути_цицле = (ПОТ_вал * 0.0976); // Мапа 0 до 1024 до 0 до 100 Т_ОН = Дути_цицле * 0,4; // 20 * 0,02
Бирајући који мотор да ротирате
Не можемо управљати свих пет мотора заједно, јер ће ИСР код отежати успоравање читавог микроконтролера. Дакле, морамо истовремено да ротирамо само један серво мотор. Да бисте изабрали који серво да ротирате, микроконтролер надгледа време УКЉУЧЕЊА свих пет серво мотора и упоређује га са претходним на време. Ако дође до промене времена УКЉУЧЕЊА, можемо закључити да се одређени серво мора преместити. Код за исти је приказан у наставку.
иф (Т_ОН! = Пев_вал) { Лцд_Цлеар (); серво = пот_нум; Лцд_Сет_Цурсор (2,11); Лцд_Принт_Стринг ("С:"); Лцд_Принт_Цхар (серво + '0'); иф (пот_нум == 0) {Лцд_Сет_Цурсор (1,1); Лцд_Принт_Стринг ("А:");} иначе иф (пот_нум == 1) {Лцд_Сет_Цурсор (1,6); Лцд_Принт_Стринг ("Б:");} иначе иф (пот_нум == 2) {Лцд_Сет_Цурсор (1,11); Лцд_Принт_Стринг ("Ц:");} иначе иф (пот_нум == 3) {Лцд_Сет_Цурсор (2,1); Лцд_Принт_Стринг ("Д:");} иначе иф (пот_нум == 4) {Лцд_Сет_Цурсор (2,6); Лцд_Принт_Стринг ("Е:");} цхар д2 = (Дути_цицле)% 10; цхар д1 = (Дути_цицле / 10)% 10; Лцд_Принт_Цхар (д1 + '0'); Лцд_Принт_Цхар (д2 + '0');
Такође исписујемо циклус рада серво погона на ЛЦД екрану како би корисник могао да зна његов тренутни положај. На основу промене времена укључења, променљиви серво се ажурира бројевима од 0 до 4 који представљају појединачне моторе.
Управљање серво мотором унутар ИСР-а
Унутар ИСР-а имамо број променљивих који се увећава за сваких 0,05 мс, то значи да ће се за сваких 1 мс променљива повећавати за 20. Коришћењем овога морамо да контролишемо пинове да бисмо произвели ПВМ сигнал. Ако је вредност бројања мања од времена укључења, ГПИО тог мотора се укључује помоћу линије испод
ПОРТД = ПОРТД - серво_цоде;
Овде низ серво_цоде садржи детаље пина свих пет серво мотора и на основу вредности у променљивом серво, користиће се код за тај одређени серво мотор. Тада је логично ИЛИ (-) са постојећим ПОРТД битовима, тако да не нарушавамо вредности другог мотора и не ажурирамо само овај мотор. Слично за искључивање затича
ПОРТД = ПОРТД & ~ (серво_цоде);
Обрнили смо вредност бита користећи оператор инверзне логике (~), а затим смо извели операцију АНД (&) на ПОРТД-у како бисмо искључили само жељени пин док смо остале пинове оставили у претходном стању. Комплетни фрагмент кода је приказан испод.
воид интеррупт тимер_иср () { иф (ТМР0ИФ == 1) // Ознака тајмера је активирана због преливања тајмера -> постављено на преливање за сваких 0,05 мс { ТМР0 = 248; // Учитавање тајмера Вредност ТМР0ИФ = 0; // Обриши број заставица прекида тајмера ++; // Броји прираст за 1 за сваких 0,05 мс -> бројање ће бити 20 за сваких 1 мс (0,05 / 1 = 20)) } инт серво_цоде = {0б01000000, 0б00100000, 0б00010000, 0б00001000, 0б00000100}; иф (цоунт> = 20 * 20) цоунт = 0; иф (цоунт <= (Т_ОН)) ПОРТД = ПОРТД - серво_цоде; елсе ПОРТД = ПОРТД & ~ (серво_цоде); }
Знамо да укупан циклус мора да траје 20 мс пре него што се ГПИО пин поново укључи. Дакле, проверавамо да ли је бројање премашило 20 мс упоређивањем вредности бројања са 400 (исти прорачун као што је горе описано) и ако да, морамо поново да иницијализујемо бројање да буде нула.
Симулација кода роботског оружја ПИЦ
Увек је боље симулирати код пре него што га однесете на прави хардвер. Тако сам користио Протеус да симулирам свој код и верификовао га да исправно ради. Коло које се користи за симулацију приказано је у наставку. Осцилоскопом смо проверили да ли се ПВМ сигнали генеришу према потреби. Такође можемо проверити да ли се ЛЦД и серво мотори окрећу према очекивањима.
Као што видите, ЛЦД приказује радни циклус мотора Д 07, на основу вредности лонца која је 3. мотор. Слично је ако се помери други лонац, радни циклус тог лонца и његов број мотора биће приказан на ЛЦД-у. ПВМ сигнал приказан на осцилоскопу је приказан испод.
Укупни период циклуса мери се на 22,2 мс помоћу опције курсора на осцилоскопу, што је врло близу жељених 20 мс. Напокон смо сигурни да код ради, па да бисмо наставили са струјним кругом, можемо га залемити на перф плочу или користити ПЦБ. Неће радити лако на плочи, јер ПОТ увек има проблема са лошим везама.
Дизајн ПЦБ-а помоћу ЕасиЕДА-е
Да бисмо дизајнирали ову ПИЦ роботску руку, изабрали смо мрежни ЕДА алат под називом ЕасиЕДА. Већ дуго га користим и чини ми се веома погодним због велике доступности отиска и једноставне природе. Након дизајнирања ПЦБ-а, узорке ПЦБ-а можемо наручити путем њихових јефтиних услуга израде ПЦБ-а. Такође нуде услугу снабдевања компонентама где имају велику залиху електронских компонената и корисници могу да наруче потребне компоненте заједно са наруџбом ПЦБ-а.
Док дизајнирате своје склопове и ПЦБ-ове, такође можете учинити своје дизајне кола и ПЦБ-а јавним, тако да их други корисници могу копирати или уредити и искористити ваш рад, такође смо учинили целокупним распоредима својих кола и ПЦБ-а јавним за ово коло, проверите доњи линк:
хттпс://еасиеда.цом/цирцуитдигест/пиц-девелопмент-боард-фор-роботиц-арм
Користећи ову везу можете директно наручити исту ПЦБ коју користимо у овом пројекту и користити је. По завршетку дизајна плоча се може посматрати као 3Д модел који ће бити од велике помоћи у визуализацији изгледа плоча након израде. 3Д модел плоче који користимо приказан је доле. Поред тога, такође можете прегледати горњи и доњи слој плоче да бисте проверили да ли је глатки екран онакав какав се очекивао.
Израчунавање и наручивање узорака на мрежи
Након завршетка дизајна ове ПИЦ Робот ПЦБ, можете наручити ПЦБ преко ЈЛЦПЦБ.цом. Да бисте наручили ПЦБ од ЈЛЦПЦБ, потребна вам је датотека Гербер. Да бисте преузели Гербер датотеке са ПЦБ-а, само кликните дугме Генериши фабричку датотеку на страници ЕасиЕДА уређивача, а затим преузмите датотеку Гербер одатле или можете кликнути на Наручи на ЈЛЦПЦБ као што је приказано на доњој слици. Ово ће вас преусмерити на ЈЛЦПЦБ.цом, где можете да изаберете број ПЦБ-а које желите да наручите, колико слојева бакра вам треба, дебљину ПЦБ-а, тежину бакра, па чак и боју ПЦБ-а, попут снимка приказаног доле:
Након што сте одабрали све опције, кликните на „Сачувај у корпу“, а затим ћете бити преусмерени на страницу на којој можете да учитате Гербер датотеку коју смо преузели са ЕасиЕДА. Отпремите своју Гербер датотеку и кликните на „Сачувај у корпи“. И на крају кликните на Цхецкоут Сецуре да бисте довршили наруџбину, а затим ћете добити своје ПЦБ плоче неколико дана касније. Они производе ПЦБ по врло ниској стопи која износи 2 УСД. Њихово време израде је такође врло кратко, што је 48 сати са ДХЛ испоруком од 3-5 дана, у основи ћете добити своје ПЦБ-ове у року од недељу дана од наручивања.
Након наручивања ПЦБ-а, можете да проверите производни напредак ваше ПЦБ-а са датумом и временом. Проверите га тако што ћете отићи на страницу налога и кликнути на „Напредак производње“.
После неколико дана наручивања ПЦБ-а, добио сам узорке ПЦБ-а у лепом паковању као што је приказано на сликама испод.
А након добијања ових комада, залемио сам све потребне компоненте преко ПЦБ-а. Такође сам директно залемио ПОТ, уместо да сам користио прикључне жице, јер су женске и женске жице које сам у почетку користио дајући чудне аналогне излазне напоне вероватно због лабавих контаката. Једном кад су све компоненте састављене, моја ПЦБ је изгледала отприлике овако.
Можда сте приметили да је на овој плочи само један 7805. То је зато што сам у почетку мислио да се могу извући само са регулатором за напајање и ПИЦ-а и серво мотора, а касније сам схватио да ми требају два. Дакле, користио сам спољни круг за напајање серво мотора кроз зелене жице које видите овде.
Упркос томе, не морате много да бринете због тога јер; Сад сам унео промене на ПЦБ. Можете користити модификовану ПЦБ и залемити оба регулатора на самом броду.
Рад ПИЦ роботске руке
Након свих заморних радова, време је за исплату. Залемите све компоненте на плочу и отпремите програм на ПИЦ контролер. Комплетни код је дат испод или га можете преузети овде. Програмски конектор који се налази на плочи требао би вам помоћи да директно пренесете програм помоћу програма Пицкит 3 без много муке. Једном када се програм отпреми, на ЛЦД екрану се приказује серво којим се тренутно управља. Да бисте сазнали више о програмирању ПИЦ микроконтролера, само следите претходни водич.
Одатле можете једноставно окренути лонац и проверити како серво мотори реагују на сваки потенциометар. Једном када схватите формат, можете да контролишете роботску руку да изврши било коју радњу која вам је потребна да бисте се извели и забавили. Комплетан рад пројекта можете пронаћи у видео линку доле.
То је то, момци се надају да сте разумели пројекат и научили нешто ново из њега. Ако имате питања, оставите их у одељку за коментаре или користите форуме за друге техничке расправе.