- Избор делова за самобалансирајући робот
- 3Д штампање и састављање нашег самобалансирајућег робота
- Кружни дијаграм
- Код робота за самобалансирање
- Рад Ардуино робота за самобалансирање
Након инспирације РИНО моторима и другим само балансирајућим скутерима из Сегваи-а, увек сам желео да направим нешто своје Ардуино Сегваи Робот. Размишљајући неко време, одлучио сам да направим самобалансирајући робот користећи Ардуино. На овај начин бих могао да схватим основни концепт који стоји иза свих ових скутера и да научим како функционише ПИД алгоритам.
Једном кад сам почео да градим, схватио сам да је овај бот изазов за изградњу. Постоји толико много опција за одабир, а самим тим забуне почињу право од одабира мотора и остају до подешавања ПИД вредности. А има толико ствари које треба узети у обзир попут типа батерије, положаја батерије, држања точка, типа возача мотора, одржавања ЦоГ (Тежиште) и још много тога.
Али дозволите ми да вам га разбијем, кад га направите, сложићете се да то није тако тешко као што звучи. Дакле, суочимо се с тим, у овом упутству ћу документовати своје искуство у изради робота за самобалансирање. Можда сте апсолутни почетник који тек започиње или је можда слетео овде након дуге фрустрације због тога што ваш бот не ради. Ово место жели да буде ваше коначно одредиште. Па кренимо……
Избор делова за самобалансирајући робот
Пре него што вам кажем све опције за израду бота, дозволите ми да наведем ставке које сам користио у овом пројекту самобалансирања робота
- Ардуино УНО
- Једносмерни мотори са редуктором (жуте боје) - 2Бр
- Л298Н Моторни модул возача
- МПУ6050
- Пар точкова
- 7,4В Ли-ион батерија
- Повезивање жица
- 3Д штампано тело
Можете да мешате и бирате било коју од горе наведених компонената на основу расположивости да направите сопствени комплет за самобалансирање робота, само пазите да компоненте одговарају следећим критеријумима.
Контролер: Контролер који сам овде користио је Ардуино УНО, зашто зато што је једноставно једноставан за употребу. Такође можете да користите Ардуино Нано или Ардуино мини, али препоручио бих вам да се држите УНО-а, јер га можемо директно програмирати без икаквог спољног хардвера.
Мотори: Најбољи избор мотора који можете користити за самобалансирајућег робота, без сумње ће бити Степпер мотор. Али да све буде једноставније, користио сам мотор са једносмерном зупчаником. Да није обавезно имати степер; бот добро функционише и са овим јефтиним, обично доступним моторима једносмерне струје у жутој боји.
Возач мотора: Ако сте одабрали моторе са једносмерном зупчаником попут мојих, можете или користити управљачки модул Л298Н попут мене, или би чак и Л293Д требао сасвим добро функционисати. Сазнајте више о управљању једносмерним мотором помоћу Л293Д и Ардуино.
Точкови: Не потцењујте ове момке; Било ми је тешко да схватим да је проблем у мојим точковима. Пазите да ваши точкови добро приањају преко пода који користите. Пазљиво пазите, ваш стисак никада не сме дозволити да вам точкови клизе по поду.
Акцелерометар и жироскоп: Најбољи избор акцелерометра и жироскопа за вашег бота биће МПУ6050. Зато не покушавајте да направите један са нормалним акцелерометром попут АДКСЛ345 или нечим сличним, он једноставно неће успети. На крају овог чланка знаћете зашто. Такође можете погледати наш посвећени чланак о коришћењу МПУ6050 са Ардуином.
Батерија: Потребна нам је што лакша батерија, а радни напон би требао бити већи од 5В како бисмо могли да напајамо наш Ардуино директно без појачавајућег модула. Тако ће идеалан избор бити Ли-полимер батерија од 7,4 В. Ево, пошто сам имао 7,4В Ли-ион батерију која је одмах доступна, користио сам је. Али запамтите да је Ли-по повољнији од Ли-иона.
Шасија: Још једно место где не треба да правите компромисе је шасија ваших ботова. Можете користити картон, дрво, пластику све што вам одговара. Али, само припазите да је шасија чврста и да не треба да се помера када бот покушава да уравнотежи. Дизајнирао сам сопствену шасију на Солидворкс-у закључујући од осталих ботова и 3Д штампао. Ако имате штампач, онда такође можете да одштампате дизајн, датотеке дизајна биће приложене у наредном наслову.
3Д штампање и састављање нашег самобалансирајућег робота
Ако сте се одлучили за 3Д штампање исте шасије коју користим за израду бота, онда се СТЛ датотеке могу преузети са тхингиверсе. Уз то сам додао и датотеке дизајна, тако да их можете и изменити у складу са својим преференцама особља.
Делови немају превисе структуре, тако да их можете лако одштампати без икаквих носача и испуна од 25% ће добро функционисати. Дизајн је прилично једноставан и било који основни штампач треба да буде у стању да се лако носи са њим. Користио сам софтвер Цура да исечем модел и одштампао помоћу своје Тево Тарантуле, поставке су приказане доле.
Морали бисте да одштампате део тела као и четири дела за монтирање мотора. Састављање је прилично равно напред; помоћу матица и вијака од 3 мм причврстите мотор и плоче на место. Након састављања требало би да изгледа овако некако приказано на доњој слици.
Стварни дизајн је планиран са погонским модулом Л298Н у доњем носачу Ардуина и батеријом на њему, како је горе приказано. Ако следите исти редослед, можете директно завртати плочу кроз предвиђене рупе и користити жичану плочицу за Ли-по батерију. Овај аранжман би такође требао функционисати, осим супер обичних точкова које сам касније морао променити.
У свом боту сам заменио положај батерије и Ардуино УНО плоче ради лакшег програмирања, а такође сам морао да уведем и перф плочу за довршавање веза. Дакле, мој бот није изгледао онако како сам планирао у почетној фази. Након завршетка испитивања програмирања ожичења и свега, мој робот са два точка коначно изгледа овако
Кружни дијаграм
Успостављање веза за овај само балансирајући робот заснован на Ардуину је прилично једноставан. Ово је самобалансирајући робот који користи Ардуино и МПУ6050, тако да желимо да повежемо МПУ6050 са Ардуином и повежемо моторе помоћу модула Мотор дривер. Читаву поставку напаја 7,4В ли-јонска батерија. Шема кола за исти је приказана у наставку.
Ардуино и Л298Н моторни модул мотора директно се напајају преко Вин пина и 12В терминала. Уграђени регулатор на Ардуино плочи претвориће улазних 7,4В у 5В и АТмега ИЦ и МПУ6050 ће се напајати од њега. Једносмерни мотори могу радити од напона 5В до 12В. Али повезаћемо позитивну жицу од 7,4 В са батерије на 12 В улазни терминал модула погонског мотора. То ће учинити да мотори раде са 7,4В. Следећа табела ће навести како су модули управљачког програма МПУ6050 и Л298Н повезани са Ардуином.
Компонентни пин |
Ардуино Пин |
МПУ6050 |
|
Вцц |
+ 5В |
Приземље |
Гнд |
СЦЛ |
А5 |
СДА |
А4 |
ИНТ |
Д2 |
Л298Н |
|
У 1 |
Д6 |
ИН2 |
Д9 |
ИН3 |
Д10 |
ИН4 |
Д11 |
МПУ6050 комуницира са Ардуином преко И2Ц интерфејса, тако да користимо СПИ пинове А4 и А5 Ардуина. Једносмерни мотори су повезани на ПВМ пинове Д6, Д9 Д10 и Д11. Морамо их повезати са ПВМ пиновима, јер ћемо управљати брзином једносмерног мотора променом радног циклуса ПВМ сигнала. Ако нисте упознати са ове две компоненте, препоручује се читање водича за МПУ6050 Интерфацинг и Л298Н Мотор дривер.
Код робота за самобалансирање
Сада морамо да програмирамо нашу Ардуино УНО плочу да уравнотежи робота. Овде се дешава сва чаролија; концепт који стоји иза тога је једноставан. Морамо да проверимо да ли се бот нагиње према напред или према назад помоћу МПУ6050, а затим да ли је нагнут према напред морамо окретати точкове у правцу напред, а ако је нагнут према позицији морамо окретати точкове у обрнутом смеру.
Истовремено такође морамо да контролишемо брзину којом се точкови окрећу, ако је бот мало дезоријентисан из централног положаја, точкови се полако окрећу и брзина се повећава како се више удаљава од средишњег положаја. Да бисмо постигли ову логику користимо ПИД алгоритам, који има средишњи положај као задану тачку и ниво дезоријентације као излаза.
Да бисмо знали тренутни положај бота, користимо МПУ6050, који је комбиновани шестоосни акцелерометар и сензор жироскопа. Да бисмо са сензора добили поуздану вредност положаја, морамо да користимо вредност и акцелерометра и жироскопа, јер вредности акцелерометра имају проблема са буком, а вредности гироскопа имају тенденцију да се временом померају. Дакле, морамо да комбинујемо обоје и добијемо вредност корака и нагиба нашег робота, од којих ћемо користити само вредност нагиба.
Звучи помало као да се глава врти? Али не брините, захваљујући Ардуино заједници имамо лако доступне библиотеке које могу да изврше израчунавање ПИД-а и такође добију вредност нагиба из МПУ6050. Библиотеку су развили бр3ттб, односно јровберг. Пре наставка преузимања њихових библиотека формирајте следећу везу и додајте их у свој Ардуино либ директоријум.
хттпс://гитхуб.цом/бр3ттб/Ардуино-ПИД-Либрари/блоб/мастер/ПИД_в1.х
хттпс://гитхуб.цом/јровберг/и2цдевлиб/трее/мастер/Ардуино/МПУ6050
Сада, када смо додали библиотеке у наш Ардуино ИДЕ. Почнимо да програмирамо за нашег самобалансирајућег робота. Као и увек, комплетан код за МПУ6050 робота за уравнотежење дат је на крају ове странице, овде само објашњавам најважније исечке у коду. Претходно речено код се гради на примеру примера кода МПУ6050, ми ћемо само оптимизовати код за своју намену и додати ПИД и технику управљања за нашег самобалансирајућег робота.
Прво укључујемо библиотеке потребне за рад овог програма. Укључују уграђену И2Ц библиотеку, ПИД библиотеку и МПУ6050 библиотеку коју смо управо преузели.
#инцлуде "И2Цдев.х" #инцлуде
Затим декларишемо променљиве потребне за добијање података од МПУ6050 сензора. Читамо и вектор гравитације и вредности кватерниона, а затим израчунавамо нагиб и вредност котрљања бота. Пловак низ ИПР ће одржати коначни резултат.
// МПУ контрола / статус варира боол дмпРеади = фалсе; // постави тачно ако је ДМП инит успео уинт8_т мпуИнтСтатус; // садржи стварни бајт статуса прекида из МПУ-а уинт8_т девСтатус; // враћање статуса након сваке операције уређаја (0 = успех ,! 0 = грешка) уинт16_т пацкетСизе; // очекивана величина ДМП пакета (подразумевана вредност је 42 бајта) уинт16_т фифоЦоунт; // бројање свих бајтова тренутно у ФИФО уинт8_т фифоБуффер; // ФИФО бафер за складиштење // оријентација / кретање варира Куатернион к; // кватернијски контејнер ВецторФлоат гравити; // вектор гравитације флоат ипр; // контејнер за нагиб / нагиб / котрљање и вектор гравитације
Следи врло важан сегмент кода и овде ћете дуго времена проводити у подешавању правог скупа вредности. Ако је ваш робот направљен са врло добрим тежиштем, а компоненте су симетрично распоређене (што у већини случајева није), тада ће вредност ваше задате вредности бити 180. Иначе повежите свог бота са серијским монитором Ардуино и нагињте га док нађете добар положај за балансирање, прочитајте вредност приказану на серијском монитору и ово је ваша задата вредност. Вредност Кп, Кд и Ки мора да се подеси према вашем боту. Ниједна два идентична бота неће имати исте вредности Кп, Кд и Ки, тако да се од тога не може побећи. Погледајте видео на крају ове странице да бисте стекли идеју како прилагодити ове вредности.
/ ********* Подесите ове 4 вредности за свој БОТ ********* / двострука задата вредност = 176; // подешавамо вредност када је бот окомит на земљу помоћу серијског монитора. // Прочитајте пројектну документацију на цирцуитдигест.цом да бисте сазнали како поставити ове вредности двоструко Кп = 21; // подесимо овај први двоструки Кд = 0,8; // Подесимо овај секундарни двоструки Ки = 140; // Напокон поставимо ово / ****** Подешавање краја вредности ********* /
У следећем реду иницијализујемо ПИД алгоритам прослеђивањем улазних променљивих инпут, оутпут, сет поинт, Кп, Ки и Кд. Од њих смо већ поставили вредности задатих вредности Кп, Ки и Кд у горњем исечку кода. Вредност улаза биће тренутна вредност нагиба која се очитава са сензора МПУ6050, а вредност излаза биће вредност израчуната ПИД алгоритмом. Дакле, у основи ПИД алгоритам ће нам дати излазну вредност која би се користила за исправљање улазне вредности тако да буде близу постављене тачке.
ПИД пид (& улаз, & излаз, & задата вредност, Кп, Ки, Кд, ДИРЕЦТ);
Унутар функције подешавања празнине иницирамо МПУ6050 конфигурисањем ДМП (Дигитал Мотион Процессор). Ово ће нам помоћи у комбиновању података акцелерометра са подацима жироскопа и обезбедиће поуздану вредност нагиба, висине и нагиба. Нећемо улазити много дубоко у ово, јер ће то бити далеко изван теме. У сваком случају један сегмент кода који морате да потражите у функцији подешавања су вредности померања жирографије. Сваки МПУ6050 сензор има своје вредности помака. Помоћу ове Ардуино скице можете израчунати вредност помака вашег сензора и у складу с тим ажурирати следеће редове у свом програму.
// овде достављамо сопствене офсетице жирора , скалиране за минималну осетљивост мпу.сетКСГироОффсет (220); мпу.сетИГироОффсет (76); мпу.сетЗГироОффсет (-85); мпу.сетЗАццелОффсет (1688);
Такође морамо да иницирамо дигиталне ПВМ пинове које користимо за повезивање наших мотора. У нашем случају то су Д6, Д9, Д10 и Д11. Дакле, иницијализујемо ове пинове јер их излазни пинови по дефаулту чине НИСКИМ.
// инитиалисе мотор Оутпу пинс пинМоде (6, ОУТПУТ); пинМоде (9, ИЗЛАЗ); пинМоде (10, ИЗЛАЗ); пинМоде (11, ИЗЛАЗ); // По дефаулту искључите оба мотора аналогВрите (6, ЛОВ); аналогВрите (9, ЛОВ); аналогВрите (10, ЛОВ); аналогВрите (11, ЛОВ);
Унутар функције главне петље проверавамо да ли су подаци са МПУ6050 спремни за читање. Ако је одговор да, користимо га за израчунавање ПИД вредности, а затим приказујемо улазну и излазну вредност ПИД на серијском монитору само да бисмо проверили како ПИД реагује. Затим на основу вредности излаза одлучујемо да ли бот мора да се креће напред или назад или да стоји мирно.
Пошто претпостављамо да ће МПУ6050 вратити 180 када бот буде усправан. Вредности корекције добићемо позитивне када бот пада према напред, а негативне вредности ако бот пада према назад. Дакле, проверавамо да ли постоји ово стање и позивамо одговарајуће функције за померање бота напред или назад.
вхиле (! мпуИнтеррупт && фифоЦоунт <пацкетСизе) { // нема мпу података - извођење ПИД прорачуна и излаз на моторе пид.Цомпуте (); // Исписујемо вредност улаза и излаза на серијском монитору да бисмо проверили како ради. Сериал.принт (улаз); Сериал.принт ("=>"); Сериал.принтлн (излаз); иф (инпут> 150 && инпут <200) {// Ако бот пада иф (оутпут> 0) // пада према напред напред (); // Ротирај точкове напријед иначе ако (излаз <0) // Падајући према назад Реверсе (); // Ротирај точкове уназад } елсе // Ако Бот не пада Стоп (); // Држите точкове мирно }
ПИД излаз променљива и одлучује колико брзо мотор мора да се ротира. Ако бот тек треба да падне, вршимо мању корекцију полаганим окретањем точкића. Ако ове мање корекције не раде, и даље ако бот пада, повећавамо брзину мотора. О вредности брзине ротације точкова одлучиваће алгоритам ПИ. Имајте на уму да смо за функцију Реверсе помножили вредност излаза са -1 тако да можемо негативну вредност претворити у позитивну.
воид Форвард () // Код за ротирање точка унапред { аналогВрите (6, излаз); аналогВрите (9,0); аналогВрите (10, излаз); аналогВрите (11,0); Сериал.принт ("Ф"); // информације о отклањању грешака } воид Реверсе () // Код за ротирање точкића уназад { аналогВрите (6,0); аналогВрите (9, излаз * -1); аналогВрите (10,0); аналогВрите (11, излаз * -1); Сериал.принт ("Р"); } воид Стоп () // Код за заустављање оба точка { аналогВрите (6,0); аналогВрите (9,0); аналогВрите (10,0); аналогВрите (11,0); Сериал.принт ("С"); }
Рад Ардуино робота за самобалансирање
Када будете спремни са хардвером, можете да учитате код на своју Ардуино плочу. Уверите се да су везе исправне јер користимо Ли-ион батерију потребан је крајњи опрез. Дакле, двапут проверите да ли има кратких спојева и уверите се да терминали неће доћи у контакт чак и ако ваш бот доживи неке мале ударе. Укључите модул и отворите серијски монитор, ако ваш Ардуино може успешно да комуницира са МПУ6050 и ако све функционише како се очекује требали бисте видети следећи екран.
Овде видимо улазне и излазне вредности ПИД алгоритма у формату инпут => оутпут . Ако је бот савршено уравнотежен, вредност излаза ће бити 0. Улазна вредност је тренутна вредност сензора МПУ6050. Абецеда „Ф“ представља да се бот креће унапред, а „Р“ да бот обрнуто.
Током почетних фаза ПИД-а препоручујем да свој Ардуино кабл оставите повезаним са ботом тако да можете лако надгледати вредности улаза и излаза, а такође ће бити лако исправити и учитати свој програм за вредности Кп, Ки и Кд. Видео испод показује комплетно рада на бота и такође показује како да исправите ПИД вредности.
Надам се да вам ово помаже да направите сопственог робота за балансирање ако имате било каквих проблема да га покренете, а затим оставите питања у одељку за коментаре испод или користите форуме за више техничких питања. Ако желите више забаве, такође можете користити исту логику за израду робота за уравнотежење лопти.