Implementarea Unui Sistem de Conducere Pentru Un Pendul Invers de Tip Ballbot

Introducere

“Ballbot” este un robot care se deplasează rotind o minge, peste care acesta se află. Robotul trebuie să își țină echilibrul și în același timp, să rotească mingea pentru a-și schimba poziția dupa una dorită. Această aplicație este un model complex de pendul invers, deoarece are mai multe grade de libertate față de unul singur în cazul unui pendul invers obișnuit. In acest caz, reglarea trebuie sa se faca pe toate cele trei axe: Ox, Oy si Oz.

Roboții de tip ballbot sunt roboți mobili, instabili, care se balansează pe o bilă. Pentru a realiza acest lucru, pe robot se aplică algoritmi complecși de stabilizare, dar și diferite tehinici de preluare, filtrare și monitorizare a datelor.

Figura 1.1 Ballbot

Această lucrare prezintă o descriere detaliată a structurii unui ballbot și de asemenea prezintă câteva rezultate experimentale care vor demonstra capabilitățile de balansare și mișcare ale robotului, precum și descrierea unui modul de monitorizare în timp real a robotului. Un alt aspect tratat în această lucrare este reprezentat de o comparație între diferitele moduri de realizarare a unui robot de tip ballbot, dar și intre modelele și algoritmii de reglare corespunzători.

Pentru a realiza o astfel de aplicație am întâlnit un număr mare de provocări. În primul rând, principala problemă care apare la roboții mobili este mecanica. Unul dintre obstacolele pe care le-am întâlnit a fost să găsesc o metodă pentru a monta motoarele într-o poziție satisfăcătoare, apoi a trebuit să așez în centrul sistemului senzorul pentru calcularea înclinării și a fost nevoie să realizez o placă, ce conține toate componentele electronice necesare, într-un spațiu limitat. O altă provocare a fost reprezentată de alegerea roților, dovedindu-se că în cazul roboților de tip ballbot, este necesară folosirea roților omnidirecționale. Acest lucru este cerut de arhitectura robotului pentru a trata cazurile în care există direcții de deplasare perpendiculare pe direcția de deplasare a roților.

Placa electronică a robotului conține circuite electronice pentru controller, senzori și elementele de acționare, dar și pentru modulul bluetooth cu care sunt trimise datele pentru aplicația de monitorizare. Așezarea componentelor și routarea traseelor a fost o provocare, deoarece placa trebuia să se încadreze într-o suprafață mică, în comparație cu dimensiunile pieselor folosite.

Robotul conține o placă electronică cu ajutorul căreia este coordonat, elemente de acționare (3 sau 4 motoare), dar și diferite elemente mecanice folosite la prinderea motoarelor și a celorlalte componente, rezultand astfel un mecanism funcțional. O altă componentă indispensabilă în realizarea majorității roboților de acest tip o reprezintă roțile omnidirecționale. Acestea permit rotirea robotului pe orice direcție și reduc frecarea la aplicarea unei tracțiuni perpendiculare pe o roată.

Un alt aspect tratat este monitorizarea parametrilor robotului. Se trimit printr-un modul bluetooth datele citite de la senzori, precum și comenzile date motoarelor. Toate aceste date sunt preluate de calculator într-o aplicație cu o interfață prietenoasă, realizată în C#, apoi sunt transpuse în grafice care arată comportamentul robotului în timp real.

2. Roboți de tip „ballbot”

„Ballbot” este definit ca un robot dinamic datorită faptului că acesta se balansează pe o bilă, avand un singur punct de contact cu solul. Pentru deplasarea pe bilă se folosesc motoare ca elemente de execuție, contactul făcându-se prin intermediul unor roți omnidirecționale. Roțile omnidirecționale sunt utile pentru a evita tracțiunea pe o direcție perpendiculară pe roți.

Acest tip de robot are mai multe grade de libertate decat un pendul invers normal, deoarece sfera îi conferă posibilitatea deplasării în orice direcție. Pentru a își păstra poziția verticală, robotul folosește un giroscop, care indică înclinația pe toate cele 3 axe Ox, Oy, Oz.

Pe lângă roboții dinamici de tip „ballbot” există și roboți concepuți static stabili, care pentru a rămâne în poziție verticală nu trebuie să facă nimic, deoarece au trei sau 4 picioare care nu îi lasă să cadă. Dezavantajul acestui tip de sistem este că se poate deplasa doar pe direcția înainte și pentru a-și schimba direcția e nevoie să se rotească.

Concepte de roboți de tip „ballbot” realizate până în prezent

2.1.1 Rozero – robotul dansator

Figura 2.1. Robotul Rozero

Rozero este un „ballbot” dezvoltat de o echipa de 10 studenți de la Institutul Federal Elvețian de Tehnologie din Zurich. Pentru a-și ține echilibrul pe bilă, Rozero măsoară înclinația pe axe de 160 de ori pe secunda și reacționează pentru a se stabiliza. La cea mai mică eroare a programului, acesta ar cădea.

Pentru a se mișca și pentru a se balansa, este nevoie ca robotul să miște bila în direcția corespunzatoare. Mingea este controlată de 3 roți de tip roată omnidirecțională. Datorită faptului că robotul este instabil, acesta este într-o continuă mișcare, pentru a nu cădea de pe bilă.

Rozero este un “ballbot” special, deoarece poate fi manevrat foarte ușor și poate urmări direcția care îi este imprimată. Se poate deplasa în orice direcție și chiar se poate roti. O altă funcție a sa este de a urmări îndeaproape o persoană, folosind un sensor cu infraroșu.

2.1.2 AIT Ballbot

Acest robot a fost dezvoltat în cadrul Laboratorului de Mecatronică de la Institutul Asiatic de Tehnologie (AIT). Spre deosebire de robotul Rozero, acesta folosește 4 roți, tot omnidirecționale.

Modelul cu 4 roți este semnificativ mai simplu decât cel cu 3, deoarece toate forțele acționează perpendicular pe axele Ox și Oy, dar mecanica se complică puțin pentru că cele 4 roți trebuie așezate în același plan. Pentru modelul robotului Rozero, aceasta nu este o problemă, pentru că cele 3 puncte de sprijin pe bilă formează un plan și se aliniază mult mai ușor. În schimb, pentru cazul cu 3 roți modelul robotului se complică foarte mult, forțele acționând sub diferite unghiuri. În acest caz, forțele care acționează în sistem trebuie translatate în sistemele de coordonate ale celor 3 motoare și apoi trebuie calculate rezultantele și unghiurile sub care acționeaza forțele.

2.1.3 NXT Ballbot

Figura 2.2. NXT Ballbot

Acest robot este realizat dintr-un kit NXT LEGO și pentru stabilizare folosește doar două motoare. Este cel mai simplu model de ballbot realizabil. Folosește două motoare așezate perpendicular pe axele oX și oY ale sistemului și pentru stabilizare, comenzile sunt exact opusul vectorului de înclinare. NXT LEGO este singurul ballbot ce nu are nevoie de roți omnidirecționale.

2.2 Metode de implementare

Majoritatea roboților de tip ballbot folosesc mai mulți algoritmi clasici de tip PID, dar există și abordări cu algoritmi moderni ca fuzzy, algoritmi genetici sau tehnici de inteligență artificială. Pentru fiecare dintre motoarele robotului trebuie să se implementeze un algoritm de reglare PID pentru stabilizare, dar și un algoritm pentru mișcarea de translație. Dacă se dorește, se pot implementa și alți algoritmi pentru mișcări mai complexe de forma translație și rotație sau pentru a urmări diverse obiecte, prin localizarea cu ajutorul unor senzori sau a unor camere video.

Algoritmul de reglare depinde în principal de numărul de motoare și, implicit, de modul în care sunt acestea așezate. Cel mai simplu model implementabil este cel care folosește 4 motoare. În acest caz, forțele cu care trebuie să reacționeze motoarele sunt perpendiculare pe axe pentru fiecare motor și valorile lor vor fi valorile înclinărilor pe axele X sau Y, depinzând de poziția motoarelor. Motoarele opuse vor primi aceeași comandă numerică, dar cu semn schimbat. Modelele cu 3 roți sunt mai dificil de calculat, deoarece forțele cu care trebuie să reacționeze motoarele vor fi situate la diferite unghiuri față de axele giroscopului. Aici se calculează unghiul și rezultanta forței înclinării pe axele X și Y, apoi se translatează această forță în sistemul de coordonate al fiecărui motor și sunt calculate forțele de reacțiune în funcție de poziția motorului.

3. Propunere robot de tip ballbot

3.1 Formularea problemei

Ballbot este un robot mobil ce iși ține echilibrul pe o bilă. Acesta are un singur punct de sprijin pe sol, punctul bilei care face contact cu solul. Acest lucru îl transformă într-un robot instabil, chiar și atunci când trebuie sa rămână pe loc. Pornind de la această premisă, rezultă că trebuie să avem un robot care trebuie să fie tot timpul activ, pentru a-și păstra starea de echilibru. Pentru a îndeplini această condiție, a trebuit să mă gândesc la mai multe aspecte.

Pentru a-și putea ține echilibru pe o minge, robotul trebuie să cunoască poziția la care se află, relativă la poziția perpendiculară pe sol. Pentru a trata acest aspect am ales să folosesc un giroscop, un senzor care calculează înclinarea.

Al doilea factor ca importanță este reprezentat de dimensionarea motoarelor. Va trebui să folosesc motoare cu un cuplu mare și o viteză de rotație mică, deoarece este nevoie de comenzi foarte fine pentru a menține robotul în echilibru. Gândindu-mă la aceste aspecte, am ales motoare cu reducție 300:1, care ajung la o viteză maximă de 100 de rotații pe minut.

Alți factori importanți pe care a trebuit să-i iau în calcul au fost reprezentați de alegerea unui microcontroller care să poată îndeplini toate sarcinile într-un timp util ( < 10 ms) și de alegerea unui acumulator cu o capacitate destul de mare pentru a asigura un timp bun de funcționare al robotului, dar care să nu aibă o masă prea mare.

3.2 Soluții propuse

Pe lânga condițiile minime necesare pentru a implementa un robot de tip ballbot, eu am ales să realizez și monitorizarea parametrilor robotului. Pentru acest lucru am folosit un modul bluetooth, cu care am trimis datele pe un calculator și de acolo le-am afișat într-o interfață.

Figura 3.1. Schemă bloc ballbot

Modul de funcționare al robotului este urmatorul. Microcontrollerul citește datele de la senzorul de înclinare, apoi calculează o comandă pentru fiecare motor, cu un algoritm de reglare, pe care o trimite motoarelor, iar în final trimite datele prin modulul bluetooth pentru a putea fi afișate și monitorizate pe un calculator.

Pentru a ajunge la varianta finală, robotul a trecut prin mai multe transformări. Pentru început am realizat o carcasă adaptabilă la orice tip de minge, cu diametrele între 5 si 15 cm. Acest lucru mi-a facilitat găsirea unei mingi care sa fie căt mai aderentă, dimensiunea fiind mai puțin importantă. O altă schimbare importantă a fost schimbarea roților normale cu unele omnidirecționale care au permis orice tip de mișcare robotului, eliminand riscul blocării motoarelor. Testănd noile roți, care se comportau mult mai bine, am ajuns la concluzia că motoarele au un cuplu foarte mic la viteză mică, iar in domeniul de viteză unde avea cuplu, viteza era prea mare. Am ales atunci să înlocuiesc și motoarele cu transmisie 50:1 cu unele 300:1, care au un cuplu mult mai mare si o viteză optimă. Am ajuns la această concluzie, observând că motoarele pot primi comenzi pentru viteze prea mici, dar și pentru viteze mari, în ambele cazuri cuplul fiind satisfăcator, lucru ce denotă că acestea sunt motoarele potrivite.

Am observat apoi, că robotul este foarte instabil pe minge. Am încercat să-i ridic si sa-i scad centrul de greutate, până am ajuns la concluzia că un centrul de greutate cât mai jos, face robotul mult mai stabil.

Pentru prima variantă a robotului am ales să folosesc 4 motoare. Am ales acest model, deoarece este mult mai simplu de calculat forțele care acționează asupra motoarelor și de aici forțele de reacțiune ale acestora.

Figura 3.2. Înclinări ballbot 4 roți

Datele primite de la senzori sunt înclinările pe axele Ox și Oy, adica rx și ry. Se observă că pentru motoarele M1 și M3, forța care acționează și poate fi minimizată este rx. Pentru a elimina această înclinare, trebuie să acționăm cu aceeași forță, dar în sens opus. Motoarele M2 și cazuri cuplul fiind satisfăcator, lucru ce denotă că acestea sunt motoarele potrivite.

Am observat apoi, că robotul este foarte instabil pe minge. Am încercat să-i ridic si sa-i scad centrul de greutate, până am ajuns la concluzia că un centrul de greutate cât mai jos, face robotul mult mai stabil.

Pentru prima variantă a robotului am ales să folosesc 4 motoare. Am ales acest model, deoarece este mult mai simplu de calculat forțele care acționează asupra motoarelor și de aici forțele de reacțiune ale acestora.

Figura 3.2. Înclinări ballbot 4 roți

Datele primite de la senzori sunt înclinările pe axele Ox și Oy, adica rx și ry. Se observă că pentru motoarele M1 și M3, forța care acționează și poate fi minimizată este rx. Pentru a elimina această înclinare, trebuie să acționăm cu aceeași forță, dar în sens opus. Motoarele M2 și M4 pot minimiza înclinările de pe axa ry.

Acest model este unul simplu de implementat software, dar din punct de vedere hardware am întâmpinat o problemă. Nu am reușit să aliniez toate cele 4 roți să aibă aceeași aderența pe minge, oscilând între situația în care un motor nu avea aproape deloc aderență, până în cea în care se bloca.

Modelul cu 4 roți transformă robotul într-un sistem MIMO cu 2 intrări și 2 ieșiri, motoarele 1 și 3 și respeciv 2 și 4 primind aceleași comenzi.

Erorile sistemului sunt reprezentate de înclinările pe axe văzute din centrele motoarelor și anume:

eroarea pentru M1 și M3 este rx;

eroarea pentru M2 și M4 este ry.

Văzând ca această problemă de mecanică este foarte greu de rezolvat, am ales să modific robotul într-unul cu 3 roți. M-am gandit că acest lucru va rezolva această problemă, deoarece oricare 3 puncte vor fi coplanare, deci se vor putea așeza mai usor pe forma mingiei.

Modificarea făcută a constat în eliminarea unui motor și mutarea celor 3 rămase în formă de triunghi echilateral. Astfel, unghiurile dintre motoare vor fi de 120 de grade.

În acest caz, robotul s-a comportat mult mai bine, roțile având aderență mult mai mare.

Figura 3.3. Înclinări ballbot 3 roți

Din considerente de simplificare, am ales să montez un motor pe una dintre axe. Am ales sa pun motorul M3 pe axa Y, iar motoarele M1 și M2 sunt așezate la 120 de grade la stânga, respectiv la dreapta acestuia.

Pornind de la înclinările pe axele Ox si Oy, rx, respectiv ry, a trebuit să calculez forțele ce acționează în centrul de greutate al fiecarui motor.

Am calculat rezultanta și unghiul al rezultantei cu axa Ox. In triunghiul format de rezultantă, proiecția ei pe axa Ox și distanța de la vârful rezultantei la vârful proiecției acesteaia pe axa Ox, care este egală cu ry am ajuns la următoarele relații:

(3.1)

(3.2)

Apoi, am translatat rezultanta în centrele fiecaruia din cele trei motoare.

Scopul principal este să calculez proiecția înclinării pe axa motorului pe care pot controla mișcarea. Am considerat că axa Oy este cea a suportului motorului, iar axa Ox este cea pe care se poate mișca fiecare motor. Tot ce rămâne de calculat este unghiul făcut de rezultantă cu axa Ox a motorului, pentru a calcula proiecția pe axa Ox cu o funcție trigonometrică. Mi-am propus să exprim toate valorile forțelor în funcție de rezultanta înclinării în centrul robotului și unghiul format de aceasta cu axa Ox.

PrX_Motor = f(r, ); (3.3)

Pentru primul motor am translatat rezultanta în centrul acestuia și am ajuns la o valoare a unghiului

Ө1 = + 150. (3.4)

De aici valoarea proiecției

x1 = r * cos(Ө1) = r * cos ( + 150). (3.5)

Pentru al doilea motor, M2, am aplicat același procedeu de mai sus și am ajuns la valoarea:

Ө2 = – – 30 (3.6)

si o valoarea a proiecției

x2 = r * cos(Ө2) = r * cos (- – 30) (3.7)

În cazul celui de-al 3-lea motor, a fost foarte ușor să găsesc această forță, axa Ox a motorului M3 fiind paralelă cu axa Ox a robotului, astfel proiecția înclinării pe axa Ox a motorului M3 este egală cu proiecția rezultantei înclinării rx.

x3 = r * cos( + 0) = rx (3.8)

În acest caz, al robotului cu 3 roți, poziționate în triunghi echilateral, erorile sistemului sunt reprezentate de înclinările robotului pe axa Ox a fiecărui motor, respectiv x1, x2 și x3.

3.3 Algoritmi de reglare

O parte esențială a robotului este reprezentată de algoritmul de reglare. Pentru început am realizat un algoritm proporțional, în care ieșirea depinde liniar de intrare pe intervale. Acest algoritm de tip P pe care l-am abordat este unul cu histerezis. Intrările algoritmului sunt reprezentate de deplasările pe axele Ox și Oy ale giroscopului, care semnifică înclinarea față-spate, respectiv stânga-dreapta.

Figura 3.4. SRA pentru Algoritm de tip P

Am stabilit că pentru înclinări foarte mici robotul să nu reacționeze, iar pentru înclinări foarte mari semnalul de ieșire să fie maxim. Valorile intermediare ale intrărilor dau valori intermediare ale ieșirilor robotului. Semnalul de ieșire al funcției de decizie este inmulțit cu o constantă K, constanta de proporționalitate, apoi este transmis către driverele de motoare. Constanta K este subunitară, deoarece valorile funcției sunt cuprinse intre 0 si 255, valorile maxime ale PWM. O constantă K = 1 reprezintă viteza maximă de rotație a motoarelor, și viteza scade proporțional cu scăderea valorii K până la 0.

Figura 3.5. Ieșirea regulatorului în funcție de intrare

Având modelul forțelor ce acționează asupra sistemului, atât în cazul motorului cu 4 roți, cât și în cazul celui cu 3, a fost foarte facil să implementez acest algoritm, trebuind doar sa calculez câteva elemente.

Acest algoritm s-a dovedit ineficient, datorită faptului că avem de a face cu un sistem puternic cuplat, astfel că mai multe intrări acționau asupra fiecarui sistem. Acestea au fost considerate perturbații, dar nu au putut fi rejectate de un algoritm de acest tip.

O a doua implementare încercată a fost reprezentată de un algoritm de tip PD. Am inclus o derivată în vechiul algoritm pentru a rejecta înclinările bruște sau dezechilibrari ale robotului, acestea neputând fi rejectate de un algoritm de tip P.

Figura 3.6. SRA pentru algoritm de tip PD

Pentru a implementa acest algoritm a fost nevoie să calculez constanta de timp a procesului. Sistemele de acest tip au timpi de buclă de sub 20 de milisecunde, așa că am ales o constantă de 7 milisecunde. Am calculat derivata discreta ca fiind:

dX = dԐ / dt, (3.9)

adică

derivata = (eroarea_curenta – eroarea_precedenta) / dt.

În formula precedentă Ԑ este eroare pentru un motor, iar dt este perioada sistemului.

Comanda în astfel de algoritmi este reprezentată de o combinație liniară între eroare și derivată, ponderate de constantele Kr, respectiv Kd. Aceste constante au fost obținute experimental.

Implementare hardware

Această lucrare prezintă o modalitate de implementare a unui robot, bazat pe modelul pendulului invers. Numele robotului este ballbot, un robot care se deplasează folosind o minge, folosind principiul de balansare continuă.

Partea hardware a robotului este formată în principal de 3 blocuri foarte importante: controllerul, senzorii robotului, elemente de execuție. Un alt modul folosit, dar nu indispensabil este modulul bluetooth care ajută la monitorizarea în timp real a parametrilor robotului, dar a și ajutat foarte mult în implementarea algoritmilor și detectarea erorilor apărute.

4.1 Componente Hardware

4.1.1 Placa Arduino Micro

Arduino Micro este o placa electronică ce folosește un microcontroller Atmega 32u4 ce vine cu un bootloader scris și utilizează un soft foarte ușor de folosit. Placa este programabilă în limbajele C sau C++ și are biblioteci implementate pentru toate perifericele folosite, dar si pentru diverse module care se folosesc în mod uzual cu dispozitivul. În plus, kit-urile Arduino sunt foarte folosite la nivel mondial, datorită ușurinței în utilizare, dar și faptului că există foarte mulți programatori care scriu programe open source compatibile cu acestea.

Motivul principal al includerii acestui modul în proiect a fost usurința în programare, putându-mă concentra pe obiectele principale de interes: reglarea și monitorizarea robotului.

Figura 4.1. Placuța Arduino Micro

Principala componentă a plăcuței Arduino Micro este microcontrollerul, modelul ATmega 32u4, de la Atmel, care vine lipit pe plăcuță, într-o carcasă QFN, de dimensiuni foarte mici. Acesta conține toate perifericele necesare implementării proiectului, funcționează la o frecvență potrivită, este simplu de programat și nici nu este un device foarte scump. Perifericele folosite sunt:

Interfața serială UART: folosită pentru comunicația cu un bluetooth;

Interfața I2C: folosită pentru comunicația cu giroscopul și accelerometru;

Module PWM: Este nevoie de 4 ieșiri de modulație în lățime de puls pentru cele 4 motoare;

Intrări Analogice: Se folosesc 3 ADC-uri pentru citirea datelor de la senzorii de distanță;

Intrări și ieșiri digitale folosite pentru citirea datelor de la encodere și pentru pornirea driverelor de motoare;

Microcontrollerul Atmega 32u4 face parte din familia de microcontrollere AVR, pe 8 biti, de la Atmel. Acesta este bazat pe o arhitectură RISC(Reduced Instruction Set Computing) avansată, având un set de 135 de instrucțiuni și 32 de regiștri de 8 biți. Majoritatea instrucțiunilor se execută într-un singur ciclu de ceas, acest lucru făcându-l un procesor destul de rapid la o frecvență maximă de 16MHz. Memoria de program a controllerului este de 32 KB, iar memoria RAM este de 2.5KB. Pe lângă acestea, microcontrollerul mai conține 1KB de memorie EEPROM. Conform specificațiilor din catalog, procesorul poate funcționa în jur de 20 de ani, iar memoria flash poate fi scrisă de aproximativ 10.000 de ori. Controllerul folosit pe placuța Arduino folosește pachetul cel mai mare din această gamă, având 44 de pini. Controllerul poate fi programat atât cu un programator pentru AVR prin interfața ISP (In-Serial Programming), cât și prin USB, având deja scris un program de tip „bootloader”.

Figura 4.2. Atmega 32u4

Microcontrollerul are un convertor analog numeric cu 12 canale și o precizie de 10 biți, care poate fi folosit și în modul pe 8 biți, cu o eroare de ± 0.2% și un timp de conversie cuprins între 65 și 260 us. Un avantaj foarte important al acestui convertor este că are la ieșire un amplificator diferențial cu ajutorul căruia poate amplifica datele citite de pana la 200 de ori. Plaja de valori pe care o poate citi convertorul este cuprinsă între GND (0V) si AREF (referinta pentru converotorul analog numeric, 5V în cazul nostru). Pentru selectarea unuia dintre cele 12 canale se folosește un multiplexor numit ADMUX. Pentru configurarea CAN-ului se folosește registru ADCSRA, pentru care fiecare bit reprezintă un bit de control al convertorului. Valoarea citită de convertor este stocată în regiștrii ADCL și ADCH, în funcție de modul de conversie selectat.

Convertorul Analog Numeric salvează valoarea tensiunii ca un număr de 8 sau 10 biți. Pentru a transforma această valoare în tensiunea echivalentă se folosește următoarea formulă (pentru configurația pe 10 biți, iar pentru 8 biți se înlocuiește numărul 1023 cu 255):

VIN = . (4.1)

Unde VIN este tensiunea corespunzătoare valorii din registrul ADC, VREF este tensiunea de referință la care este conectat pinul AREF.

Acesta mai are integrat un port USART (Universal Synchronus/Asynchronus Receiver/Transmitter), cu un baud rate programabil pentru a obține viteza de transfer dorită. Registrul de citire și cel folosit pentru trimitere pot reține între 5 și 8 biți, iar la transmitere se pot folosi 1 sau 2 biți de stop, biți de paritate. De asemenea, există unele flag-uri pentru detecția de erori sau pentru semnalizarea unor evenimente (ex: terminare operație de citire sau scriere). Calcularea ratei de transfer depinde de frecvența oscilatorului și de valoarea registrului UBRRn, care poate fi programat cu orice valoare pe 16 biți(format din doi regiștrii de 8 biți: UBRRHn și UBRRLn).

BAUD = , (4.2)

formula pentru calcularea ratei de transfer în modul asincron normal, adică pentru U2Xn = 0,

unde BAUD = rata de tranfer,

FOSC = frecvența oscilatorului.

Pentru trimiterea datelor se foloseste registrul UDRn în care se pot copia diverse valori cuprinse între 0 și 255 (unsigned) sau între -128 și 127 daca datele sunt interpretate ca având semn. Trimiterea se poate face doar daca portul serial este activat și dacă bufferul de trimitere este gol.

Pentru citire se folosește același registru UDRn. Pentru citire se așteaptă ca întreaga informație să fie citită (toți biții așteptați, în funcție de configurația de UART aleasă), apoi se poate citi direct din registru.

Interfața I2C (Inter-Integrated Peripherals) este numită în cazul acestui microcontroller TWI (Two Wire Interface), datorită faptului că pentru a transmite date se folosesc doar 2 fire. Unul pentru date, numit generic SDA (Serial Data) și unul pentru sincronizare SCL (Serial Clock).

Aceasta este o interfață half-duplex, ceea ce înseamnă că se pot trimite date în ambele sensuri, doar că nu în același timp. Această interfață are nevoie de câte o rezistență de „pull-up” pentru fiecare pin, pentru a evita scurturile între circuitele integrate interconectate pe interfață. Se pot conecta până la 128 de circuite pe o astfel de interfață, iar selecția se poate face prin trimiterea unei adrese device-ului cu care se dorește să se „vorbească”, la care acesta reacționează. Această interfață acceptă viteze de transfer de până la 400 kHz, de cele mai multe ori această viteză fiind limitată de dispozitivul „slave”.

Figura 4.3. Schemă tipică de conectare dispozitive via I2C

Pentru a calcula frecvența de transfer, adică frecvența la care pe pinul SCL se emit impulsuri dreptunghiulare pentru sincronizare, se folosește următoarea formulă:

, (4.3)

Unde TWBR este valoarea registrului de transmisie;

TWPS este valoarea prescalerului setat îin registrul de status.

Registrul în care sunt scrise sau citite informațiile, se numeste TWDR (Two Wire Data Register).

Modulul pentru Pulse Width Modulation al microcontrollerului Atmega 32u4 este folosit pentru a da comenzi variabile motoarelor. Acest modul permite o plajă de 256 de valori distincte ce pot fi atribuite ieșirii către motoare, lucru ce permite un reglaj fin al turației.

Prin trimiterea de pulsuri dreptunghiulare de o anumită lățime, un motor DC reacționează ca la o tensiune proporțională cu această comandă.

(4.4)

Unde VCC este tensiunea de alimentare,

OCRnA este valoarea scrisă în registrul pentru Output Compare,

VMotor este tensiunea pe care o va percepe motorul la valoarea OCRnA a comenzii.

Circuitul de Output Compare, în varianta FastPWM funcționează într-un mod simplu. Folosește un timer(counter) și un comparator, iar când valoarea timerului este sub valoarea registrului OCRnA, la ieșire vom avea „1” logic, iar după depășirea valorii indicate, ieșirea va avea valoarea „0” logic. După valoarea 255 a timerului acesta se va reseta automat și va genera un nou puls. Valoarea tensiunii de ieșire va fi vazută ca o medie între valorile „0” și „1” ponderate cu timpii aferenți.

Figura 4.4. Diagramă Fast PWM

Placa Arduino are, deasemenea, un stabilizator de tensiune de 5V, de la care sunt alimentate toate componentele de logică și încă un stabilizator de 3.3V folosit pentru alimentarea diferitelor dispozitive ce necesită această tensiune.

4.1.2 Circuitul integrat InvenSense MPU-6050

Figura 4.5. Reacția pe axe a giroscopului

Senzorul principal al robotului se numește MPU-6050 și face parte din clasa de circuite IMU (Inertial Measurement Unit) și are integrat în componența sa 3 senzori: accelerometru, giroscop și senzor de temperatură, precum și un procesor numit DMP (Digital Motion Processor).

Acest senzor, trimite înclinările robotului pe axele X, Y și Z în format întreg pe 16 biți, rezultând o plajă de valori între -32768 și 32767. Prin convenție, valorile negative sunt la înclinarea spre stânga pe axa respectivă, iar valorile pozitive sunt recepționate la înclinarea sprea partea dreaptă.

Valorile citite, întinzându-se pe o plajă foarte mare prezintă unele erori. Aceste erori sunt atenuate printr-o filtrare convențională. Un set de valori este mediat, apoi se păstrează doar valorile apropiate de medie. În final se face media valorilor rămase și acesta este rezultatul final.

Circuitul MPU-6050 este integrat pe o placă de la SparkFun ce conține toate componentele necesare pentru funcționarea optimă (condensatori de decuplare și rezistențe de pull-up pentru interfața I2C). Acesta este alimentat din regulatorul de 3.3V al plăcuței Arduino și comunică cu aceasta prin interfața I2C.

Senzorul poate de asemenea interfața alți senzori, având o interfață auxiliară I2C, în care acesta are rolul de Master.

4.1.3 Driverul de motoare Texas Instruments DRV8833

Driverele de motoare sunt modelul DRV8833 de la Texas Instruments. Sunt un model mic, robust, cu carcasă SMD și rezistă la un curent de aproximativ 1A fără să se încălzească, iar în manual este specificat că rezistă până la curenți de maxim 1.5A, dar cu răcire. Driverele sunt, de fapt, niște punți H, câte două pe fiecare driver, care se pot controla cu PWM. Driverele au de asemenea un pin de enable și unul indicator de eroare. Acestea au integrate și câte 4 diode de protecție la curentul invers indus de bobinele motoarelor. Singurele componente necesare pentru a conecta aceste circuite integrate fiind 3 condensatori, doi condensatori pentru filtrarea intrării de logică și a celei de putere și unul folosit pentru decuplarea alimentării.

Alimentarea de logică a driverelor este facută din regulatorul plăcuței Arduino, la 5V, iar alimentarea de putere este făcută pentru fiecare driver din cate un regulator de tensiune LM7805 SMD. Acestea rezista pana la un curent maxim de 1A, dar s-au dovedit o alegere neinspirată, deoarece se încălzesc foarte tare de la curenți de 500mA. Într-o implementare ulterioară, aceste stabilizatoare vor fi înlocuite cu o sursă în comutație care să reziste la un curent de peste 6A. După cercetările făcute, această sursă n-ar trebui să depășească cu mult dimensiunile celor 4 regulatoare și probabil se va dovedi o metodă mult mai bună de stabilizare a tensiunii alimentării de putere.

Motoarele sunt controlate prin metoda „locked anti-phase”. Pentru a realiza acest lucru, o intrare a driverului DRV8833 este conectată la un pin de PWM al plăcii Arduino și același pin este trecut printr-un inversor și apoi este conectat la cea de-a doua intrare a driverului. Astfel se folosește un singur pin de PWM pentru a controla motorul în ambele sensuri. Această metodă are avantajul că la factor de umplere de 50% motoarele sunt oprite și blocate, lucru ce îi permite robotului să nu alunece. Pentru factor de umplere mai mic de 50% viteza crește progresiv la scăderea PWM-ului până la 0%, unde viteza este maximă. Pentru a roti motorul în celălalt sens se crește valoarea PWM, iar la 100% se obține o viteză maximă.

Circuitul integrat cu inversor pe care l-am folosit pentru a genera PWM în modul „locked antiphase” este modelul 74HCT04D în capsula SOIC de 14 pini. Acest modul are integrate 6 inversoare, din care am folosit 4, câte unul pentru fiecare dintre cele 4 drivere de motoare DRV8833.

Figura 4.6. Schema logică 74HCT04D

Am ales acest model de driver pentru motoare, pentru toate punctele forte precizate mai sus, dar și pentru că se incadreaza foarte bine dimensiunii aplicației pe care am dezvoltat-o. Motoarele, modelul micro-motor de la Pololu, trag un curent maxim de 800mA când sunt blocate, ceea ce nu constituie nicio problemă pentru aceste circuite integrate de putere.

Figura 4.7. Conexiune DRV8833 Modul paralel

Pentru siguranță și pentru o funcționare continuă am ales să folosesc un driver pentru fiecare motor și să leg în paralel intrările și ieșirile celor două punți H. Astfel, conform catalogului, pot ajunge la curenți de pana la 3A. După cum se poate vedea în figura de mai sus, conexiunea este ușor de realizat, având nevoie doar de câteva componente.

4.1.4 Encodere Pololu Hall Enc

Figura 4.8. Encoder cu Senzor Hall

Pentru citirea vitezei motoarelor folosesc encodere de la Pololu, special realizate pentru motoarele folosite. Acestea au integrați 2 senzori Hall, care trimit impulsuri dreptunghiulare la trecerea unui magnet (prins pe axul motorului).

În manualul encoderelor este menționat că la o rotație completă se trimit 12 pulsuri dreptunghiulare. Viteza este calculată prin măsurarea lungimii perioadei pulsului cu ajutorul unui timer al microcontrollerului și apoi transformarea acesteia printr-o formulă matematică în unitatea standard pentru motoare: rot/min.

1 puls ………………………..tpuls

Xpulsuri pe secundă…………. 1 sec

(4.5)

Din faptul că se trimit 12 pulsuri pe secundă =>

=> ; (4.6)

Tensiunea de alimentare a encoderelor poate varia între 2.7V și 18V, dar eu le alimentez la tensiunea de 5V, pentru a genera pulsuri cu această amplitudine, astfel putând fi citite ușor cu ajutorul microcontrollerului.

Un avantaj oferit de aceste encodere este că au 2 pini prin care se pot conecta motoarele, lucru ce facilitează conexiunile.

4.1.5 Modulul Sparkfun cu Bluetooth Roving Networks RN-42

Figura 4.9. Modul bluetooth RN-42

Bluetooth-ul, un modul RN-42 de la Roving Networks (Microchip) este folosit pentru a comunica cu PC-ul prin interfața UART și a transmite datele necesare monitorizării în timp real a robotului, dar și pentru a primi comenzi la motoare: pornit-oprit și ghidare de la distanță. Acesta vine lipit pe o placuță de la SparkFun, care conține toate componentele necesare funcționării bluetooth-ului și pune la dispoziție un pinout minimal, pentru a ușura munca utilizatorului.

Modulul RN-42 funcționează la tensiunea maximă de 3.3V, dar cu ajutorul unor level-shiftere este realizată o conexiune electronică ce-i permite funcționarea la o tensiune cuprinsă între 3.3V și 6V. Tensiunea la care este alimentată placa în cazul ballbotului este de 5V, tensiune la care funcționează placa Arduino Micro. Conform specificațiilor tehnice, modulul RN-42 este de Clasa 2, ceea ce înseamnă că poate funcționa la o distanță de până la 10 m. Ratele de transfer pe care le suportă modulul sunt cuprinse între 2400bps – 115000bps.

Acumulatorul Li-po

Figura 4.10. Baterie LiPo 800 mAh

În prezentul proiect am folosit o baterie Litiu – Ion – Polimer cu o capacitate de 800 mAh. Aceste baterii sunt reîncărcabile și sunt cunoscute pentru curentul foarte mare pe care îl pot susține. Curentul maxim poate fi calculat prin înmulțirea constantei C înscrisă pe aceasta cu capacitatea acumulatorului.

Bateria folosită de mine are constanta C cu valoarea 25, ceea ce înseamnă un curent maxim:

Imax= 800×10-3×25 = 20A (4.7)

Pentru un curent mediu de 3.2A, rezultă un timp de funcționare:

(4.8)

Am ales acest tip de acumulatori deoarece, la pornirea motoarelor, robotul trage un curent de 9A și o baterie normală nu ar fi putut susține acest curent. De exemplu, un acumulator Li-Ion, destul de performant, nu ar suporta astfel de curenți. Singurii acumulatori comparabili cu cei Li-Po, cu privire la curentul maxim furnizat sunt cei cu Plumb, dar aceștia cu dimensiuni mult mai mari.

Un dezavantaj al acumulatorilor Li-Po este reprezentat de capacitatea relativ mică, în comparație cu acumulatorii de tip Litiu-Ion.

4.2. Schema electronică

Schema electronică a robotului este realizată în CADSoft Eagle. Pentru componentele care nu se gasesc în mod normal în bibliotecile programului a trebuit să realizez simboluri și layout-uri.

Figura 4.11. Schema pentru sursele de tensiune

Cele patru surse de tensiune LM7805 sunt conectate fiecare la alimentarea de putere a câte unui driver de motor. Acestea au nevoie de câte doi condensatori, unul conectat la intrare și celălalt la ieșire, pentru o mai bună stabilizare a tensiunii. Regulatoarele de tensiune sunt alimentate direct de la bateria Li-Po, dar între acestea este pusă o diodă de protecție, care rezistă la curenți de până la 5A continuu. Acesta previne distrugerea circuitelor integrate de pe întreaga placă, în cazul conectării bornelor în sens invers.

De asemenea, am conectat în circuit un LED, pentru a vedea atunci când robotul este conectat sau atunci cand apar probleme la alimentare. Acesta este legat în serie cu un rezistor de 1kohm, lucru ce garantează un consum mic al LED-ului, dar și o intensitate luminoasă scăzută, pentru a nu mă deranja în timpul testelor.

Figura 4.12. Schema sheld-ului Arduino

Pentru a-mi putea conecta placa la dispozitivul Arduino, a trebuit să realizez un layout identic cu cel al acestei plăcuțe, astfel mapând fiecare pin al Arduino pe placa mea. Cu această metodă am putut conecta pe placă 2 pinheaderi tip “mama”, care au făcut posibilă cuplarea dispozitivului Arduino pe placă. Apoi, am putut obține semnalele de la Arduino direct pe placa mea, lucru ce m-a ajutat să pot conecta de aici toate dispozitivele de logică.

Figura 4.13. Drivere motoare și protecție

Am conectat pe placă driverele de motoare DRV8833, în mod direct și am adăugat condensatorii necesari, conform manualului. Eagle, programul CAD cu care am realizat placa, nu avea implementată biblioteca pentru driverul de motoare, așa că a trebuit să o realizez eu, desenând simbolul și layout-ul piesei.

Pe lângă acești condensatori, driverele mai au nevoie de câte două diode pentru fiecare ieșire, pentru a le proteja de curenții inverși generați de motoare, deoarece orice motor de curent continuu poate fi și un generator, iar atunci când se rotesc, trimit un curent care ar polariza invers joncțiunea bază emitor din tranzistorii punților H și acestea ar fi străpunse, astfel driverul s-ar defecta.

Figura 4.14. Conectori placă

Pentru a interconecta dispozitivele robotului, am ales să folosesc pinheaderi cu mai multi pini. Pentru a conecta circuitul MPU-6050 am folosit un pinheader „mama” de 10 pini, deoarece MPU-ul foloseste pinheaderi „tata” cu același număr de pini. Prin acest pinheader se realizează alimentarea circuitului de la Sparkfun, precum și transferul de dată între acesta și microcontroller.

Pentru alimentarea fiecărui encoder, dar și a motoarelor am folosit un pinheader cu 6 pini, cu aceeași configurație de pini ca cea a encoderelor. Astfel, prin conctarea unor fire între encodere și placă, am putut realiza într-un mod simplu conexiunea acestora. Pe lângă toate acestea, am mai plasat pe placă doi conectori pentru diferiți senzori, ce pot face robotul autonom.

Prin aceeași metodă prin care am conectat dispozitivul MPU-6050, am ales să „leg” și modulul bluetooth RN-42 de la Sparkfun. Acesta este așezat într-un colț al plăcii pentru a fi ferit de zgomote, bluetooth-ul fiind un dispozitiv foarte sensibil.

Toți acești conectori ajută la realizarea unui design curat, fără fire, în care fiecare componentă are un loc definit și posibilele probleme de natură mecanică pot fi mult diminuate.

Figura 4.15. Placa fizica Ballbot

Se pot vedea pe placă în partea stângă placuța Arduino Micro, modulul bluetooth și circuitul integrat MPU-6050, ce contine accelerometrul și giroscopul, senzorii principali ai robotului. În partea de jos se pot observa cele 4 stabilizatoare de tensiune, iar deasupra lor sunt cele 4 drivere de motoare, DRV8833. Ieșirile acestora, precum și datele de la encodere ajung pe cei 4 pinheaderi. Conexiunea de la placă (pinheaderi) la encodere și motoare se face cu ajutorul unei benzi de fire conductoare, ce poate fi ușor conectată și deconectată. Se poate observa că traseele sunt fludorizate, lucru ce previne oxidarea acestora în timp.

Layout-ul plăcii a suferit mai multe transformări până a ajuns la o formă foarte compactă de 10cm x 7cm, pentru o placă ce conține toate componentele necesare realizării unui robot funcțional. Am poziționat modulul bluetooth într-o extremitate a plăcii pentru a nu fi bruiat de alte compoente, iar senzorul cu giroscop a fost poziționat spre mijlocul plăcii pentru a simți cel mai bine înclinările robotului. Restul componentelor au fost așezate în completarea plăcii în așa fel încât să minimizez spațiul ocupat de acestea. Traseele au dimensiunile minime care pot fi realizate în laborator, excepție făcând cele de putere care au fost făcute mai groase, atât cât spațiul a permis. Placa fizică a fost realizată în totalitate în laboratorul InGear.

Figura 4.16. Layout placa ballbot

4.3. Carcasa robotului

Figura 4.17. Carcasa robotului

Carcasa robotului este formată din două mari componente: discul robotului și 4 brațe mecanice.

Discul este realizat din plexiglas, are o formă cât mai rotundă și conține foarte multe găuri de prindere, precum și niște decupaje pentru trecerea benzilor de fire conductoare. Acesta este „coloana vertebrală” a robotului, de el fiind prinse toate piesele.

Brațele robotului reprezintă componenta cu un rol esențial în prinderea motoarelor. La o extremitate a acestora se găsește motorul, prins printr-un suport special Pololu pentru micromotoare, iar la cealaltă extremitate, brațul este prins de disc printr-o balama. Am ales să folosesc balamale pentru prindere, pentru a putea regla deschizătura roților, astfel să pot folosi mai multe dimensiuni de mingi. După ce este fixată o deschizătură, brațele vor fi fixate cu ajutorul unui șurub, ce nu le mai permite deplasarea. Datorită acestui sistem, robotul se poate deplasa pe mingi cu diametre cuprinse între 5 și 15 cm.

Implementare Software

Partea software a proiectului contine 2 aplicații:

Aplicație Arduino: citire, filtrare și trimitere date, algoritmi de stabilizare;

Aplicatie PC realizată în C#: monitorizarea parametrilor robotului.

Ambele programe comunică între ele, pentru un control optim al robotului.

Aplicația Arduino

Aplicația pentru Arduino conține implementarea urmatoarelor biblioteci:

Biblioteca citire și filtrare date de la giroscop și accelerometru;

Biblioteca pentru comunicația cu Bluetooth-ul;

Biblioteca pentru organizarea codului pentru motoare;

Biblioteca citire date encodere și pentru calcularea vitezei de rotație a motoarelor;

Biblioteca pentru Algoritmii de reglare;

Datele citite de la giroscop, în format „raw” sunt date întregi, pe 16 biți, având valori între -32768 și 32767. Structura acestora nu este modificată pe parcursul programului, acestea sunt doar filtrate, calculându-se media mai multor valori considerate corecte de algoritmul de filtrare. Giroscopul trimite datele prin interfața I2C. Pentru fiecare dintre cele 3 axe, X, Y și Z ale înclinării se primesc date pe 16 biți, care sunt prelucrate de microcontroller.

Pentru comunicația cu bluetooth-ul a trebuit inițializat dispozitivul periferic UART și setarea unui baud-rate de 115200 bps, rata de transmisie standard a dispozitivului bluetooth. Pe lângă aceste rutine necesare au fost implementate funcțiile pentru inițializarea bluetooth-ului, pentru transmiterea datelor pe 8 sau pe 16 biți (funcție necesară pentru transmisia datelor „raw” de la giroscop), dar și funcții pentru citire date și golire buffer UART. Funcțiile din urmă au fost folosite pentru sincronizarea și citirea comenzilor trimise din aplicația C# pentru motoare. Dispozitivul bluetooth are un protocol destul de simplu și acceptă comenzi tip șir de caractere. Acestea sunt descrise în manualul pentru programare al dispozitivului.

Pentru motoare am realizat funcții de setare a direcției pinilor, pentru activarea și dezactivarea driverelor, atât din cod, cât și din aplicația de PC, funcție pentru setarea facilă a vitezei fiecărui motor și o funcție pentru setarea frecvenței PWM-ului, deoarece acesta are valori diferite pe unele canale și este important ca toate motoarele să aibă configurații identice. Pentru citirea vitezei data de encodere am folosit o functie implementată în IDE-ul Arduino, „pulseIn”, care calculează cât timp un semnal stă într-o anumită stare. Acest timp a fost transformat într-o valoare mai ușor de înțeles de factorul uman ( rot/min).

În bibliotecile pentru reglare am implementat funcțiile pentru translatarea forțelor în sistemul de coordonate al motoarelor și pentru calcularea proiecțiilor pe axa X a motoarelor, axa direcției de rotire a roților.

Am adus înclinările citite pe 16 biți (valori între -32568 și +32567) în intervalul de comenzi accesibile pentru motoare (-128 – 127) prin împărțirea la un divizor. Pentru a calcula proiecțiile pe axe am aplicat formulele deduse în capitolul 3, pentru înclinările văzute de fiecare motor.

Pentru început am calculat rezultanta înclinării, aceasta fiind distanța de la origine până în punctul care proiectat pe axele X și Y reprezintă erorile pe fiecare axă.

(5.1)

Apoi, am calculat unghiul făcut de rezultanta cu axa X. Acesta poate fi dedus din triunghiul format de rezultanta, proiecția ei pe axa X și de distanța de la axa X până la vârful vectorului, care este chiar înclinarea pe axa Y. De aici rezultă că unghiul este arctangenta raportului dintre înclinarea pe axa Y și înclinarea pe axa X.

(5.2)

Pentru a implementa această funcție am folosit biblioteca „math.h” din limbajul C, care tratează cazul în care x-ul este zero.

În final am calculat eroarea (înclinația) pe fiecare axă, prin translatarea forței și calcularea unghiului dintre rezultantă și axa X a fiecărui motor. Din demonstrația din capitolul 3, au reieșit următoarele valori ale erorilor pentru fiecare motor:

M1: error1 = r x cos(φ – 1.0471);

M2: error2 = r x cos(-φ + 2.0943);

M3: error3 = x.

Mai departe, pentru calcularea comenzii, în cazul algoritmului PD, am calculat derivatele pentru fiecare dintre cele 3 regulatoare după formula:

(5.3)

Apoi comanda dată motoarelor a fost reprezentată de suma valorii proporționale și a celei derivate:

Comandă = Kr x error + Kd x derivata;

Constantele Kr și Kd au fost determinate experimental, pentru fiecare dintre cei 3 algoritmi de stabilizare, nerealizându-se identificarea fizică a sistemului.

În final, fiecare comanda este trimisă la motoare și sistemul ajunge să se stabilizeze.

Aplicația pentru Arduino mai are de asemenea rolul de a trimite prin bluetooth datele citite, precum și comenzile date la motoare, dar și eroarea și acestea să fie monitorizate și transformate în grafice în aplicația de C#, aici putând face mai facil acest lucru.

5.2 Aplicația pentru PC

Aplicația pentru PC constă într-o interfață pentru monitorizarea parametrilor, realizată în limbajul C#. Această aplicație dispune de facilități pentru conectarea la un modul Bluetooth sau la o interfață serială. În cazul ballbotului am folosit un modul bluetooth pentru comunicație.

Interfața de comunicație dispune de butoane pentru găsirea automată a portului pe care se află conectat modulul bluetooth, buton pentru conectarea la portul respectiv, precum și butoane pentru pregătirea modulului bluetooth pentru conectare, apoi se poate apăsa un buton pentru a te conecta la un alt modul pereche.

Am implementat programul în așa fel încât să se conecteze automat la modulul bluetooth al robotului, pentru comoditate și pentru că acesta este principalul scop al aplicației, dar aceasta poate fi conectată și la alte dispozitive ce folosesc modul bluetooth prin scrierea adresei MAC într-o căsuță de text din aplicație. Aplicația poate fi ușor adaptată pentru monitorizarea parametrilor oricărui dispozitiv ce folosește modul bluetooth.

Figura 5.1. Interfață conectare bluetooth

O problemă întâmpinată în conexiunea serială a fost sincronizarea datelor. În acest sens am realizat un protocol simplu, în care trimit doi octeți de sincronizare/aliniere a datelor și apoi trimit datele. Acest lucru este făcut atât în aplicația Arduino, cât și în cea realizată în limbajul C#.

Funcționalitatea principală a aplicației este aceea de a afișa datele primite pe interfața serială. Aceasta conferă posibilitatea afisării intrărilor de la giroscop pe fiecare axa, dar și afisarea vitezei motoarelor, astfel se poate vedea în timp real evoluția tuturor parametrilor robotului controlat wireless.

Figura 5.2 Date giroscop

Am realizat o interfață de tip „tab control” în care există mai multe tab-uri din care se poate alege cel cu graficele dorite (înclinări giroscop, comenzi motoare, erori sistem, etc.) și automat sunt afișate, iar în partea stângă se afișeză măsurătorile sub formă de tabel pentru o urmărire mai facilă. Se afisează automat datele corespunzătoare graficului selectat.

O a doua utilitate a aplicației este de a da comenzi robotului. Se pot opri și porni motoarele robotului, lucru util pentru că uneori este greu de prins și oprit un robot care funcționează anormal. Oprirea și pornirea robotului se poate face prin simpla apăsare a tastei „P” sau a unui buton „START/STOP”, ce îți schimbă numele în functie de comanda care urmează.

Pentru început, îmi propusesem să afișez doar câțiva parametri ai robotului, iar aceștia s-au înmulțit în timp. Acest lucru devenea complicat de implementat și codul avea o repetabilitate aproape perfectă. În acest sens am implementat funcții pentru fiecare acțiune și realizarea unei noi interfețe a devenit foarte ușoară, putând-o realiza doar prin apelul câtorva funcții.

În fiecare grafic sunt afișate ultimele 50 de măsurători. Acestea sunt salvate într-o structură de tip coadă și fiecare nouă citire este introdusă în coadă, eliminându-se cea mai veche măsurătoare. Această tehnica transformă datele primite într-un grafic fluent, în timp real. Actualizarea măsurătorilor se face o dată la 200 de milisecunde pentru a se realiza un grafic interpretabil. Această valoarea a fost aleasă experimental. La valori mici ale perioadei de eșantionare graficele se derulează prea repede, neputându-se întelege nimic din acestea, iar pentru timpi mai mari de așteptare, graficul devine mai puțin interesant.

Figura 5.3 Comenzi motoare

Se pot vedea, in figura de mai sus, ultimele 50 de comenzi date motoarelor, citite la un interval fix de 200 ms. Comenzile sunt trimise de pe aplicația de Arduino la 7 ms și sunt citite din 200 in 200 ms, pentru a putea fi ușor de urmărit.

6. Rezultate și concluzii

Împreună cu această lucrare, am mai realizat să următoarele lucruri:

O aplicație ce folosește un model complex de pendul invers;

Monitorizarea în timp real a parametrilor robotului;

Implementarea unor algoritmi de reglare;

Aplicație: Alternativa la dispozitivul electric de deplasare Segway.

O prima îmbunatățire adusă robotului ar fi găsirea unei metode care să confere robotului o aderență superioară, aceasta fiind principala problemă a robotului. Schimbarea roților normale cu roti omnidirecționale a reprezentat un mare avantaj, eliminând unele probleme, dar nu a rezolvat in totalitate problema alunecării.

Un avantaj major ar aduce și realizarea unui algoritm de reglare mai eficient, de exemplu un regulator folosind tehnici fuzzy.

O alta imbunatățire ar fi montarea unor senzori de distanță pentru a detecta posibilele obstacole. Acest lucru ar ajuta la implementarea unui algoritm care să facă robotul autonom. Placa realizată pentru acest robot, are 2 conectori disponibili adăugați în acest scop. De asemenea aș putea înlocui stabilizatoarele de tensiune cu o sursă în comutație, care ar putea oferi curenți mai mari, cu o disipare mai mică de căldură, deci o eficiență mai mare.

Anexe

Bucla principală a programului Arduino

Funcțiile principale pentru modulul bluetooth

Pornirea și oprirea motoarelor în ambele aplicații

Filtrarea datelor

Rutină sincronizare conexiune

Deschiderea portului serial în aplicația C#

Algoritmul PD

Funcții realizare grafice C#

Inițializare grafice C#

B i b l i o g r a f i e

[1]. Brian W. Kernighan, Dennis M. Ritchie , The C Programming Language, Prentice Hall Software Seris, 1988

[2] Dumitrache I., 2010 Ingineria reglării automate, Editura Politehnica Press, București

[3]. Walter Bank, Gordon Hayward, Fuzzy Logic in Embedded Microcomputers and Control Systems, in Byte Craft Limited Eng., Octomber, 2002.

[4]. Barıș Can Yalçın, Design of a Low Cost Motion Data Acquisition Setup for Mechatronic Systems, World Academy of Science, Engineering and Technology International Journal of Mechanical, Aerospace, Industrial and Mechatronics Engineering Vol:8, No:7, 2014.

[5]. Karl Johan Astrom, Control & Dynamical Systems, 2002

[6] Brauln T., 2008 Embedded Robotics Second Edition, Springer, Leiptig

[7] Kumagai M, 2008, Development of a robot balancing on a ball, http://ieeexplore.ieee.org/xpl/login.jsp?tp=&arnumber=4694680&url=http%3A%2F%2Fieeexplore.ieee.org%2Fxpls%2Fabs_all.jsp%3Farnumber%3D4694680 accesat la 14.06.2015

[8] Umashankar Nagarajan, George Kantor, and Ralph Hollis, The Ballbot: An Omnidirectional Balancing Mobile Robot, http://www.umashankarnagarajan.com/Ballbot_Intro_IJRR.pdf, accesat la 15.06.2015

B I B L I O G R A F I E F i g u r i

=== B_I_B_L_I_O_G_R_A_F_I_E ===

B i b l i o g r a f i e

[1]. Brian W. Kernighan, Dennis M. Ritchie , The C Programming Language, Prentice Hall Software Seris, 1988

[2] Dumitrache I., 2010 Ingineria reglării automate, Editura Politehnica Press, București

[3]. Walter Bank, Gordon Hayward, Fuzzy Logic in Embedded Microcomputers and Control Systems, in Byte Craft Limited Eng., Octomber, 2002.

[4]. Barıș Can Yalçın, Design of a Low Cost Motion Data Acquisition Setup for Mechatronic Systems, World Academy of Science, Engineering and Technology International Journal of Mechanical, Aerospace, Industrial and Mechatronics Engineering Vol:8, No:7, 2014.

[5]. Karl Johan Astrom, Control & Dynamical Systems, 2002

[6] Brauln T., 2008 Embedded Robotics Second Edition, Springer, Leiptig

[7] Kumagai M, 2008, Development of a robot balancing on a ball, http://ieeexplore.ieee.org/xpl/login.jsp?tp=&arnumber=4694680&url=http%3A%2F%2Fieeexplore.ieee.org%2Fxpls%2Fabs_all.jsp%3Farnumber%3D4694680 accesat la 14.06.2015

[8] Umashankar Nagarajan, George Kantor, and Ralph Hollis, The Ballbot: An Omnidirectional Balancing Mobile Robot, http://www.umashankarnagarajan.com/Ballbot_Intro_IJRR.pdf, accesat la 15.06.2015

Similar Posts