Comanda Unui Robot Mobil Prin Intermediul Interfetei Bluetooth
CUPRINS
Introducere
Capitolul 1. Roboți mobili
1.1. Clasificarea roboților mobili
1.2. Tipuri de roboti
1.3. Structura roboților mobili
1.3.1. Sistemul de locomoție cu șenile
1.3.2. Sistemul de locomoție cu roți
1.4. Acționarea roboților mobili
1.4.1. Elemente constructive ale mașinii de curent continuu
1.4.2. Regimul de motor al mașinii de curent continuu
1.4.3. Comanda motoarelor de curent continuu
1.5. Sistemul senzorial
1.5.1. Clasificarea senzorilor
1.5.2. Fuziunea datelor de la senzori
1.6. Sisteme de comunicare
1.7. Unități centrale de procesare
1.8. Domenii de utilizare
1.8.1. Aplicații ale roboților mobili în medii ostile omului
1.8.2. Aplicații în zone inaccesibile omului
Capitolul 2. Prezentarea robotului mobil
2.1. Structura robotului
2.2. Schema electrica a robotului mobil
2.3. Șasiul robotului mobil
2.4. Farurile
2.5. Minidifuzorul
2.6. Modulul Bluetooth
Capitolul 3. Platforma de dezvoltare Arduino Uno
3.1. Descriere generală a platformei Arduino Uno V3
3.2. Prezentare hardware a platformei Arduino Uno
3.2.1. Alimentarea platformei Arduino
3.2.2. Descrierea pinilor
3.2.3. Semnale PWM
3.3. Programarea platformei
3.4. Microcontrolere
3.4.1. Noțiuni generale privind microcontrolerele
3.4.2. Prezentarea microcontrolerului Atmega328
Capitolul 4. Mediul de programare Arduino
4.1. Prezentarea mediului de programare
4.2. Modul de instalare a mediului de programare și încărcarea unui program
4.3. Instrucțiuni Arduino utilizate pentru programarea robotului
Capitolul 5. Programele realizate pentru robotul mobil
5.1. Programul Arduino al robotului mobil
5.2. Programul pentru platforma Android
Concluzie
Bibliografie
Anexa
Introducere
Un importante aspect în evoluția ființei umane este folosirea uneltelor care să simplifice munca fizică. În aceasta categorie se înscriu și roboții, ei ocupând totuși o poziție privilegiată datorită complexității lor. Domeniile lor de aplicare se lărgesc mereu, ei putând fi utilizați în industrie, transporturi și agricultură, în sfera serviciilor, în cunoașterea oceanului și a spațiului cosmic, în cercetarea științifică etc.
Noțiunea de robot datează de peste 4000 de ani. Omul imaginându-și dispozitive mecanizate care să preia o parte însemnata din efortul fizic depus. Astfel a construit jucării automate și mecanisme inteligente sau și-a imaginat roboții în desene, cărți, filme "SF" etc.
Cuvântul „ robot ” provine din limba cehă (robota) și înseamnă muncitor, sau rob, însă proveniența acestui cuvânt este strâns legată de dramaturgul ceh Karel Capek care l-a introdus pentru prima dată în anul 1921, în piesa de teatru numită „Robotul universal al lui Kossum”, unde ideea generală constă în faptul că omul face robotul după care robotul ucide omul. Acest cuvânt provine din termenul „robota”, care în limbile slavone înseamnă „muncă”, mai exact „muncă grea”. În piesa de teatru, roboții erau făpturi cu înfățișare umană însă lipsiți de caracteristici individuale care să îi deosebească unul de altul. Capacitatea acestor făpturi mecanice era să acționeze conform ordinelor impuse.
Termenul „robot” este definit în moduri diferite de diverse companii constructoare, asociații naționale. De exemplu General Motors afirmă că: ”Robotul este un echipament fizic cu funcționare programabilă, capabil să efectueze anumite operații și secvențe de operații orientate spre manipularea de piese, scule, subansamble.”. Definiția dată de Japan Industrial Robot Association spune că: „Robotul este un dispozitiv versatil și flexibil care oferă funcții de deplasare similare celor ale membrelor umane sau ale cărui funcții de deplasare sunt comandate de senzori și de mijloace proprii de recunoaștere.” O altă definiție este dată de Robot Institute of America și anume: „Robotul este un manipulator multifuncțional, reprogramabil, destinat deplasării materialelor, pieselor, sculelor, sau altor dispozitive specializate prin mișcări variabile, programate pentru a îndeplinii anumite sarcini”. Dar în majoritatea cazurilor când se formulează definiția unui robot, accentul se pune pe latura industrială a acestuia și se poate observa că aceste definiții arată faptul că robotul imită ființa umană sau posibilele acțiuni ale acestuia. În comcluzie roboții sunt sisteme mecanice, comandate de sisteme de conducere ale acestora, fiind realizați cu scopul de a executa, operații asemănătoare acțiunilor omului și nu numai.
Revoluția informatică a marcat saltul de la societatea industrializată la societatea avansat informatizată generând un val de înnoiri în tehnologie și în educație permițând realizarea de roboți.
Din punct de vedere al gradului de mobilitate, se disting două categorii de roboți: roboți fixi și roboți mobili. Primele modele de roboți pot fi numite mai degrabă „automate”, cuvânt ce provine din termenul grecesc „automatos” însemnând „care se mișcă singur”. Conform unor relatări, matematicianul grec Archytas (428 î.Hr.- 347 î.Hr.), a construit unul dintre primele automate, acesta fiind un porumbel propulsat de vapori, care putea zbura singur. Porumbelul din lemn era umplut cu aer sub presiune și avea un ventil care permitea deschiderea și închiderea printr-o contragreutate. În rândul primilor roboți mobili se mai află sistemele Elmer și Elsie, realizate de William Grey Walter, neurofiziolog și robotician american, în anul 1948. Acestea erau niște triciclete care aveau capacitatea de a se îndrepta după o sursă de lumină, și să evite obstacolele din împrejurimi.
Odată cu trecerea timpului au apărut și alte modele care oferă beneficii substantiale muncitorilor, industriilor și implicit țărilor. În situația folosirii în scopuri pașnice, roboții industriali pot influența pozitiv calitatea vieții oamenilor prin înlocuirea acestora în spații periculoase, în condiții de mediu daunatoare omului, în condiții necunoscute de exploatare etc.
Scopul lucrări „Comanda unui robot mobil prin intermediul interfeței Bluetooth”, este de a prezenta modul în care se realizează comanda unui robot mobil, echipat cu microcontroler ATmega328 și a unei interfețe Bluetooth, prin intermediul mediu de programare Arduino și Eclipse, specific platformei de dezvoltare open-source utilizate pentru robotul respectiv. De asemenea se va descrie structura robotului, componentele acestuia și acțiunile pe care robotul este capabil să le efectueze.
Capitolul 1. Roboți mobili
Un robot mobil are o structură mecanică complexă, motoare de acționare care asigură deplasarea în mediul înconjurător, senzori care îi permit orientarea, identificarea și evitarea obstacolelor și un „creier”, constituit dintr-unul sau mai multe procesoare numerice, care asigură comanda întregului sistem astfel încât robotul să poată realiza o sarcină.
Deși în general roboții sunt mașini automate, există și roboți care nu sunt complet automați dar sunt controlați de oameni prin telecomandă. Ei, în majoritatea situațiilor, sunt dotați cu senzori de percepere a mediului în care activează. Controlul uman se realizează prin folosirea unor simple butoane până la joisticuri complicate cu putere de răspuns. Sistemele de comandă includ module de comunicare bazate pe unde radio, sonore (acustice), echolocalizare (ghidare prin ecran), fibre optice sau cabluri.
Mulți roboți sunt construiți prin înlănțuirea unor componente care imită segmentele brațului uman. Toate metodele sunt limitate de imposibilitatea de potrivire perfectă cu capacitatea de manevrabilitate a mâinii umane sub controlul ochiului și creierului uman.
În general roboții sunt utilizați în procesele de fabricație sau ca manipulatoare pe adâncul mării, sau telecomandate. O altă categorie de roboți pot fi utilizați în diverse laboratoare unde se lucrează cu substanțe radioactive sau există temperaturi ridicate sau alte locuri periculoase. Unii roboți sunt mobili, având sistem de locomoție încorporat, putându-se deplasa pe uscat, pe apă, în aer.
Problemele specifice ce apar la roboții mobili sunt următoarele: determinarea poziției și orientării robotului pe teren, evitarea coliziunii cu obiectele staționare sau în mișcare și planificarea celei mai bune traiectorii de mișcare.
Evitarea impactului cu alte obiecte fixe sau mobile situate în spațiul în care operează robotul, se poate face prin mai multe metode: utilizarea senzorilor care măsoară distanța, realizarea unei apărători mecanice care prin deformare oprește robotul, utilizarea senzorilor de proximitate, folosirea informațiilor corelate de la diferite tipuri de senzori. Localizarea obiectelor se poate realiza și prin contact fizic, dar acesta impune limite vitezei de mișcare a structurii manipulate. Contactul fizic dintre robot și obiectele din mediu dă naștere la un cuplu de forțe care modifică starea robotului. Când viteza de lucru a robotului este mare, efectele dinamice ale contactului fizic cu obstacole sau obiecte manevrate pot fi riscante deoarece pot produce deteriorarea robotului sau a obiectelor.
1.1. Clasificarea roboților mobili
Roboții mobili se clasifică astfel:
În funcție de dimensiuni:
macro;
micro
nano-roboți.
În funcție de mediul în care acționează:
roboți tereștri – se deplasează pe sol,
roboți subacvatici – în apă,
roboți zburători – în aer,
roboți extratereștri – pe solul altor planete sau în spațiul cosmic;
În funcție de sistemul care le permite deplasarea în mediul în care acționează,există de exemplu pentru deplasarea pe sol.
roboți pe roți sau șenile.
roboți pășitori: bipezi, patrupezi, hexapozi, miriapozi.
roboți târâtori: care imită mișcarea unui șarpe, care imită mișcarea uneirâme
roboți săritori, care imită deplasarea broaștelor, cangurilor .
roboți de formă sferică (se deplasează prin rostogolire) . [4]
1.2. Tipuri de roboti: [5]
Se pot distinge urmatoarele tipuri de roboți mobili:
Robot umanoid
Robot industrial
Robot explorator
Robot jucărie
Robot de servicii
Robot pășitor
Robot militar
Robot umanoid (sau android):
Imaginea roboților umanoizi a luat formă în literatură, mai ales în romanele lui Isaac Asimov în anii 1940. Acești roboți au fost pentru un timp lung irealizabili. Pentru realizarea lor trebuiesc rezolvate multe probleme importante. Ei trebuie să acționeze și să reacționeze autonom în mediu, mobilitatea lor de locomoție fiind restrânsă la cele două picioare dar mai trebuie să fie capabili de a lucra cu brațele și mâinile.
Din anul 2000 probleme de bază par să fie rezolvate cu apariția lui ASIMO (Honda) ,de exemplu . Între timp apar dezvoltări noi în acest domeniu. Roboții umanoizi pot fi descriși ca roboți pășitori. Trebuie să-l vezi ca să-ți dai seama cât este de avansat: se mișcă natural, dansează, urcă și coboară scările cu ușurință și chiar poate alerga.
Lansat în Decembrie 2005, noul robot umanoid Asimo dezvoltat de compania Honda poate îndeplini diverse sarcini: ghid, recepționer, poate primi sau lua diverse obiecte. Cu ajutorul senzorilor (vizual, ultrasonic) robotul Asimo recunoaște și interacționează cu mediul înconjurator, iar camera video montată în cap și senzorii kinestetici montați în încheieturi îl ajută să interacționeze cu persoane și diverse obiecte.
Dimensiunile unui robot umanoid Asimo sunt: înălțime 130cm, lățime 45cm, grosime 37cm, greutate 54Kg iar din punct de vedere al performanței avem: viteză 6km/h, timp de funcționare 40 minute, total grade de libertate 34.
Roboții industriali:
Un sistem integrat mecano-electrono-informațional, utilizat în procesul de producție în scopul realizării unor funcții de manipulare asemănătoare cu cele realizate de mâna omului, conferind obiectului manipulat orice mișcare programată liber, în cadrul unui proces tehnologic ce se desfașoară într-un mediu specific. Execută mișcări după un program flexibil, modificabil, în funcție de sarcinile de producție și de condițiile de mediu . George Devol a înregistrat în anul 1954 primul patent pentru un robot industrial. Roboții industrialiEi trebuie să acționeze și să reacționeze autonom în mediu, mobilitatea lor de locomoție fiind restrânsă la cele două picioare dar mai trebuie să fie capabili de a lucra cu brațele și mâinile.
Din anul 2000 probleme de bază par să fie rezolvate cu apariția lui ASIMO (Honda) ,de exemplu . Între timp apar dezvoltări noi în acest domeniu. Roboții umanoizi pot fi descriși ca roboți pășitori. Trebuie să-l vezi ca să-ți dai seama cât este de avansat: se mișcă natural, dansează, urcă și coboară scările cu ușurință și chiar poate alerga.
Lansat în Decembrie 2005, noul robot umanoid Asimo dezvoltat de compania Honda poate îndeplini diverse sarcini: ghid, recepționer, poate primi sau lua diverse obiecte. Cu ajutorul senzorilor (vizual, ultrasonic) robotul Asimo recunoaște și interacționează cu mediul înconjurator, iar camera video montată în cap și senzorii kinestetici montați în încheieturi îl ajută să interacționeze cu persoane și diverse obiecte.
Dimensiunile unui robot umanoid Asimo sunt: înălțime 130cm, lățime 45cm, grosime 37cm, greutate 54Kg iar din punct de vedere al performanței avem: viteză 6km/h, timp de funcționare 40 minute, total grade de libertate 34.
Roboții industriali:
Un sistem integrat mecano-electrono-informațional, utilizat în procesul de producție în scopul realizării unor funcții de manipulare asemănătoare cu cele realizate de mâna omului, conferind obiectului manipulat orice mișcare programată liber, în cadrul unui proces tehnologic ce se desfașoară într-un mediu specific. Execută mișcări după un program flexibil, modificabil, în funcție de sarcinile de producție și de condițiile de mediu . George Devol a înregistrat în anul 1954 primul patent pentru un robot industrial. Roboții industriali din prezent nu sunt de obicei mobili. După forma și funcția lor, domeniul lor operațional este restrâns. Ei au fost introduși pentru prima oară pe linia de producția a General Motors în 1961. Roboții industriali au fost folosiți prima dată în Germania la lucrări de sudură începând din 1970 .
Robot explorator:
Roboții exploratori sunt roboți care operează în locații greu accesibile și periculoase, teleghidați sau parțial autonom. Aceștia pot lucra de exemplu într-o regiune aflată în conflict militar, pe Lună sau Marte. O navigare teleghidată de pe pământ în ultimele două cazuri este imposibilă din cauza distanței. Semnalele de comunicare ajung la destinație în câteva ore , iar recepționarea lor durează la fel de mult. În astfel de situații roboții trebuie să fie programați cu mai multe tipuri de comportare, din care ei să aleagă pe cel mai adecvat și să-l execute. Acest tip de robot dotat cu senzori a fost folosit și la cercetarea puțurilor din piramide.
Mai mulți cryoboți au fost deja testați de NASA în Antarctica. Acest tip de robot poate pătrunde până la 3.600 de metri prin gheață. Cryoboții pot fi astfel folosiți în cercetarea capelor polare pe Marte, în speranța descoperirii de viață extraterestră.
Alți roboți:
Roboții se mai numesc și unități mobile. Aceste unități pot depista și dezamorsa sau distruge bombe sau mine (de exemplu robotul TALON). Există și roboți care ajută la căutarea de oameni îngropați după cutremure, sau așa-numiții killer-roboți. În 2004 au fost 2 milioane de roboți în uz, pe când pentru anul 2008 s-a așteptat la 7 milioane de instalații noi. Uniunea Europeană susține financiar lucrările de cercetare, care în 2010 au fost permise ca roboții să fie introduși în spitale în activități simple, ca de exemplu: transporturi de paturi în spital, livrarea mâncării, salubrizare.
1.3. Structura roboților mobili
Structura roboților mobili (RM) corespunde arhitecturii generale a roboților, având două părți:
Structura mecanică, respectiv manipulatorul, care determină performanțele tehnice;
Structura electronică, respectiv de comandă-control, care condiționează calitatea performanțelor.
Indiferent de generația robotului, probleme complexe apar la realizarea structurii mecanice de volum, greutate și cost reduse, la transmiterea mișcării și adaptarea la structura mecanică a motoarelor electrice și hidraulice, la proiectarea mâinilor mecanice pentru a apuca obiecte de diferite forme.
Referitor la structura electronică, posibilitățile actuale permit folosirea a câte unui microprocesor pentru comanda fiecărui grad de mobilitate, precum și a altor microprocesoare specializate pentru tratarea semnalului senzorial.
Robotul mobil interacționează cu mediul înconjurător prin structura sa mecanică, asigurând astfel deplasarea, poziționarea și orientarea organului de execuție.
Structura mecanică a roboților mobili este formată din:
sistemul de locomoție (pe șenile sau roți), prin care se asigură deplasarea robotului pe o suprafață de lucru (în cadrul unei autonomii sporite);
sistemul de manipulare, care asigură poziționarea și orientarea organului de lucru.
Locomoția este procesul care îi permite robotului mobil să se deplaseze prin mediu, prin acționarea anumitor forțe asupra sa. Studiul acțiunii acestor forțe se numește dinamică, iar studiul formulelor matematice asociate mișcării, fără a considera forțele fizice, se numește cinematică.
Una din tehnicile de estimare a poziției unui robot mobil în mediul său se numește odometrie. Prin odometrie se calculează distanța parcursă de un robot mobil în funcție de cât de mult s-au rotit roțile acestuia. În cazul unei roți ideale, la fiecare rotație a acesteia se poate considera că robotul a parcurs o distanță egală cu 2πr, unde r reprezintă raza roții respective. În practică însă, datorită forțelor de frecare și a aluncărilor, estimările sunt mult mai puțin precise.
Un robot mobil aflat într-un plan are 3 grade de libertate: o poziție (x, y) și o orientare θ față de axa orizontală. Tripletul (x, y, θ) se mai numește și poziția (relativă sau absolută) a robotului mobil (en. robot pose) și constituie variabila efectivă de control a sistemului de locomoție.
Datorită faptului că un robot mobil nu are control complet asupra celor trei variabile, o serie de manevre mai mult sau mai puțin complexe trebuie îndeplinite pentru ca robotul mobil să ajungă dintr-o anumită poziție în alta. În literatura de specialitate, poziția de start se notează cu (xs, ys, θs), iar poziția unde trebuie să ajungă robotul cu (xg, yg, θg).
În dotarea unor roboți mobili, pe lângă roțile motoare, se regăsesc fie roți adiționale fie alte puncte de contact care nu fac altceva decât să asigure suportul robotului. Cele mai des întâlnite sunt roțile de tip castor, roți care nu sunt de obicei luate în considerare în ecuațiile cinematice ale robotului mobil. [3]
Funcția de locomoție cuprinde sistemul de acționare electric (de propulsie) și sistemul de sprijinire (suspensie) care permit robotului mobil să se miște liber în mediul său de lucru. Modalitățile de propulsare sunt dintre cele mai diverse,cum ar fii: pe roți, cu jet de apă, cu aer etc.
Cel mai folosit mod de deplasare se realizeaza cu ajutorul roților. Roata este o invenție umană care atinge o eficiență extrem de mare pe o suprafață plată. Acest mecanism nu este complet străin față de sistemele biologice.
Locomoția cu ajutorul roților pe suprafețe plane poate fi și de două ori mai eficace decât cea cu ajutorul picioarelor. Un exemplu bun sunt căile ferate. Acestea sunt ideal proiectate pentru locomoția pe roți deoarece frecarea prin rostogolire este minimalizată pe o suprafață din oțel plată și dură. În schimb situația e alta când suprafața pe care se deplasează robotul este moale, în acest caz locomoția pe roți prezintă ineficiențe datorită frecării prin rostogolire. Deci putem spune că eficiența este influențată în mare parte de însușirile mediului înconjurător, în special de netezimea și duritatea solului.
Un robot trebuie să interacționeaze cu mediul său înconjurător iar în această interacțiune un rol important revine funcțiilor de manipulare, care servesc la prinderea, transportul și manipularea obiectelor. Nu toți roboții au nevoie de brațe și mâini sofisticate; mulți se pot descurca cu sisteme de prindere cu două bacuri, care se închid și deschid, sau cu mâini cu 2-3 degete mai simple.
În timpul manipulării, brațul robotului este fix, însă mișcă obiectele în spațiul de lucru, imprimându-și forța asupra acestora. În cazul locomoției este invers, mediul înconjurător este fix, iar robotul se mișcă imprimându-și forța asupra mediului înconjurător. În ambele cazuri, baza științifică este reprezentată de studiul elementelor de execuție care generează forțe de interacțiune, și mecanisme care aplică proprietăți adecvate de cinematică și de dinamică.
Locomoția și manipularea împărtășesc probleme legate de:
Tipul de mediu:
mediu(de ex. aer, apă, sol dur, sol moale)
structură
Caracteristicile contactului:
punctul de contact/mărimea și forma traiectoriei;
unghiul de contact;
frecarea.
Stabilitatea:
numărul și geometria punctelor de contact;
stabilitatea statică/dinamică;
centrul de gravitație;
Roboții mobili cu sistem de locomoție cu șenile sunt realizați într-o gamă foarte variată de dimensiuni și greutăți, având diferite grade de mobilitate, în funcție de complexitatea operațiilor pe care trebuie să le efectueze, cu diferite viteze de deplasare.
Roboții mobili cu sistem de locomoție cu roți pneu au dimensiuni de gabarit și sunt foarte grei, însă au viteza de deplasare superioară față de roboții mobili cu șenile.
Roboții mobili cu sistem de locomoție cu picioare au dimensiuni de gabarit și greutate mare, viteze de deplasare mai mici, îndeplinind mai puține operații decât roboții din primele două categorii.
Autonomia roboților mobili este strict legată de tipul bateriilor, de acumulatoarele care sunt folosite la alimentarea motoarelor, în cazul celor mai bune baterii această autonomie ajungând la 9 ore. În cazul în care robotul mobil este alimentat prin cablu de alimentare cu curent electric, lungimea acestora este de maxim 250 metri, iar raza de acțiune prin radio este în majoritatea cazurilor de 300 metri.
1.3.1. Sistemul de locomoție cu șenile [10]
În general, sistemul de deplasare cu șenile are în componență:
roată motoare I;
roată de întindere II;
două sau mai multe roți purtătoare III;
una sau două roți de susținere IV a șenilei V;
șenila V, realizată ca un lanț articulat plan.
Figura 1.5. Sistem de locomoție cu șenilă
Roata motoare I este o roată dințată conducătoare care angrenează cu lanțul articulat ce formează șenila V.
Roata dințată II asigură ghidarea și întinderea șenilei.
Roțile purtătoare III realizează punctele de sprijin și derulare ale robotului mobil; aceste puncte se obțin peramura inferioară a lanțului șenilei care ce formează ramura întinsă care vine în contact cu suprafața terenului.Numărul roților purtătoare este funcție de greutatea robotului și de sarcina pe care acesta o ridică sau o transportă.
Roțile de susținere IV formează puncte de susținere a ramurii superioare a șenilei, care este ramura slăbită, liberă a șenilei.
Șenila V este compusă din mai multe eclise de cauciuc, cu armătură metalică, montate articulat cu bolțuri pentru realizarea lungimii totale necesare. Pentru a obține aderența la sol, șenila este prevăzută la partea exterioară cu proeminențe în X, iar pe partea interioară sunt prezenți dinți pentru angrenarea cu roata motoare.
Indiferent de construcție, șenila formează o cale de rulare fără sfârșit, prin care se obține propulsia robotului, se asigură aderența acestuia cu solul și se obține o presiune specifică pe sol mult mai mică decât în cazul altor soluții.
Acționarea roții motoare se face cu un motor electric de curent continuu, alimentat de la baterii de acumulatoare sau de la un grup electrogen cu putere corespunzătoare.
Reductorul folosit este de tip armonic (cu deformator și roată dințată elastică) și este prevăzut cu cuplaj ireversibil, prin care se asigură frânarea vehiculului robot la opririle în pantă.
Sistemul de locomoție cu șenile permite deplasarea robotului înainte și-napoi, efectuarea virajelor la stânga și dreapta, precum și o rotație în plan orizontal. De asemenea, șenila permite robotului mobil să urce și să coboare pe scări cu pante până la 450.
1.3.2. Sistemul de locomoție cu roți [10]
Acest sistem de locomoție cu roți, prevăzute cu pneu, permite viteze de deplasare mai mari decât cel cu șenile. Roboții cu astfel de sistem de locomoție acționează de
regulă în zone cu teren asfaltat sau pietruit, având posibilități de trecere peste obstacole mai mici decât în cazul celor cu șenile.
În funcție de greutatea robotului și sarcina de manipulat, acest sistem de locomoție pe roți poate fi prevăzut cu 3 roți, 4 roți sau 6 roți, acționarea fiecărei roți fiind de regulă individuală.
Figura 1.6. Sistem de locomoție cu 2×3=6 roți
În general roțile din mijloc II sunt articulate la o osie fixată de șasiul 2, iar roțile extreme I și III sunt articulate la brațele 1 respectiv 3 care pot oscila, în plan vertical, în raport cu șasiul 2.
Acționarea fiecărei roți motoare se face independent, cu ajutorul motoarelor electrice de curent continuu, folosindu-se reductoare armonice, alimentarea făcându-se de la baterii de acumulatoare sau de la grupuri electrogene adecvate.
Sistemul de locomoție cu roți permite deplasarea robotului înainte și-napoi, efectuarea virajelor la stânga și la dreapta, precum a unei rotații în plan orizontal.
De menționat că raza de virare în cazul sistemului de locomoție cu roți este mai mare decât la sistemul cu șenile. Raza de virare se poate modifica de la o valoare minimă (fig. a) la o valoare maximă (fig. b).
Figura 1.7. Virarea șasiului la stânga
1.4. Acționarea roboților mobili
Acționarea roboților mobili se face cu motoare electrice de putere mică, cu moment de inerție redus, cu capacitate de suprasarcină, cu reductoare de raport mare (i>100) și moment de inerție redus de tip procesional sau armonic. Se pot folosi și unități integrate motor-reductor
Motoare electrice cu inerție redusă utilizate:
motoare sincrone cu magneți permanenți;
motoare de curent continuu cu pahar sau indus disc;
motoare sincrone cu magneți permanenți;
motoare pas cu pas cu reluctanță variabilă cu indus pahar și intrefier radial sau cu indus tip disc și intrefier radial;
Mașina de curent continuu [12]
Mașina de curent continuu cunoaște o mare răspândire în sistemele de acționare electrică, datorită caracteristicilor electromecanice avantajoase pe care le prezintă.
Mașina de curent continuu este utilizată atât în regim de motor cât și în regim de generator; regimul de frână este întâlnit numai incidental în funcționarea mașinii de curent continuu.
În mașina de curent continuu câmpul inductor este fix față de armătura inductoare, realizată ca stator. Câmpul inductor poate fi produs cu ajutorul curentului continuu sau cu ajutorul magneților permanenți (la puteri mici). Înfășurarea prin care trece curentul continuu pentru producerea câmpului inductor se numește înfășurare de excitație.
Indusul mașinii de curent continuu, realizat pe rotor, este prevăzut cu o înfășurare de curent continuu (de tip închis), conectată la colector, organ caracteristic și indispensabil al mașinii de curent continuu, care are rolul de a redresa curentul alternativ al indusului pentru a da în circuitul exterior un curent continuu.
Figura 1.8. Conexiunile mașinilor de curent continuu:
a – cu excitație separată; b- cu excitație derivație; c- cu excitație serie;
d – cu excitație mixtă.
Înfășurarea de excitație a mașinii de curent continuu poate fi în diferite moduri: de la surse exterioare mașinii (a), când se spune că mașina are excitație separată, sau chiar de la bornele mașinii, când se spune că mașina este autoexcitată. După modul de excitație mașinile cu autoexcitație pot fi excitate în paralel sau în derivație (b), cu excitație serie (c), sau cu excitație compusă (d).
Regimul nominal de funcționare al mașinii de curent continuu se caracterizează prin mărimile nominale, pentru care a fost dimensionată mașina și care sunt înscrise pe plăcuța indicatoare a mașinii: regimul de funcționare (generator, motor); puterea în kW; la generatoare puterea electrică la borne, la motoare, puterea mecanică la arbore; curentul la bornele principale în A; tensiunea la borne în V ; turația nominală în rot/min; tensiunea și curentul de excitație în V respectiv în A; regimul de lucru (de durată, intermitent, scurtă durată).
Principiul ei de funcționare bazându-se, ca și la celelalte mașini electrice, pe legea inducției electromagnetice.
Piesa cu rol de redresor mecanic, la generatorul de curent continuu, și de invertor mecanic, la motorul de curent continuu, este colectorul mașinii care se plasează între înfășurarea rotorică și exterior, periile fac elementul de legătură.
1.4.1. Elemente constructive ale mașinii de curent continuu
Mașina de curent continuu, are două părți constructive de bază: statorul, compus din carcasă (din oțel masiv, ce are și rolul de jug statoric), polii principali (sau de excitație, din tole), polii auxiliari (de comutație, din oțel masiv, fiind specifici numai mașinilor cu puteri de peste 1kW), înfășurările rotorice excitație și ale polilor auxiliari, scuturile laterale, sistemul de perii, lagărele și bornele; rotorul, compus din miezul feromagnetic (din tole izolate, crestat spre întrefier), înfășurarea rotorică (așezată în crestăturile rotorice), colectorul, ventilatorul, rulmenții și arborele.
Figura 1.9. Secțiunea transversală prin mașina de curent continuu
În figura de mai sus, se prezintă o secțiune transversală printr-o mașină de curent continuu, bipolară în care se regăsesc majoritatea elementelor enumerate mai sus: 2- poli principali; 3- bobina de execuție; 4- poli auxiliari; 5- bobina polului auxiliar.
Colectorul mașinii de curent continuu este alcătuit din lamele conductoare din cupru.
Pe colector se găsesc periile mașinii confecționate din grafit prin intermediul cărora se face legătura între exteriorul mașinii și înfășurarea rotorică.
Înfășurarea rotorică este închisă, fără bornă de început sau sfârșit. Elementul de bază al înfășurării este secția, care are spire și care reprezintă bobina așezată în crestăturile rotorice ale cărei capete se leagă la două lamele vecine de colector (la înfășurarea buclată), sau la două lamele distanțate cu un pas diametral (la înfășurarea ondulată). Un alt element al înfășurării rotorice îl reprezintă calea de curent, care este porțiunea de înfășurare, formată din secții înseriate pe care le parcurgem când ne deplasăm pe înfășurare între două perii consecutive, care sunt întotdeauna cu nume contrar.
De regulă, tensiunile electromotoare induse în secțiunile unei mașini de curent au același sens și din însumarea lor rezultă t.e.m. totală între periile mașinii. Numărul total de curent este par. Înfășurarea buclată are întotdeauna 2a = 2p, (p = numărul de perechi de poli ai mașinii), iar înfășurarea ondulată are întotdeauna 2a=2. Sub aspectul introducerii t.e.m., nu există deosebiri între înfășurările buclată și ondulată. Periile mașinii sunt plasate simetric pe periferia colectorului și numărul lor este egal cu numărul de poli de excitație ai mașinii. Polaritatea periilor alternează pe colector.
Sensul cuplului electromagnetic se determină cu ajutorul vectorului , unde este densitatea de curent din conductoare; semnul minus arată că se opune mișcării, adică sensurile adoptate pentru curent și pentru câmpul magnetic corespund regimului de generator.
Figura 1.10. Sensul câmpului electromagnetic și al vitezei unghiulare
la generatorul de curent continu
1.4.2. Regimul de motor al mașinii de curent continuu
Mașina de curent continuu poate funcționa și în regim de motor electric. Motorul electric transformă puterea electrică primită de la o rețea electrică în putere mecanică prin intermediul câmpului electromagnetic.
Figura 1.11. Motorul de curent continuu
În regim de motor cuplul electromagnetic, schimbă semnul și acționează asupra rotorului în sensul de rotație (cuplu activ). În regimul de motor sensurile de referință ale tensiunii la borne și ale curentului se asociază după regula de la receptoare.
După modul de conectare a înfășurării de excitație se disting: motoare cu excitație separată, motoare cu excitație derivație, motoare cu excitație serie și motoare cu excitație mixtă. Când alimentarea motorului se face de la o sursă de tensiune constantă nu există deosebire între motorul cu excitație separată și motorul cu excitație derivație.
Polaritatea polilor auxiliari se stabilește după aceeași regulă ca la generator și rezultă că parcurgând periferia rotorului în sensul de rotație, întâlnim întâi un pol auxiliar de polaritate opusă față de polul de excitație care urmează.
Motoarele de curent continuu prezintă o deosebită importanță în acționările cu reglaj de viteză, cunoscând în prezent o largă dezvoltare, ca fabricație și utilizare.
1.4.3. Comanda motoarelor de curent continuu
Atunci când dorim să comandăm un motor (de curent continuu sau pas cu pas) suntem cel mai des obligați să inversăm polaritatea motorului. Mai mult este de preferat să se poată varia viteza motorului. Soluția acestor două probleme se numește punte H.
O punte H (eng. H Bridge) este un circuit electronic ce permite aplicarea unei tensiuni pe o sarcină în orice sens. Aceste circuite sunt adesea folosite în robotică și alte aplicații pentru a permite motoarelor de curent continuu să ruleze înainte și înapoi. Punțile H sunt disponibile ca circuite integrate sau pot fi construite din componente discrete, tranzistoare bipolare sau MOS.
Puntea H are numele derivat de la modul obișnuit de desenare a circuitului. Aceasta este singura cale de tip solid state de a comanda motorul în ambele direcții.
Figura 1.12. Reprezentarea schematică a punții H
Mod de funționare: atunci când întrerupătoarele S1 și S4 (în conformitate cu figura 1.12.) sunt închise și S2 și S3 sunt deschise o tensiune pozitivă va fi aplicate la nivelul motorului. Prin deschiderea întrerupătoarelor S1 și S4 și închiderea întrerupătoarelor S2 și S3, această tensiune este inversat, astfel să permită funcționarea inversă a motorului.
Folosind nomenclatura de mai sus, întrerupătoarele S1 și S2 nu trebuie să fie închise în același timp, deoarece acest lucru ar provoca un scurt-circuit la sursa de tensiune (Vin). Același lucru se aplică și întrerupătoarelor S3 și S4.
În practică întrerupatoarele S1,S2,S3,S4 sunt tranzistoare bipolare sau MOS-FET.
Figura 1.13. Funcționarea punții H
a) circuitul inchis pentru rotația în sensul acelor de ceasornic b) circuitul inchis pentru rotația în sensul opus acelor de ceasornic
Figura 1.14. Circuitul activ al puntii H în functie de sensul rotației
a) în sens acelor de ceasornic, b) în sensul opus acelor de ceasornic
Figura 1.15. Punte H realizata cu tranzistoare MOSFET complementare
Figura 1.16 Punte-H cu tranzistoare bipolare și logica de comandă
Figura 1.17. Schema ISIS (simulară)
1.5. Sistemul senzorial
Robotul mobil este pus în situația de a desfășura acțiuni similare cu cele ale operatorului uman. Acest lucru determină existența unor anumite dispozitive prin care să se culeagă informații din mediul de lucru, care să realizeze interacțiunea robot . mediu cu ajutorul unor caracteristici ale mediului sau ale obiectelor din mediu și o unitate centrală care să prelucreze în timp real informația senzorială, să o transforme într-o formă utilă pentru sistemul de comandă.
Senzorii sunt dispozitive care pot măsura diferite proprietăți ale mediului precum: temperatura, distanța, rezistența fizică, greutatea, mărimea, etc. Informația primită de la aceștia poate fi de cele mai multe ori contradictorie și imprecisă.
Sistemul senzorial mai este numit și sistem de măsurare. El asigură măsurarea unor mărimi fizice și eventual perceperea unor modificări semnificative a acestor mărimi.
Datorită sistemului senzorial se pot pune în evidență și caracteristicile geometrice și chimice ale obiectelor din mediul de lucru. Senzorii datorită caracteristicilor pe care le au pot explora zona de lucru, zona de contact, cea apropiată, cea îndepărtată, iar senzorii foarte puternici chiar și zone foarte îndepărtate. Informațiile culese cu ajutorul sistemului senzorial servesc la construirea unui model al lumii în care evoluează robotul, model funcție de care aceasta își va genera planurile de acțiuni viitoare.[11]
1.5.1. Clasificarea senzorilor [13]
În cel mai general caz, senzorii pot fi împărțiți în două categorii, și anume:
Senzori de stare internă – senzori care oferă informații despre starea internă a robotului mobil, spre exemplu nivelul bateriei, poziția roților, etc;
Senzori de stare externă – senzori care oferă informații despre mediul ambiant în care robotul funcționează. Senzorii de stare externă se mai pot împărți la rândul lor în două categorii: senzori cu contact, mai precis acei senzori care culeg informația din mediu prin atingere (exemplu: sensor „bumper”), respectiv senzori fără contact, care preiau informația din mediu de la distanță (exemplu: cameră video, senzor ultrasonic, etc).
Un senzor poate fi activ sau pasiv. Senzorii activi sunt acei senzori care emit energie în mediu pentru a putea observa anumite caracteristici ale acestuia, spre deosebire de senzorii pasivi care primesc energie din mediu pentru a putea prelua informația.
La modul general, despre toate categoriile de senzori se pot enunța următoarele ipoteze:
Orice senzor este afectat de zgomot;
Orice senzor oferă o informație incompletă a mediului în care efectuează
măsurătorile;
Nici un senzor nu poate fi modelat complet.
De asemenea, toate tipurile de senzori sunt caracterizate printr-o serie de
proprietăți, cele mai importante fiind:
Sensibilitatea: raportul dintre semnalul de ieșire și semnalul de intrare;
Liniaritatea: exprimă dacă raportul dintre intrare și ieșire este constant;
Intervalul de măsurare: diferența între distanța minimă și maximă măsurabilă;
Timpul de răspuns: timpul necesar pentru ca informația de la intrare să fie observabilă la ieșire;
Acuratețea: diferența între semnalul măsurat și semnalul real;
Repetabilitatea: diferențele între măsurători succesive ale aceleiași entități;
Rezoluția: exprimă cea mai mică unitate de incrementare a semnalului măsurat;
Prețul senzorului;
Puterea de calcul necesară pentru a interpreta rezultatele;
Tipul de semnal la ieșire;
Greutatea, mărimea și cantitatea de energie consumată pentru a face o măsurătoare.
Relația între proprietățile fizice de interes e ale mediului și informația primită de la un senzor r ar putea fi modelată prin ecuația:
f (e) = r
În principiu, orice model al unui senzor ar trebui să includă și un model intern al zgomotului care poate afecta senzorul în momentul citirii informației. Problema de a recupera informația din mediu din datele primite de la senzor poate fi destul de complexă.
Un senzor este considerat instabil dacă pentru variații mici ale intrării, ieșirea
se schimbă radical. În caz general, pentru un senzor cu ieșirea f(e), instabilitatea se
referă la:
În principiu orice tip de senzor poate fi afectat de mai multe tipuri de erori. Dintre acestea, cele mai importante sunt erorile incidentale, erorile sistematice și erorile stohastice. Erorile incidentale apar ocazional și pot avea un efect neprevăzut asupra informației, ele provenind în cea mai mare parte de la măsurători effectuate greșit. Erorile sistematice au o influență predictibilă asupra acurateții informației, acestea provenind de la o interpretare greșită a parametrilor în algoritmii de estimare, sau din cauza unor neconcordanțe (incertitudini) în modelare. În fine, erorile stohastice, au un caracter aleator, ele diferind de fiecare dată când robotul execută aceeași operație.
În lumea roboților mobili se întâlnesc o mare varietate de tipuri de senzori. O
clasificare de bază a acestora ar putea fi:
senzori de distanță – acei senzori care oferă informații despre distanța între senzor și obiectul de măsurat din mediu;
senzori de poziție – acei senzori care oferă informații despre poziția robotului în termeni absoluți;
senzori de mediu – acei senzori care oferă informații despre diverse proprietăți și caracteristici ale mediului (exemplu: temperatură, culoare);
senzori inerțiali – acei senzori care măsoară proprietăți diferențiale ale poziției robotului (exemplu: accelerația).
O altă clasificare a senzorilor se poate face în funcție de tipul de semnal primit, precum și de rolul senzorului în sistemul robotului mobil, îmbinând deci cele două clasificări de mai sus:
Senzori de contact – aceste dispozitive pot fi simple întrerupătoare care raportează o valoare binară, 0 sau 1, valoare corespondentă stării de fapt: deschis sau închis. Astfel, în momentul în care robotul echipat cu senzori de acest tip se lovește de un alt obiect, întrerupătorul se va închide semnalând acest lucru.
Senzorii în infraroșu (IR) – metoda lor de funcționare este foarte simplă, fiecare senzor fiind echipat cu un emițător și un detector. Emițătorul transmite un fascicol de lumină în spectrul infraroșu, fascicol care se propagă în mediu, iar apoi se reflectă de obiectele aflate în acesta. Fascicolul reflectat este captat de componenta detector, urmând apoi ca printr-un calcul matematic simplu, să se estimeze o distanță între senzorul infraroșu și obiectul detectat din mediu.
Senzorii ultrasonici – folosesc un principiu oarecum asemănător cu senzorii IR, dar în loc de a transmite fascicole luminoase, ei folosesc semnale acustice (sunete). Un emițător sonar (en. SOund Navigation and Ranging) transmite un semnal acustic în mediu, urmând apoi ca reflecția acestuia să fie recepționată de componenta detector a senzorului. Timpul în care semnalul este receptat înapoi de senzor precum și atenuarea semnalului reprezintă aspecte exploatate de diferitele tipuri de senzori sonar.
Senzori laser – cu ajutorul acestor senzori se pot măsura distanța, viteza cât și accelerația anumitor obiecte din mediu față de robotul mobil. Principiul cu care operează un senzor laser este similar cu cel al unui senzor sonar, însă în loc de a trimite un semnal acustic, un puls scurt de lumină este trimis. Timpul între transmisia și recepția pulsului luminos este apoi folosit pentru a determina distanța până la obiectul respectiv.
Senzori GPS – Sistemul de poziționare globală prin satelit (en. Global Positioning System) este alcătuit din aproximativ 21 de sateliți, și permite oricărui receptor autorizat să-și calculeze poziția și viteza cu care se deplasează. Sistemul GPS nu poate fi folosit în interiorul clădirilor, deoarece el necesită ca între receptor și satelit să existe vizibilitate directă.
Senzorii piroelectrici – sunt traductoare care convertesc căldura într-un semnal electric. Acești senzori sunt de regulă sensibili la lungimi de undă mari din spectrul infraroșu, zonă în care animalele și omul emit radiații.
Senzori video – Senzorii vizuali sunt reprezentați de regulă în lumea roboților mobili de camere video. În momentul de față senzorii de imagine folosesc două tehnologii: CCD și CMOS. Din punct de vedere al roboticistului însă, nu există diferențe esențiale între cele două tehnologii, astfel că, orice cameră video poate fi folosită cu succes.
Senzorii de stare internă sunt acei senzori careoferă informații despre starea internă a robotului mobil. Senzorii din această categorie oferă fie informații legate de poziția robotului (odometrie), fie informații referitoare la vitezele sau accelerațiile liniare respectiv unghiulare ale robotului (accelerometru, giroscop).
1.5.2. Fuziunea datelor de la senzori [13]
Pentru majoritatea sarcinilor atribuite unui robot mobil, folosirea unui singur tip de senzori nu poate da rezultate satisfăcătoare. Spre exemplu, pentru navigare, anumite obiecte din mediu pot fi detectate doar de senzori IR, iar altele doar de senzori sonar, și doar unele de ambele tipuri de senzori. Se pune deci problema găsirii unei metode care să combine într-un mod eficient informațiile de la o multitudine de senzori de categorii și caracteristici diferite. Termenul cel mai des întâlnit în literatura de specialitate este „fuziune de senzori” (en. data sensor fusion).
În contextul roboților mobili, fuziunea trebuie să fie efectuată pe următoarele trei nivele:
Trebuie să combine măsurători de la senzori de categorii diferite;
Trebuie să combine măsurători din poziții diferite;
Trebuie să combine măsurători efectuate la diferite intervale de timp.
Procesul de combinare al măsurătorilor din diferite poziții, intervale de timp sau senzori este oarecum similar procesului de interpolare, extrapolare și găsirea unei funcții matematice pentru un anumit set de date. În cea mai simplă formă statică, combinația măsurătorilor ar putea fi exprimată printr-o formulă de genul:
O metodă mai complexă pentru fuziunea datelor de la senzori constă în folosirea rețelelor neuronale pentru a asocia ieșirea sistemului cu un set de intrări date. Un exemplu simplu este oferit în figura următoare.
Figura 1.18. Exemplu de rețea neuronală folosită la procesul de fuziune al senzorilor
Exemplul din figura, combină datele provenite de la o serie de senzori ultrasonici (S1..16) cu datele provenite de la o serie de senzori interni ai robotului, date de odometrie. Aceste informații sunt introduse într-o rețea neuronală feedforward, la ieșire fiind obținute comenzile pentru motoare sub forma vitezei liniare v și a vitezei unghiulare ω.
1.6. Sisteme de comunicare [13]
Roboții mobili trebuie să posede capacități de comunicare fie cu alți roboți din mediu fie cu un operator uman, pentru a raporta dacă o anumită sarcină dată a fost îndeplinită cu succes, sau nu. Sistemele de comunicare aferente roboților mobile pot fi de 2 categorii: cu fir respectiv fără fir.
Comunicația cu fir este modalitatea cea mai simplă de transfer de date între robot și operator. O serie de probleme asociate transmisiei fără fir, dispar în cazul comunicației de date cu fir, cu prețul îngrădirii mobilității robotului. Avantajul principal al sistemelor de comunicare cu fir este acela că, pe lângă datele transmise între robot și operatorul uman, se mai poate transmite și curent electric, eliminând astfel necesitatea unei baterii onboard pe robot și mărind autonomia robotului.
Un dezavantaj direct al folosirii unui sistem de comunicare cu fir, ar fi faptul că spațiul de lucru al robotului va fi limitat de lungimea maximă admisibilă a cablului.
De asemenea, cablul ar putea interfera cu sistemul de locomoție sau chiar cu senzorii, aceștia putând raporta valori eronate. Din aceste considerente, nu se recomandă folosirea sistemelor de comunicare cu fir decât în cazurile în care folosirea tehnologiilor fără fir ar fi o problemă (spre exemplu pentru vehicule robot din mediul acvatic).
Sistemele de comunicare fără fir se folosesc de o serie de tehnologii de transmitere a datelor prin aer (en. wireless), dintre care amintim: transmisia prin unde în spectrul infraroșu, bluetooth, radio modem-uri, WiFi, și altele.
Mecanismele de transmitere a datelor prin unde infraroșu sunt cele mai puțin robuste, ele neputând fi folosite decât la distanțe relativ mici. De asemenea, ele funcționează doar în linie dreaptă în câmp deschis, orice obstacol aflat între dispozitivele de transmisie-recepție obturând semnalul. Un alt dușman al tehnologiilor de transmitere în infraroșu este lumina solară.
Tehnologiile WiFi sunt deja răspândite în domeniul calculatoarelor personale, și oferă un suport complet de integrare al roboților în rețele de calculatoare. O problemă a acestor tehnologii ar fi faptul că sunt consumatoare de energie, lucru care nu este prielnic robotului mobil.
Eliminând problema energiei consumate, tehnologiile Bluetooth oferă servicii similare cu dispozitivele WiFi, însă distanța maximă admisibilă între emițătorreceptor este mult mai mică decât în cazurile celorlalte tehnologii. În momentul de față, tehnologiile Bluetooth se folosesc în interiorul clădirilor, în laborator, unde distanța maximă fără repetor este de maxim 20m.
1.7. Unități centrale de procesare [14]
Sarcinile pe care un robot mobil trebuie să le îndeplinească pot să fie de la foarte simple la extrem de complexe. Totul depinde de scopul final al robotului mobil construit. În funcție de tipul de sarcini atribuite unui robot mobil, procesarea și descompunerea sarcinilor în acțiuni simple pe care robotul le poate executa necesită prezența unei unități centrale de procesare.
Unitatea centrală de procesare se poate afla fie pe robot (en. onboard), fie la distanță conectată de acesta prin diverse metode (en. offboard). În mod normal, se dorește ca robotul mobil să fie autonom, deci să poată duce la bun sfârșit oarecum independent și sarcini mai complexe, fără intervenția unui program de control din partea utilizatorului, aflat la distanță. În multe cazuri însă, prezența unei unități de procesare pe robot duce la o autonomie scăzută a bateriei acestuia. O altă problemă ar putea fi creșterea în greutate a robotului, în funcție de tipul de unitate centrală de procesare aleasă. De asemenea, în cazul în care necesitățile computaționale sunt mari, s-ar putea ca o unitate centrală de procesare să nu existe astfel încât să se încadreze în limitele fizice și geometrice ale robotului, caz în care aceasta nu poate fi instalată.
Există totuși o serie de avantaje de a avea o unitate de procesare onboard:
Dispar întârzierile asociate comunicației între o unitate de procesare off-board și componentele electronice ale robotului;
În cazul unor probleme de comunicare, robotul poate acționa în continuare autonom;
Unitățile de procesare onboard au acces direct la hardware-ul robotului, în timp ce unitățile offboard trebuie să apeleze la un anumit protocol care să interfațeze între componente și unitate.
Evident, soluția cea mai bună este ca robotul să poate funcționa atât autonom prin intermediul unei unități de procesare onboard, cât și în regim de comunicare cu alte unități de procesare mai performante, care pot asigura necesitățile computaționale pentru sarcini mai complexe.
În practică unitățile de comunicare onboard se aleg astfel încât să aibă suficientă putere de calcul pentru a îndeplini majoritatea sarcinilor simple, cu specificația să nu consume prea multă energie. Unitățile offboard sunt de regulă reprezentate de calculatoare personale.
1.8. Domenii de utilizare
Utilizările pentru care au fost, sunt și vor fi concepuți roboții mobili sunt dintre cele mai diverse și nu pot fi epuizate într-un spațiu atât de restrâns. Mulți roboți din zona micro își găsesc utilizarea în medicină, fiind capabili să se deplaseze de-a lungul vaselor și tuburilor corpului omenesc, în scopul investigațiilor, intervențiilor chirurgicale, dozării și distribuirii de medicamente etc. La fel de spectaculoase sunt și multe utilizări ale macro-roboților:
În domeniul industrial, agricol, forestier: în domeniul industrial roboții mobili sunt reprezentați de AGV-uri (Automated-Guided Vehicles), vehicule pe roți, cu ghidare automată, care transportă și manipulează piese, constituind o alternativă flexibilă la benzile de montaj; în agricultură există tractoare și mașini agricole fără pilot, capabile să execute singure lucrările pe suprafețele pentru care au fost programate; în domeniul forestier roboții mobili pot escalada copacii înalți pentru asanarea lor de crengile uscate etc.;
În domeniul militar: este luată în considerare de către armata americană perspectiva înlocuirii soldaților combatanți cu roboți, pentru a reduce riscul pierderilor umane în luptă; roboți mobili de cele mai ingenioase și robuste configurații sunt aruncați în clădiri și incinte din zone de conflict, în scopuri de investigare și chiar anihilare a inamicului;
În domeniul utilităților publice: inspectarea conductelor de combustibili gazoși și lichizi și a canalelor de canalizare. De exemplu, rețeaua de canalizare a Germaniei însumează 400.000 km, iar inspectarea și curățirea acesteia este presupune costuri de 3¸6 Euro pe metru. Numai 20% din conducte sunt accesibile, iar utilizarea roboților poate reduce costurile cu un sfert. Problemele pe care le au de rezolvat astfel de roboți sunt complexe, într-un mediu parțial necunoscut, modificat permanent prin sedimentare, surpare, coroziune, racorduri ilegale;
În domeniul distractiv și recreativ: sunt roboții-jucării, roboții pentru competiții etc.;
În domeniul serviciilor: Există posibilități deosebit de largi de implementare. Sunt roboți pentru: deservirea bolnavilor în spitale; ajutorarea persoanelor bătrâne sau cu diferite handicapuri; ghidarea și informarea publicului în muzee; aspirarea și curățirea încăperilor; spălarea geamurilor și a pereților clădirilor; executarea de activități casnice.
În domeniul securității: Multe operații de inspectare și dezamorsare a unor obiecte și bagaje suspecte sunt executate de roboți;
În domeniul operațiilor de salvare: Roboții salvatori (Rescue robots) sunt utilizați în operațiile de salvare a victimelor unor calamități: cutremure, incendii, inundații. [4]
1.8.1. Aplicații ale roboților mobili în medii ostile omului
Inspecția în zone contaminate nuclear
În urma unui accident nuclear trebuie inspectată zona accidentului și evaluate daunele.
Datorită faptului că de obicei nu se cunoaște starea nucleului, a radiațiilor sau a posibilelor urmări, se preferă trimiterea unui robot mobil pentru evaluarea daunelor.
Acest tip de robot trebuie să fie proiectat să facă față unei astfel de situații, să fie imun la radiații ridicate, să poată depăși obstacole de diferite forme (obstacole ce rezultă în urma unei explozii), să fie capabil să furnizeze date corecte și în aceste situații personalului de teleoperare.
Figura 1.11. Robot mobil folosit la inspecții în urma dezastrelor nucleare.
2) Detectarea minelor anti-personal
Minele anti-persoană constituie una dintre problemele cu care se confruntă civilizația modernă, iar distrugerea acestor mine este o operațiune costisitoare și periculoasă. Din acest motiv există în prezent mai multe proiecte ce încearcă rezolvarea acestei probleme. Soluțiile alese constau de obicei dintr-un robot mobil (ca unitate de execuție), un algoritm de scanare a suprafeței ce trebuie eliberată de mine, și un element pentru detonarea sau dezamorsarea minelor reperate.[15] Reperarea se face în funcție de tipul minelor folosite, cu diferiți senzori cum ar fi: detector de metale, senzor infraroșu, senzor electro-optic, mulți spectral, dispozitive radar cu diferite lungimi de undă, senzori cu unde acustice, detectarea particulelor cu sarcini, rezonanță, senzori chimici, biologici, câini, etc.
Figura 1.19. Exemplu de robot mobil detector de mine
Intervențiile în cazul amenințărilor cu bombe și a muniției neexplodate
În cazul unei amenințări cu bombe este necesară evacuarea zonei în cauză iar pentru a preveni pierderea de vieți umane și pentru a relua activitățile normale cât mai repede, se folosesc și în aceste cazuri tot mai des roboți mobili. Acești roboți mobili au capacitatea să urce, să coboare scări, să deschidă uși, să ridice obiecte, etc. În majoritatea din cazuri sunt echipați cu un dispozitiv folosit la detonarea intenționată a explozibilului. În acest scop se folosește cel mai des un jet de mare presiune de apă.
În astfel de situații, siguranța în funcționarea robotului mobil depinde în principal de stabilitatea acestuia (pentru evitarea răsturnării sub greutatea proprie sau a sarcinii purtate) și de aderența la terenul pe care se deplasează (pentru evitarea patinării chiar în condițiile unui sol cu caracteristici nefavorabile).[15] Gabaritul redus (atât longitudinal cât și transversal), ca și greutatea proprie redusă, reprezintă condiții extrem de severe impuse roboților mobili. Aceștia trebuie să pătrundă în clădiri și locuri mai puțin accesibile, să se deplaseze pe culoare sau în pasaje proiectate inițial numai pentru accesul operatorului uman. Țările puternic industrializate au în dotarea forțelor armate roboți mobili înzestrați cu echipamente de lucru care permit efectuarea operațiilor de detecție, manipulare și neutralizare a munițiilor neexplodate și a dispozitivelor explozive capcană. Montate la capătul ultimului braț al manipulatorului-robot, aceste echipamente de lucru pot fi: detector de metale sau explozivi la adâncime, dispozitiv de prehensiune tip clește, instalație de control prin radiografiere, disruptoare de diferite categorii. În domeniul protecției civile, roboții mobili sunt folosiți pentru a interveni în locuri aglomerate (aeroporturi, gări, piețe etc.) pentru a detecta și neutraliza unele dis-pozitive explozive capcană, de exemplu colete, genți diplomat (fig. 1.20).
Figura 1.20. Robot mobil folosit la detectarea dispozitivelor capcană
Roboți mobili utilizați în cercetarea spațială
Institutele de cercetare spațială, au cercetat posibilitatea aplicării tehnologiei de teleoperare a unor roboți mobili în cadrul cercetării spațiale încă din anii `60, însă în ultimele patru decenii de dezvoltare s-au modificat drastic, conceptele legate de mărime, sistemele de acționare și domeniul telecomunicației. Unul dintre cei mai cunoscuți roboți mobili teleoperați este Sojourner. Acesta a fost conceput de către JPL (Jet Propulsion Laboratory, laborator NASA) în cadrul proiectului Mars Pathfinder. Probabil unul dintre cei mai mediatizați roboți mobili, Sojourner este un robot cu 6 roți motoare pe un șasiu inovativ introdus de către NASA.
Figura 1.21. Roțile din față al robotului mobil Sojourner [15]
Acest tip de șasiu ales de către NASA a fost special conceput pentru a face față problemelor apărute datorită suprafeței planetei Marte. Aceasta este cunoscută pentru multitudinea de obstacole de diferite dimensiuni întâlnite. Datorită faptului că viteza de deplasare a robotului mobil Sojourner este relativ mică (câțiva centimetri pe secundă) un algoritm de evitare a tuturor obstacolelor s-a dovedit a fi foarte neproductiv.
Una din problemele cela mai mari întâlnite în cazul robotului mobil Sojourner a fost diferența foarte mare de temperatură ambiantă ce poate apare. Noaptea temperatura scade până la -96 de grade Celsius, ziua atingând temperaturi destul de ridicate.[15] Din această cauză a fost necesară crearea unui microclimat în interiorul robotului pentru a proteja electronica, de fluctuațiile de temperatură și pentru a o menține funcțională. Robotul mobil a fost echipat și cu un element de acționare numit IDD (Instrument Deplyment Device). Acesta este un braț robotizat, ce permite utilizarea echipamentelor de cercetare din dotare, cum ar fi: un ansamblu pentru preluare de imagini (format dintr-un microscop și o cameră de înaltă rezoluție), un spectrometru Mossbauer, un spectrometru cu raze X și un dispozitiv pentru preluarea de mostre de rocă.
Figura 1.22. Robot mobil Sojourner
1.8.2. Aplicații în zone inaccesibile omului
Roboții mobili se folosesc nu doar în zonele periculoase, ci și în zone inaccesibile sau greu accesibile omului. Acestea pot fi: inspectarea țevilor, conductelor, operații subacvatice la mare adâncime, monitorizarea siguranței scufundătorilor, operații de salvare subacvatice, pază de coastă, operațiuni de recunoaștere militară, evacuări medicale, suport logistic, inspecții de epave, etc.
Sistemele de inspecție a conductelor sunt formate uzual din mai multe părți: robotul mobil ce oferă platforma locomotorie, o cameră video uzual montată pe un dispozitiv ce permite rotirea și înclinarea acesteia și unelte necesare efectuarea altor teste sau reparații.
Dintre testele ce pot fi efectuate amintim cele de natură nedistructivă, cum ar fi probe cu lichide penetrante, scanări ultrasonice, cu raze x. Acestea se efectuează periodic pentru a verifica parametrii conductei în cauză. Sistemele folosite în practică sunt de obicei izolate etanș astfel încât este posibilă operarea lor și în conducte cu lichid, atâta timp cât lichidul permite efectuarea testelor propuse.
Figura 1.23. Exemplu de robot mobil utilizat la inspecția conductelor [15]
Inspecția zonelor greu accesibile se face cu ajutorul unor roboți mobili de dimensiuni foarte reduse. Aceste dimensiuni reduse au însă un impact asupra calității teleprezenței. În special calitatea imaginilor video teletransmise este scăzută datorită distanței la sol foarte mici.[15] Pentru a depăși acest inconvenient au fost concepuți roboți mobili ce își modifică forma în timpul operării. Printre aplicațiile cele mai importante pentru acest tip de roboți mobili se regăsesc următoarele: descoperirea de victime în cazul cutremurelor sau a unor explozii, inspecția clădirilor (în special inspecția fundațiilor), etc.
Figura 1.24. Robot mobil utilizat pt. inspectarea zonelor greu accesibile, cu
modificarea formei [15]
Din categoria roboților care sunt utilizați în zonele greu accesibile sau chiar inaccesibile omului, mai fac parte roboții subacvatici și roboții militari.
Capitolul 2. Prezentarea robotului mobil
2.1. Structura robotului
În introducerea lucrării de față s-a menționat scopul acesteia, și anume comanda unui robot mobil prin intermediul interfeței bluetooth. Este vorba de robotul mobil din fig.2.1. Acest robot mobil se deplasează pe sol, cu ajutorul sistemului de locomoție pe roți, având capacitatea de a primi comenzi, de la un smartphone sau de la un calculator personal echipat cu un adaptor bluetooth, și să efectueze mișcări de deplasare pe direcțile de mers înainte, înapoi, viraje stanga, dreapt, aprindere/stingere far, semnal sonor și oprire în cazul localizarii unui obstacol în raza sa de acțiune.
Robotul este alcătuit din șasiul unei masinute teleghidate (fig.2.4.), o placă de bază, o platformă de dezvoltare open-source, numită Arduino Uno V3 (fig.3.1.), un modul bluetooth RN-42 (fig.2.8), un minidifuzor, un senzor pentru detecția obstacolelor (fig.2.9.) și partea de acționare a masinuței teleghidate care deserveste pe post de driver care comandă cele două motoare de curent continuu incluse în șasiul robotului.
Figura 2.1. Robotul mobil
Conform figurii 2.1 placa de bază este montată pe șasiul robotului, fixată cu șuruburi în cele patru colțuri ale acesteia. Pe placa de bază este montată platforma de dezvoltare Arduino Uno V3, aceasta fiind cuplată la rândul ei la partea de acționare a masinuței teleghidate care controlează cele două motoare de curent continuu. Tot în figura 2.1 pe placa de baza se mai pot observa modulul Bluetooth și minidifuzorul, precum și farurile și senzorul pentru detecția obstacolelor, montate pe șasiul robotului cu ajutorul pistolului de lipit și a unor suruburi.
2.2. Schema electrica a robotului mobil
Figura 2.2. Schema electrica a robotului mobil
Realizarea conexiunilor:
Arduino Pin 11 – Borna A a puntii H1 ( pentru comanda înainte)
Arduino Pin 10 – Borna B a puntii H1 ( pentru comanda înapoi)
Arduino Pin 9 – Borna A a puntii H2 ( pentru comanda viraj dreapta)
Arduino Pin 8 – Borna B a puntii H2 ( pentru comanda viraj stânga)
Arduino Pin 7 – Becuri
Arduino Pin 6 – Alarma
Arduino Pin 2 – Senzor de distanta
Arduino Pin 1 TX – Pin RX al molulului bluetooth
Arduino Pin 0 RX – Pin TX al molulului bluetooth
Arduino Pin 5V – Pin 5V al molulului blue tooth
Arduino Pin GND – masa puntilor H1 și H2 ( GND)
Partea de comandă și control a sistemului electric este reprezentat prin placa de dezvoltare Arduino UNO care este creierul robotului mobil.
Arduino UNO furnizează comanda de deplasare înainte prin intermediul pinului 11 acest pin este legat la borna de intrarea A a punții H1 printr-un conductor electric izolat. Pentru deplasare în sens invers, semnalul de comandă este furnizat de către pinul digital 10 care este legat printr-un conductor electric la borna B a punții H1. Cele două semnale de comandă sunt semnale PWM. Variația factorului de umplere ale semnalelor PWM asigură deplasarea cu viteză variabilă înainte și înapoi a robotului.
Virajul spre dreapta se realizează prin intermediul pinului digital 9 care este legat la borna A a punți H2 iar virajul spre stânga se realizează prin intermediul pinului digital 8 care este legat la borna B a punți H2.
2.3. Șasiul robotului mobil
Pe post de șasiul al robotului mobil am ales să folosesc o mașinuță teleghitată. Am recurs la acest montaj pentru a profita de partea mecanică destul de performantă a mașinuței, dificilă de realizat în lipsa unui atelier mecanic și a diferitelor piese pentru a realiza cutia de viteze/sasiu.
Figura 2.3. Masinuța teleghidată
După cum se vede în figura 2.3. mașina are un sistem de locomoție cu roți iar comanda lor se realizează cu ajutorul a două motoare de curent continu, unul pentru deplasare înainte- înapoi, cu ajutorul roților din spate și celalalt motor are rolul de a modifica orientarea roțiilor din față pentru virajul la stânga și la dreapta.
Figura 2.4. Șasiul masinuței teleghidate
Masinuța a fost prevăzută din fabricație cu o placă de bază care conține următoarele blocuri funcționale: etajele de radiofrecvență, etajul de comanda a driverului motoarelor de curent continu și driverele celor două motoare de curent continuu.
Comenzile de la distanță au fost efectuate pe calea undelor radio. În lucrarea mea am propus să schimb această cale de comunicație prin unde radio cu comunicația prin Bluetooth.
Pentru a realiza acest lucru, de pe placa de baza am păstrat doar partea de acționare a motoarelor de curent continuu, realizate cu tranzistoare bipolare și alte componente electronice discrete, pentru nu a fi nevoit să achizitionez un driver de motoare astfel am scurtat timpul de realizare al robotului mobil și am evitat proiectarea altor montaje proprii, expuse inerentelor probleme de execuție.
Figura 2.5. Schema placi de baza a masinuței teleghidate
2.4. Farurile
Robotul mobil prezentat în această lucrare conține două becuri conecate în serie care reprezintă farurile. Aceste faruri au fost conectate și funcționează conform procedurii led brick pe care o voi descrie în cele ce urmesază:
Un led brick reprezintă cea mai simpla posibilitate de a genera un semnal luminos folosind Arduino. Un led brick necesită un port digital liber pentru a fi controlat de catre Arduino.
Figura 2.6. Exemplu de conectare a unui LED
Realizarea conexiunilor:
Arduino GND – GND Led
Arduino Digital 7 – IN Led
Exemplul:
void setup() {
pinMode(7, OUTPUT); // pinul 7 este configurat ca ieșire
}
void loop() {
digitalWrite(7, HIGH); // se programează nivelul logic 1 la pimul 7
delay(1000); // temporizare de o secundă
digitalWrite(7, LOW); // se programează nivelul logic 0 la pimul 7
delay(1000); // temporizare de o secundă
}
Rutina setup, care se executăexact o singură dată când Arduino este alimentat, declară pinul digital 7 (cel la care am conectat led-ul) ca fiind un pin de ieșire (în sensul că va controla un dispozitiv extern conectat la Arduino, și nu va citi o informație digitală din mediu).
Rutina loop, care se execută atâta timp cât Arduino este alimentat, aprinde led-ul ridicand pinul 7 în HIGH (mai exact, face ca tensiunea pinului să fie 5 V), apoi așteaptă o secundă, stinge led-ul (tensiunea pinului devine 0 V) și apoi iarși așteaptă o secundă. [16]
2.5. Minidifuzorul
Minidifuzorul este cea mai simpla modalitate de a crea sunete cu Arduino. Utilizarea acestuia este extrem de simplă. Conectezi firul negru la pinul GND al placii Arduino, iar firul roșu la un pin PWM digital al placii Arduino. Placa Arduino UNO are 6 astfel de pini (3, 5, 6, 9, 10 și 11), iar placa Arduino Mega are 15 astfel de pini (de la pinul 2 pană la pinul 13 și de la pinul 44 la pinul 46). Un semnal de tip PWM este un semnal care se mișcă foarte rapid între 5V și 0V, astfel încat membrana difuzorului este și ea mișcată la fel de rapid, generând sunete. Frecvența cu care semnalul se misca între 5V și 0V determină frecvența sunetului.
Figura 2.7. Exemplu de conexiune a unui minidifuzor
Realizarea conexiunilor:
Arduino GND – Fir Negru Difuzor
Arduino Digital 6 – Fir Rosu Difuzor
Exemplu program:
void setup() {
pinMode(6, OUTPUT); // pinul 6 este configurat ca ieșire
}
void loop() {
for (int i = 1500; i < 4000; i++) { // incrementează i de la 1500 la 4000
tone(6, i); // trimite sub formă de frecventă a valori i pinului 6
delay(10); // temporizare 10 ms
}
for (int i = 4000; i > 1500; i–) { { // decrementează i de la 4000 la 1500
tone(6, i); // trimite sub formă de frecventă a valori i pinului 6
delay(10); // temporizare 10 ms
}
}
Partea interesantă din codul de mai sus este instructiunea tone, care primește ca parametri pinul la care este conectat difuzorul (în cazul nostru pinul 6) și frecvența sunetului (în cazul nostru, variabila i). Variabila i se modifică între 1500 de Hertzi și 4000 de Hertzi. Efectul obținut este cel de sirena. Ca să opresti sunetul complet, instrucțiunea este noTone(<pin>); în cazul de mai sus, noTone(6) opreste complet sunetul. [16]
2.6. Modulul Bluetooth
Figura 2.8. Modul Bluetooth
Specificații:
– modem Bluetooth clasa 2
– atinge 10 metri ca distantă de transmisie
– consumă în medie 25 mA
– conexiune criptată
– frecvență 2.4~2.524 GHz
– tensiune de alimentare 3.3 – 6 V
– capabil de rate de transfer între 2400-115200 bps (configurată la 9600 bps)
– temperatura de operare – 40 ~ + 70 C
– antena inclusă pe placă
Modemul dispune de un modul de clasa 2RN-42, simplu de utilizat și cu documentație excelentă. [17]
Conectorul Bluetooth are nevoie de patru fire, două pentru alimentare și două pentru transmisia de date. Cele două fire de alimentare se conectează în placa Arduino în pinii VCC, respectiv GND, iar cele două fire de date se conecteaza în pinii RX și TX (încrucisat, adică pinul RX din conectorul bluetooth la pinul TX din placa Arduino). Modemul are regulatoare de tensiune pe placa, astfel încat poate fi alimentat între 5-6 V.
Exemplu de cod:
char val; //initializează variabila unde sunt salvate valorile receptionate prin portul serial
int ledpin = 13; // initializează LED-ul 13 (on-board LED)
void setup() {
pinMode(ledpin, OUTPUT); // setează pinul 13 ca pin de ieșire
Serial.begin(9600); // porneste conexiunea serial la 9600bps
}
void loop() {
if( Serial.available() ) // dacă există date care se pot citi
{
val = Serial.read(); // citeste datele și le stocheaza în “val”
}
if( val == 'H' ) // dacă se recepționează semnalul ,H,
{
digitalWrite(ledpin, HIGH); // aprinde LED-ul
} else {
digitalWrite(ledpin, LOW); // dacă nu, stinge LED-ul
}
delay(100); // asteaptă 100 ms până la urmatoarea citire
}
2.7. Senzor de distanță digital
Figura 2.9. Senzor de distanță digital Sharp GP2Y0D810Z0F [9]
Specificații:
– distanța maximă de detecție: 10 cm;
– distanța minimă de detecție: 2 cm;
– frecvența: 390 Hz;
– tensiune de funcționare: 2,7 – 6,2 V;
– consumul mediu de curent: 5 mA (tipic);
– ieșire de tip digitală;
– timp de răspuns: 2,56 ms tipic ( 3,77 ms max);
– dimensiune modul: 21,6 x 8,9 x 10,4 mm [19]
Așa cum s-a menționat în rândurile de mai sus, senzorul GP2Y0D810Z0F are capacitatea să detecteze obiecte începând de la distanța de 2 cm pâna la cel mult 10 cm, fiind unul dintre cei mai mici și rapizi senzori realizați de producătorul Sharp. Plăcuța Pololu (fig.2.10.) atașată de senzor, conține toate elementele necesare pentru buna funcționarea a senzorului.
Timpul rapid de răspuns, consumul scăzut de curent, dimensiunea mică și integrarea ușoară într-un sistem, califică acest senzor să fie ales pentru detecția obstacolelor. Există câțiva milimetri de histerezis în jurul pragului maxim dar nu și în jurul pragului minim, senzorul având capacitatea să detecteze obiectul din raza sa de acțiune, însă nefiind în stare să precizeze distanța la care se află acesta.
Figura 2.10. Dimensiunile plăcuței Pololu,
necesară funcționării senzorului GP2Y0D810Z0F [19]
Se pot observa în figura 2.10., în partea de jos a plăcuței Pololu trei pad-uri: GND având forma pătrată, VIN, alimentarea (2.7-6.2 V) cel din mijloc și OUT, fiind ieșirea. Dacă sistemul de alimentare al robotului permite, atunci se poate conecta un condensator de capacitate mare (> 10 uF), la masa și alimentarea plăcuței, astfel crescând performanțele senzorului. Pe spatele plăcuței se află un led roșu care se aprinde intermitent atunci când la OUT avem nivel logic de tensiune 0 și nu nivel logic 1 (cum e în stare normală), indicând faptul că senzorul a detectat un obstacol. Semnalul este transmis driver-ului care va comanda împreună cu platforma Arduino, motoarele localizate în șasiu astfel încât robotul să se oprească din deplasarea sa și să evite obstacolul.
Senzorul GP2Y0D810Z0F mai are și o intrare pentru activarea opțională a consumului redus de curent, notată cu ”enable” (a activa) pe partea din spate a plăcuței Pololu, fiind conectată la Vcc, consumul redus de curent putând fi dezactivat, prin întreruperea conexiunii dintre acestea.
Capitolul 3. Platforma de dezvoltare Arduino Uno
3.1. Descriere generală a platformei Arduino Uno V3
Una dintre componentele importante ale robotului mobil este platforma de dezvoltare open-source, Arduino Uno V3, bazată pe software și hardware flexibil, ușor de folosit, fiind destinat persoanelor interesate în crearea obiectelor sau a unor medii interactive. Arduino Uno constă într-o platformă de dimensiuni mici (6.8 cm / 5.3 cm), fiind construită în jurul unui procesor de semnal și este capabilă să preia date din mediul înconjurător printr-o serie de senzori, și să efectueze anumite acțiuni asupra mediului cu ajutorul motoarelor, servomotoarelor, luminilor și a altor tipuri de dispozitive mecanice. Mediul de programare în care rulează procesorul, cod scris, este foarte asemănător cu limbajul C++. [20]
Figura 3.1. Platforma de dezvoltare Arduino Uno V3 [20]
Specificații:
– microcontroler Atmega328;
– tensiune de lucru 5V;
– tensiune de intrare (recomandat) 7-12V;
– tensiune de intrare (limită) 6-20V;
– pini digitali: 14 (6 PWM output);
– pini analogici: 6;
– intensitate per pin de intrare/ieșire: 40mA;
– intensitate de ieșire pentru pinul 3.3V: 50mA;
– Flash Memory: 32KB (Atmega328) din care 0.5 KB utilizează bootloader-ul;
– SRAM: 2KB (Atmega328);
– EEPROM: 1KB (Atmega328);
– frecvența: 16MHz. [20]
Platforma Arduino poate fi utilizată pentru a dezvolta obiecte interactive, interceptând semnale de intrare de la o varietate de switch-uri sau senzori apoi controlând diverse led-uri, motoare și alte ieșiri fizice.[21] Proiectele Arduino pot fi de sine-stătătoare, sau pot comunica cu software-ul care se execută pe calculatorul utilizat (de exemplu Flash, Processing, MaxMSP), iar plăcile Arduino pot fi realizate manual sau achiziționate preasamblate, mediul de programare putând fi descărcat gratuit de pe Internet. Limbajul de programare Arduino este o implementare de cablaj, deasemenea o platformă de calcul fizic, care se bazează pe mediul de programare de procesare multimedia. Există multe alte microprocesoare și microcontrolere disponibile pentru platforme de calcul fizic: Parallax Basic Stamp, Netmedia BX-24, Phidgets, HandyBoardMit, și multe altele oferă o funcționalitate similară. Toate aceste instrumente iau detaliile dezordonate de programare și le încadrează într-un pachet ușor de utilizat.
3.2. Prezentare hardware a platformei Arduino Uno
Platforma Arduino este un sistem rezultat prin interconectarea a mai multor componente simple, elementul de bază al plăcii fiind microcontrolerul Atmega328, a cărui funcționare se realizează cu ajutorul celorlalte componente existente. Microcontrolerul Atmega328 este programat cu ajutorul limbajului de programare Arduino (bazat pe cablaj) și a mediului de dezvoltare Arduino (bazat pe procesare). Plăcuța Arduino prezintă 14 intrări/ieșiri digitale (dintre care 6 pot fi utilizate ca ieșiri PWM), 6 intrări analogice (fig.3.2.), un oscilator cu cristal de 16 MHz, circuit de interfațare cu USB, alimentare jack, un conector ICSP și un buton de resetare. [22]
Uno este cel mai nou model la ora actuală dintre versiunile Arduino cu USB, cuvântul ”uno” înseamnând ”unu” în limba italiană, fapt ce denotă numele acestui prototip, marcând și următoarele versiuni ale Arduino 1.0. Arduino Uno diferă de predecesorii săi datorită faptului că nu utilizează driver-ul FTDI USB-serial, dar dispune de circuitul Atmega16U2, programat ca un convertor USB-serial.
Figura 3.2. Partea superioară a Figura 3.3. Partea inferioară a
plăcii Arduino [22] a plăcii Arduino [22]
Ca și îmbunătățiri ale plăcii se pot aminti:
– rezistorul care leagă linia 8U2 HWB de masă, fapt ce ușurează punerea în modul DFU (Device Firmware Update), acest modul fiind un protocol cu ajutorul căruia se face update-ul programului instalat în memoria microcontrolerului;
– s-au adăugat pinii SDA și SCL situați lângă pinul AREF, și alți doi pini noi localizați lângă pinul RESET, unul fiind denumit IOREF care permite circuitelor atașate plăcuței Arduino (în cazul de față driver-ului de motoare) să se adapteze la tensiunea furnizată de aceasta; al doilea pin neconectat este rezervat pentru alte scopuri ce pot apărea pe parcursul utilizării plăcii;
– deține un circuit de resetare mai puternic. [22]
3.2.1. Alimentarea platformei Arduino
Alimentarea plăcii Arduino se poate realiza prin mai multe moduri: conexiune USB, printr-o sursă de alimentare externă sau cu baterii. În primul caz este necesar un cablu USB A-B (de obicei au lungimea de 2 sau 5 metri, fig.3.4.) care se conectează la portul USB al calculatorului. În cazul în care se alimentează de la o sursă de alimentare externă (tensiune de la priză) e nevoie de un adaptor AC-DC a cărui ieșire se conectează la mufa jack a plăcii, iar când avem de a face cu alimentare prin intermediul bateriilor firele care vin de la acestea se conectează la pinii GND și VIN ai conectorului de alimentare de pe driver-ul de motoare.
Figura 3.4. Cablu USB de tip A-B folosit Figura 3.5. Alimentator extern AC-DC
pentru alimentarea platformei Arduino pentru alimentarea platformei Arduino
Deși placa poate suportăvalori de tensiuni cuprinse între 6 și 20 de volți pentru buna funcționare a plăcii se recomandă o tensiune între 7 și 12 volți. Dacă placa se alimentează cu mai puțin de 7 volți pinul 5V s-ar putea să furnizeze o tensiune mai mică de 5 volți caz în care placa are șanse mari să devină instabilă, iar dacă se alimentează cu mai mult de 12 volți, regulatorul de tensiune se poate supraîncălzi deteriorând placa.
În rândul pinilor de alimentare se menționează următorii: VIN, 3V3, 5V, și pinul GND (masa). Pinul 3V3 are o tensiune de 3,3V generată de regulatorul de tensiune de pe placă, având o intensitate maximă de 50 mA. Când alimentarea se face printr-o sursă de alimentare externă (diferită de cea de 5V prin conexiunea USB sau alte surse de tensiune reglate) prin pinul VIN placa Arduino este aprovizionată cu tensiune de intrare sau dacă alimentarea se face prin mufa jack acest pin permite accesul tensiunii în placă.
Pinul 5V furnizează plăcii o tensiune de ieșire reglată la 5 volți, în urma alimentării fie prin adaptorul AC-DC la mufa jack (7-12 V), fie prin pinul VIN (tot 7-12V) sau prin conexiune USB (5V). Furnizarea tensiunii prin pinii 5V și 3V3 nu este recomandată deoarece astfel tensiunea nu trece prin regulator și placa are șanse mari să se defecteze.
Figura 3.6. Schema electrică a platformei Arduino Uno V3 [23]
În figura 3.6. este prezentată schema electrică a platformei Arduino Uno V3, în care se regăsesc componentele principale: microcontroler-ul Atmega328 care comunică cu conectorul USB prin intermediul circuitului de interfațare Atmega16U2-MU, conectorul pentru mufa jack, circuitul stabilizator de tensiune U1 la 5V și circuitul stabilizator de tensiune U2 la 3,3V.
Placa este dotată cu o siguranță resetabilă care protejează portul USB al calculatorului în cazul apariției unui scurtcircuit sau supracurent. Chiar dacă cele mai multe calculatoare sunt asigurate cu protecție internă proprie, siguranța resetabilă este benefică pentru că oferă o doză suplimentară de protecție. În cazul în care la portul USB este aplicată o intensitate mai mare de 500mA, siguranța va întrerupe în mod automat conexiunea pâna când scurcircuitul sau supracurentul este eliminat. Arduino Uno face parte din familia largită Arduino, majoritatea plăcilor (Uno, Leonardo, Mega2560, ș.a.) fiind fabricate de SmartProjects în Italia, iar modelele Pro, Pro Mini și LyliPad de compania americană SparkFun Electronics.
3.2.2. Descrierea pinilor
Cu ajutorul funcțiilor pinMode(), digitalWrite() și digitalRead(), fiecare pin ale celor 14 intrări/ieșiri digitale poate fi utilizat ca intrare sau ieșire, funcționând la o tensiune de 5V. Fiecare pin poate furniza sau recepționa un maxim de 40 mA având o rezistență internă de 20-50 kOhmi.
Unii pini au funcții specializate cum ar fi:
serial: 0 (Rx) și 1 (Tx) acești pini sunt utilizați pentru a recepționa (Rx) și transmite (Tx) date seriale TTL, fiind conectați la pinii corespunzători ai Atmega USB-TTL.
external interrupts: acestei funcții corespund pinii 2 și 3 care pot fi configurați să declanșeze întreruperea unei execuții când are loc trecerea dintr-un nivel logic de tensiune în altul. [22]
funcția PWM (modulația în lățime a impulsului) este atribuită pinilor 3, 5, 6, 9, 10 și 11 și generează 8 biți de ieșire PWM cu împreună cu funcția analogWrite(). Se utilizează în general la modificarea intensității de luminozitate a unui led sau modificarea valorii vitezei unui motor.
-SPI (interfață serială periferică) este funcția pinilor 10 (SS), 11 (MOSI), 12 (MISO), 13 (SCK); acești pini suportă comunicare SPI folosind biblioteca Serial Peripheral Interface; SPI este un protocol utilizat de microcontroler în comunicarea cu un alt dispozitiv periferic sau cu un alt microcontroler; într-o conexiune de tip SPI întotdeauna există un dispozitiv master (de obicei un microcontroler) care controlează celelalte dispozitive periferice.
prin intermediul pinului 13 se controlează un led integrat pe placa Arduino; când pinul recepționează un semnal de nivel logic 1 atunci led-ul se aprinde, iar când trece în nivel logic 0 led-ul se stinge.
Arduino Uno mai are și 6 intrări analogice corespunzătoare pinilor A0, A1, A2, A3, A4, A5, fiecare dintre ele asigurând o rezoluție de 10 biți. Prin setările prestabilite, pinilor le corespund valori ale tensiunii începând de la masa până la 5V, dar se poate inversa valorile tensiunii folosind pinul AREF și funcția analogReference(). La fel ca și la pinii digitali, unii pini analogici au funcții speciale, cum ar fi funcția de comunicare TWI care o au pinii A4 (SDA) și A5 (SCL). Dintr-o altă grupă de pini fac parte AREF și RESET.
Pinul AREF configurează tensiunea de referință utilizată pentru intrările analogice prin intermediul funcției analogReference(), iar pinul RESET este folosit de obicei pentru butonul de resetare, care poate reseta microcontrolerul dacă este necesar. [22]
Platforma Arduino prezintă o serie de facilități pentru comunicarea cu un calculator, cu o altă placă sau alte microcontrolere. Microcontroler-ul Atmega328 oferă comunicare serială UART TTL (5V), care este disponibilă pe pinii digitali 0 (RX) și 1. UART (Universal Asynchronous Receiver/Transmitter) este o componentă a plăcii Arduino fiind un emițător/receptor asincron care decodifică date de tip paralel sau serie, utilizat de obicei pentru comunicarea serială cu un calculator sau portul serial al unui dispozitiv periferic. Există librării software ce permit comunicarea serială pe oricare dintre pinii digitali ai platformei.
3.2.3. Semnale PWM
În subcapitolul anterior s-au menționat câteva cuvinte despre funcția PWM la descrierea pinilor, și anume că numele acestei funcții vine din limba engleză de la „pulse width modulation” cea ce înseamnă modularea în lățime a unui impuls de comandă. Putem spune că un astfel de semnal PWM constă în codarea informației în lățimea impulsului obținut.
Aceste semnale pot fi utilizate în mai multe scopuri dar deobicei (și în cazul de față) se folosesc pentru a controla viteza motoarelor de curent continuu sau intesitatea luminozității unui led. Motoarele permit controlul vitezei prin modificarea tensiunii de alimentare, dar în această manieră viteza se modifică neliniar, fapt datorită căruia se recurge metoda de control liniar al vitezei prin semnale PWM. Acestea sunt semnale de comandă a unor tranzistoare de putere utilizate în cadrul unor convertoare în comutație.
Elementele de bază ale unui modulator PWM sunt următoarele: comparator, generator de semnale dinte de ferăstrău și amplificatorul de eroare. Amplificatorul de eroare compară tensiunea de referință și semnalul de reacție. De obicei semnalul de reacție este obținut printr-o divizare a tensiunii de ieșire. Modulatorul PWM are rolul de a comanda fiind o parte importantă și complexă a unui regulator de tensiune în comutație.
Figura 3.7. Circuit pentru realizarea semnalului PWM
Fiecare procent al unui astfel de semnal reprezintă o valoare importantă în aplicația pe care o dorim cu un astfel de semnal spre deosebire de semnalul TTL care poate stări: high și low. Semnalele PWM au următorul principiu fundamental: dacă factorul de umplere al unui semnal PWM crește atunci tensiunea și puterea furnizată de PWM cresc în mod liniar.
Figura 3.8. Modularea PWM a semnalului dinte de ferăstrău
Semnalul PWM din figura 3.8. se obține prin intermediul circuitului din figura 3.7. care funcționează în felul următor: se compară valoarea semnalului dinte de ferăstrău cu tensiunea de la ieșirea amplificatorului de eroare, și dacă valoarea semnalului dinte de ferăstrău este mai mică decât valoare tensiunii de la ieșirea amplificatorului de eroare, atunci la ieșirea comparatorului se va obține 1 logic ( Ton ).
Când valoarea semnalului dinte de ferăstrău este mai mare decât valoarea tensiunii de la ieșirea amplificatorului atunci la ieșirea comparatorului va fi valoarea 0 logic ( Toff ). Când valoarea tensiunii de ieșire crește, atunci valoarea tensiunii de reacție va crește peste valoarea tensiunii de referință, astfel tensiunea de ieșire a amplificatorului de eroare se va micșora rezultând astfel o durată mai mică, pentru care la ieșirea comparatorului se va obține valoarea 1 logic. În cazul în care tensiunea de ieșire scade, durata este mai mare de 1 logic la ieșirea comparatorului. Modificarea lățimii impulsurilor se datorează factorului de umplere (duty cicle), iar când tensiunea este constantă, aceasta este menținută prin reacția negativă la valoarea dorită.
Modularea impulsurilor lățime este o tehnică cu, care se pot obține rezultate analogice prin mijloace digitale. Controlul digital este folosit pentru a crea unde de forme dreptunghiulare, semnal ce este comutat între on și off.
Această comutare on-off poate modela tensiuni între full on (5 volți) și off (0 volți) prin schimbarea intervalului de timp în care semnalul este în modul on cu intervalul de timp în care acesta este în modul off. Durata cât semnalul este în modul „on” se numește pulse width (lățimea impulsului), iar pentru obținerea unor valori analogice diferite, trebuie schimbat sau modulat lățimea impulsului.
În mediul de dezvoltare Arduino valorile mărimilor sunt cuprinse în intervalul 0-255, astfel pentru executarea instrucțiunii analogWrite(255) este nevoie de un factor de umplere de 100%.
Factorul de umplere (duty cicle) al unui semnal PWM se calculează cu ajutorul următoarei relații:
fu – factor de umplere
– reprezintă durata impulsului;
T- reprezintă durata totală semnalului.
3.3. Programarea platformei
Platforma poate fi programată utilizând un software Arduino, destinat special pentru această placă și pentru celelalte modele de plăci din familia arduino. Pentru ca mediul de programare să fie compatibil cu modelul de placă conectat la calculator (în cazul de față Arduino Uno), din meniul Tools (instrucțiuni) se accesează Board, pe urmă Arduino Uno.
Microcontrolerul Atmega328 care comunică utilizând un protocol original STK500, are prestabilit prin fabricație în memoria sa un bootloader (încarcă un program la pornire), fapt ce permite încărcarea unor secvențe noi de program, fără să fie nevoie de un programator hardware extern. Se poate ignora bootloader-ul programând microcontrolerul printr-un protocol numit ICSP (In-Circuit Serial Programming), în cazul programării cu un programator extern, caz în care se poate utiliza spațiul întreg pentru programare de pe memoria microcontroler-ului.
Codul sursă al circuitului de interfațare cu USB-ul, ATmega16U2 (sau 8U2 ale modelelor precedente de plăci) rev1 și rev2 este valabil și se încarcă prin modul DFU, care poate fi activat în felul următor: conectând un jumper pe spatele plăcii (unde este inscripționată harta Italiei) și resetând circuitul de interfațare 8U2, aceasta în cazul plăcilor rev1, iar în cazul plăcilor mai noi rev2 printr-o rezistență care leagă magistrala 8U2/16U2 HWB, favorizând punerea în modul DFU (Device Firmware Update).
Deasemenea se poate utiliza un soft Atmel’s Flip software (pentru Windows) sau programarea cu modul DFU (pentru sistemul de operare Linux) pentru a încărca un program rezident nou, sau o altă variantă fiind folosirea protocolului ISP printr-un programator extern (transcriind programul de încărcare DFU).
Arduino Uno este proiectat în așa manieră încât acesta să se poată reseta înainte de o încărcare a unui program nou, mai degrabă prin software-ul care rulează pe calculatorul la care este conectat decât prin apăsarea fizică a butonului de resetare. Unul dintre firele de conexiune hardware (DTR) ale circuitului de interfațare cu USB-ul ATmega16U2 este conectată la linia de resetare a microcontrolerului ATmega328, printr-un condensator cu o capacitate de 100 de nanofarazi. Când acest fir de conexiune are nivel de tensiune low, pe linia de resetare tensiunea scade destul de mult, astfel să poată reseta microcontrolerul. [22]
Programul Arduino utilizează această aptitudine pentru a permite încărcarea unui program prin simpla accesare a iconiței upload din meniul mediului de dezvoltare Arduino. Când Arduino este conectat la un PC care operează în Linux, aceasta se resetează de fiecare dată când se face o conexiune prin USB la software-ul instalat pe calculatorul respectiv, iar în următoarea secundă bootloader-ul rulează pe placă. În timp ce este programat să ignore date străine (adică nimic altceva înafară de un cod scris nou), va intercepta primii biți trimiși la placă după începerea unei conexiuni.
Este necesară asigurarea că software-ul cu care comunică placa, așteaptă o secundă după ce a început conexiunea, dar încă nu a transmis date, în cazul în care se rulează o aplicație pentru prima dată și necesită un timp de configurare sau alte tipuri de date.
Arduino deține o magistrală care poate fi întreruptă (tăiată) pentru a dezactiva opțiunea de auto-resetare, dar poate fi reconectată (prin lipire) pentru a reactiva această opțiune, operația numindu-se „RESET-EN”. Deasemenea mai există o metodă de dezactivare a opțiunii auto-reset, și anume prin conectarea unei rezistențe de 110 ohmi la 5V și la linia de resetare.
3.4. Microcontrolere
3.4.1. Noțiuni generale privind microcontrolerele
Înainte de apariția microcontrolerelor existau controlere care erau sisteme utilizate pentru a comanda și prelua stări de la un proces sau elemente de execuție. Acestea erau echipamente de dimensiuni mari, însă odată cu apariția microprocesoarelor au urmat și îmbunătățiri ale controlerelor prin reducerea dimensiunilor acestora. Toate componentele necesare unui controler au fost integrate pe acelaș chip, astfel continuând procesul de miniaturizare luând naștere calculatorul integrat pe un singur chip, adică microcontrolerul, fiind specializat în implementarea operațiilor de control.
Numele acestui dispozitiv evidențiază caracterul său și anume cuvântul „micro” arată că este vorba despre o mărime redusă a dispozitivului, iar cuvântul „controler” indică faptul că microcontrolerul este capabil să controleze obiecte, procese, etc.
Un microcontroler este asemănător unui microprocesor, ambele conținând CPU (Unitatea Centrală de Prelucrare) care execută instrucțiuni ce îndeplinesc operațiile de bază logice, matematice și de transmitere a informației. Totuși microcontrolerul diferă de microprocesor prin mai multe aspecte, cel mai mare aspect de diferențiere fiind legat de funcționalitatea acestuia. Microprocesorul nu poate funcționa de unul singur, doar împreună cu alte componente de memorie pentru stocarea informațiilor și a programelor, împreună cu interfețe de intrare-ieșire (I/O) utile pentru conectarea dispozitivelor externe. În schimb un microcontroler este proiectat să fie toate aceste componente într-unul singur, neavând nevoie de alte dispozitive externe pentru că toate perifericele sunt incluse în el, acest fapt fiind un avantaj datorită economisirii timpului și spațiului necesar pentru construirea aparatelor electronice. Datorită acestui fapt, aparatele care stochează, măsoară, comandă, afișează sau calculează date, informații majoritatea au în componența lor un microcontroler.
În general un microcontroler conține de obicei următoarele:
CPU (unitatea centrală de prelucrare);
interfețe de intrare-ieșire (I/O), seriale și paralele;
generator de tact la care se adaugă din exterior un cristal de cuarț sau un circuit RC în aplicații mai simple;
memorie RAM;
memorie ROM/PROM/EPROM/EEPROM (depinde de model);
controler de întreruperi, controler DMA;
numărătoare/temporizatoare, convertoare A/D, D/A.
ș.a
Figura 3.9. Schema bloc generală al unui microcontroler [24]
Se poate observa în figura 3.9. că blocurile funcționale ale unui microcontroler sunt conectate între ele printr-o magistrală internă numită „BUS” care transmite semnale de control, de adresă și de date. Una dintre cele mai importante caracteristici ale unui microcontroler este mărimea acestor magistrale. Unitatea centrală de prelucrare selectează o locație de memorie sau un dispozitiv prin intermediul magistralei de adrese, iar prin magistrala de date se face schimbul de date și informații între CPU și memorie sau dispozitivele I/O.
Unitatea centrală de prelucrare execută instrucțiunile pe care le primește prin internediul magistralei de date de la memoria program. Magistrala de date și cea de adrese pot fi izolate sau multiplexate, iar modulele I/O pot fi seriale sau paralele, fiecare modul fiind în stare să schimbe date cu mediul exterior prin intermediul registrului de date. Controlerul de întreruperi al microcontrolerului permite intrări din exterior cât și de la modulele externe. Configurarea modulului se face de către unitatea centrală de prelucrare datorită registrului de comenzi iar citirea stării modulului se face cu ajutorul registrului de stări.
3.4.2. Prezentarea microcontrolerului Atmega328
Atmega328 este un microcontroler ce face parte din familia CMOS , lucrează cu 8 biți bazat pe arhitectura AVR (concepută de corporația Atmel în 1996) RISC, la fel ca și modelele ATmega48PA/88PA/168PA. AVR a fost una dintre familiile de microcontrolere care uiliza pe cip, memorie flash pentru stocarea programelor spre deosebire de alte familii de microcontrolere care dețineau memorii ce puteau fi programate doar o singura dată, la fabricație cum ar fi memorii ROM, EPROM sau EEPROM.
Se poate spune că AVR este o modificare a arhitecturii Harvard în care programele și datele sunt stocate pe memorii separate acestea figurând în spații de adrese diferite, dar având posibilitatea citirii datelor din memorii utilizând instrucțiuni speciale. Microcontrolerul ATmega328 deține o unitate centrală de prelucrare AVR care combină un set bogat de instrucțiuni cu 32 de registre de uz general de lucru. [25]
Figura 3.10. Microcontroler ATmega328-PU
Termenul de RISC este frecvent întâlnită în literaratura pentru calculatoare și se vor explica câteva aspecte referitoare la acesta în rândurile următoare. Arhitectura Harvard este un concept mai nou ce s-a născut din nevoia de mărire a vitezei microcontrolerului, magistrala de adrese și cea de date ale acestei arhitecturi fiind separate. În acest caz este posibil un mare debit de date prin unitatea centrală de procesare și totodată o viteză mai mare de lucru. Dacă memoria de date este separată de program este posibil ca mai departe instrucțiunile să nu trebuiască să fie cuvinte de 8 biți.
Deasemenea este ceva obișnuit ca o arhitectură Harvard să aibă mai puține instrucțiuni decât von-Neuwmann și să aibă în general, instrucțiuni executate într-un ciclu. Microcontrolerele cu arhitectură Harvard sunt numite și microcontrolere RISC (Reduced Instruction Set Computer). Faptul că Atmega328 este un microcontroler RISC ne arată că acesta are un set redus de instrucțiuni.
Prin executarea unor instrucțiuni precise într-un singur ciclu de tact, Atmega328 realizează un transfer care se apropie de 1 MIPS per MHz, permițând proiectantului sistemului să optimizeze consumul de energie raportat la viteza de procesare.
Toate cele 32 de registre sunt conectate direct la ALU (unitatea aritmetico-logică) care permite ca două registre independente să fie accesate printr-o singură instrucțiune executată într-un ciclu de tact. Arhitectura rezultată este mai eficientă în codificare din moment ce rata de transfer este de până la 10 ori mai mare ca și la microcontrolerele CISC convenționale.
Microcontrolerul Atmega328P prezintă următoarele caracteristici: 4K/8/K bytes de memorie In-System-Programmable Flash cu, capacități Read-While-Write, 1K memorie EEPROM, 2K memorie SRAM, 23 de linii I/O pentru scopuri generale, 32 de registre de lucru, 3 Timer/Counter (temporizatoare/numărătoare) cu capacitate de comparare, întreruperi interne și externe, USART serial programabil, interfață serială, port serial SPI, ADC cu 6 canale și 10 biți ( cu 8 canale în pachete TQFP și QFN/MLF), temporizator Watchdog programabil cu oscilator intern și 5 moduri de selectare consumului econom de energie. Funcționarea unității centrale de prelucrare poate fi oprită prin modul Idle, în timp ce memoria SRAM, temporizatoarele/counter-ele, USART, interfața serială, portul SPI și sistemul de întreruperi pot funcționa normal. Modul power-down salvează conținutul registrelor, „îngheață” (stopează) oscilatorul dezactivând toate celelalte funcții ale cip-ului până la următoarea întrerupere sau resetare hardware. În modul power-save (economisire a energiei) temporizatorul asincron continuă să funcționeze, permițând utilizatorului să mențină o evidență a timpului în timp ce alte dispozitive sunt inactive. [25]
Figura 3.11. Diagrama bloc a microcontrolerului Atmega328. [25]
Modul de reducere ADC al zgomotului stopează unitatea centrală de procesare și modulele I/O cu excepția temporizatorului asincron, pentru ca să minimizeze zgomotul cât timp durează conversia ADC. În modul standby, oscilatorul funcționează în timp ce alte dispozitive sunt inactive, permițând astfel o pornire rapidă a microcontrolerului cu un consum de energie scăzut. [25]
Microcontrolerul este fabricat utilizând tehnologia de memorie non-volatilă Atmel de nivel ridicat. On-chip ISP Flash permite ca memoria de programe să poată fi reprogramată In-System prin interfața serială SPI de către un programator convențional de memorie non-volatilă (reprogramabilă) sau de un program de „butare” on-chip rulat pe CPU. Acesta poate utiliza orice interfață pentru a descărca aplicația-program în Application Flash Memory.
Combinând o unitate centrală de procesare (CPU) RISC pe 8 biți cu un In-System autoprogramabil Flash, ATmega328 poate fi descris ca un microcontroler puternic care oferă soluții extrem de eficiente și flexibile pentru mai multe aplicații de control, și pentru aparatele alimentate de la baterie din cauza consumului său mic.
Capitolul 4. Mediul de programare Arduino
4.1. Prezentarea mediului de programare
Pentru a putea fi utilizată ca să îndeplinească anumite sarcini, platforma arduino necesită implementarea unui program în memoria sa, program care să-i comunice exact ce anume să facă și cum să acționeze. Implementarea programului se realizează prin intermediul mediului de programare Arduino, în cazul plăcii folosite pentru robotul mobil varianta destul de nouă: Arduino 1.0 .
Mediul de programare Arduino, open-source (adică este disponibil gratuit oricărui utilizator) facilitează scrierea programului și încărcarea acestuia prin interfața I/O și poate rula cu sisteme de operare cum ar fi Windows, Linux și Mac OS X fiind alcătuit în mediul Java bazat pe procesarea avr-gcc și pe alte software-e open-source.
Figura 4.1. Interfața mediului de dezvoltare Arduino
Se poate observa în figura 4.1. că mediul de dezvoltare Arduino conține un editor de texte pentru scrierea programelor (cod), o zonă pentru mesaje, o consolă de text, o bară de instrumente cu butoane pentru funcții comune și o serie de meniuri. [26]
Programele create în mediul de dezvoltare Arduino se numesc „sketch-uri” acestea fiind scrise în editorul de texte și salvate ca fișiere cu extensia „ .ino” . În acest editor de texte sunt valabile funcțiile binecunoscute copy/paste/cut și funcțiile de căutare și înlocuire a textelor.
Zona de mesaje oferă utilizatorului un feedback în timp ce acesta utilizează funcții ca și save, export și deasemenea afișează și erorile care pot să apară în timpul încărcării programelor, iar consola de text afișează texte caracteristice plăcii Arduino, care pot include erori complete și alte informații. De exemplu în partea dreaptă jos a ferestrei este afișat la ce model de placă este conectat la momentul respectiv și prin care port serial, în cazul nostru așa cum se vede și în figura 5.1. fiind vorba de placa Arduino Uno conectat prin portul COM5. Butoanele din bara de instrumente permit încărcarea și verificarea programelor, crearea, deschiderea și salvarea programelor (sketch-urilor).
4.2. Modul de instalare a mediului de programare și încărcarea unui program
Instalarea programului pe un calculator și conexiunea acestuia cu o placă Arduino se realizează relativ simplu îndeplinind câțiva pași. Acești pași sunt următorii:
Achiziționarea unei platforme Arduino și a unui cablu USB;
Descărcarea mediului de dezoltare Arduino;
Conectarea platformei la calculator;
Instalarea driverelor;
Lansarea aplicației Arduino;
Deschiderea exemplului de program blink;
Selectarea modelului de placă utilizat;
Selectarea portului serial;
Încărcarea programului.
În continuare se vor dezbate pe scurt acești pași. Se presupune că deținem o placă Arduino Uno și un cablu USB prin care se face conexiunea unei imprimante la un calculator. Se descarcă în variantă „gratis” software-ul Arduino de pe Internet pe pagina oficială Arduino, ulterior se dezarhivează fișierele descărcate, și se asigură că s-au păstrat structura folderelor. Modelul de placă Arduino Uno, la fel ca și modelele Mega, Duemilanove și Arduino se alimentează automat prin conexiunea USB, sursa de alimentare fiind selectată printr-un jumper, o piesă mică de plastic care este potrivit pe 2 din cei 3 pini ai portului USB și a mufei de alimentare jak. Pentru acest jumper trebuie făcută o verificare ca acesta să fie potrivit pe cei 2 pini apropiați de portul USB. [26]
Se face conectarea plăcii la calculator prin cablul USB, moment din care led-ul verde de pe placă (etichetat cu denumirea PWR) ar trebui să se aprindă intermitent și se așteaptă ca Windows să înceapă procesul de instalare dar după câteva secunde acesta eșuează. În acest caz trebuie făcute câteva setări în Control Panel pentru recunoașterea driver-ului Arduino. Din Control Panel se accesează iconița System și apoi Device Manager, sub iconița Ports ar trebuie să apară un port numit „Arduino Uno (COMxx), se da click dreapta pe acesta și se selectează opțiunea „Update Driver Software” apoi „Browse my computer for Driver software” (fig.5.2.). Într-un final se selectează „ArduinoUNO.inf”, localizat în folderul „Drivers” astfel Windows 7 va încheia instalarea driverului din această locație.
Figura 4.2. Instalarea driverelor Arduino Uno pentru Windows 7
În continuare se lansează aplicația Arduino, iar pentru exemplu se deschide un sketch cu denumirea blink accesând meniul File>Examples>1.Basics>Blink, program ce determină aprinderea intermitentă a led-urilor Rx și Tx de pe placă, în condițiile stabilite de acesta. Pentru selectarea modelului de placă utilizat este necesară accesarea meniului Tools<Board așa cum se poate observa în figura 4.3 . Aici apar o mulțime de modele de placă Arduino din care se alege doar una, în cazul de față fiind vorba de placa Arduino Uno.
Figura 4.3. Selectarea modelului de placă Arduino utilizat pentru sketch-ul Blink
Pasul următor constă în alegerea portului serial al calculatorului la care este conectată placa Arduino. Se accesează opțiunea Serial Port din meniul Tools (instrumente) selectând portul corespunzător. De obicei se selectează portul COM3 pentru că, COM1 și COM2 sunt utilizate de obicei pentru alte aplicații hardware.[26] Pentru a afla care port corespunde plăcii se deconectează placa de la PC, se accesează locația menționată în rândurile de mai sus pentru selectarea portului și se observă că portul care corespunde plăcii respective nu mai figurează printre celelalte porturi care erau afișate când placa era conectată. Se conectează din nou placa la calculator și portul corespunzător acestuia va fi afișat din, astfel se poate determina portul potrivit.
Mai rămâne de făcut un pas simplu și anume accesarea funcției „Upload” (încărcare) din fereastra cu butoane, pentru a încărca programul Blink. Dacă totul decurge în regulă se va afișa în fereastra de mesaje „Done uploading” iar după câteva secunde led-urile Rx și Tx se vor aprinde intermitent deasemenea și led-ul portocaliu de la pinul 13 de pe placă se va aprinde odată.
4.3. Instrucțiuni Arduino utilizate pentru programarea robotului
Din punct de vedere al instrucțiunilor programele Arduino se pot împărți în 3 grupe: instrucțiuni de structură, de valori (constante sau variabile), și instrucțiuni pentru funcții. Există numeroase instrucțiuni destinate mediului de programare Arduino, datorită acestui fapt în continuare se vor prezenta doar câteva dintre acestea și mai ales cele utilizate în programul creat pentru funcționarea robotului.
Instrucțiuea „void” face parte din categoria instrucțiunilor de valori și este utilizat numai în declarații de funcții. Indică faptul că funcția nu așteaptă nici o returnare de informație de la funcția care s-a făcut apelarea. [27]
Exemplu1: // acțiunile sunt efectuate în cadrul funcțiilor „setup” și „loop” (buclă)
// nici o informație nu o să fie raportată la programul principal
void setup ()
{
//…
}
void loop
{
//…
}
O altă instrucțiune comună este „setup” care este apelată la începutul unui sketch (program) și se utilizează pentru a inițializa variabile, configura pini, etc. Funcția „setup” rulează o singură dată după fiecare pornire sau resetare a plăcii Arduino. După ce se realizează o configurație care stabilește valorile inițiale prin intermediul funcției „setup” , instrucțiunea „loop()” (buclă) face exact cea a ce se poate deduce și din numele acesteia, și anume bucle consecutive permițând programului să facă schimbări sau să răspundă dacă e cazul.
Instrucțiunea „boolean” face parte tot din categoria instrucțiunilor de valori, aceasta poate avea două valori: true (adevărat) sau false (fals). Fiecare variabilă boolean ocupă memorie de 1 octet. Instrucțiunea „PinMode” configurează un pin oarecare astfel încât acesta să se comporte ca o ieșire sau intrare.
Exemplu 2. sintaxă (pin, mode) echivalent cu (2, input).
În acest exemplu s-a configurat pinul 2 care se va comporta ca o ieșire. Instrucțiunea „while” determină ca secvența de program să se repete la nesfârșit atâta timp cât valoarea dintre paranteze o să fie true. „DigitalWrite” este o instrucțiune care atribuie unui pin configurat ca intrare sau ieșire starea de HIGH sau LOW. De exemplu dacă pinul este configurat ca ieșire (output), pentru starea HIGH va avea tensiune de 5V sau 3.3V pe placă iar pentru starea LOW 0V (masă). „if” (condiționare) este în conjuncție cu un operator de comparație, adică testează dacă o anumită condiție a fost atinsă. [27]
Exemplu 3. if ( variabilă > 15)
{
// execută comandă
}
În exemplul de mai sus programul verifică dacă variabila are o valoare mai mare de 15, dacă răspunsul este „true” atunci programul îndeplinește sarcina aflată între cele două acolade.
Instrucțiunea „analogWrite” atribuie o valoare analogică (semnal PWM) unui pin și poate fi utilizat pentru a controla intensitatea cu care luminează un led sau viteza unui motor. După o apelare a instrucțiunii „analogWrite” pinul respectiv va genera constant un semnal dreptunghiular specificat, până în momentul în care se face o altă apelare a instrucțiunii. Frecvența semnalului PWM este de aproximitv 490 Hz.
„delay” este instrucțiunea care stopează programul pentru perioada de timp care este specificată de programator în milisecunde.
Sintaxa: delay (ms)
„attachInterrupt” , așa cum și numele acestei instrucțiuni sugerează, apelează o funcție specificată atunci când apare o întrerupere externă, și înlocuiește fucția anterioară care a fost atașată la întrerupere.
„detachInterrupt” dezactivează întreruperea specificată.
Capitolul 5. Programele realizate pentru robotul mobil
5.1. Programul Arduino al robotului mobil:
Acest subcapitol conține programul de comandă realizat pentru robotul mobil. Programul este scris în mediul de programare Arduino și încărcat în memoria platformei de dezvoltare Arduino care se află în componența robotului. În cadrul acestui program robotul primește comenzi de la un smartphone sau de la un calculator personal echipat cu un adaptor bluetooth și efectueză mișcări de deplasare pe direcțile de mers înainte-înapoi, viraj stânga-dreapta, aprindere/stingere far, semnal sonor și oprire în cazul localizării unui obstacol în raza sa de acțiune.
// Initializarea pinilor
int inainte = 11; // Pin 11 – înainte
int inapoi = 10; // Pin 10 – înapoi
int dreapta = 9; // Pin 9 – dreapta
int stanga = 8; // Pin 8 – stânga
int far = 7; //farul este conectat la iesirea digitala 7
int alarma = 6; //difuzorul este conectat la iesirea digitala 6
volatile int stare = LOW; //initializare variabila obstacol detectat
int semnal = 0; // initializarea variabilei unde se stocheaza semnalul primit
int valoarea_vitezei = 110; // initializarea variabilei care specifica viteza
// Specificarea intrarilor și iesirilor
void setup() {
pinMode(inainte, OUTPUT); //configureaza pinul inainte ca iesire
pinMode(inapoi, OUTPUT); //configureaza pinul inapoi ca iesire
pinMode(stanga, OUTPUT); //configureaza pinul stanga ca iesire
pinMode(dreapta, OUTPUT); //configureaza pinul dreapta ca iesire
pinMode(far, OUTPUT); //farul este configurat ca iesire
pinMode(alarma, OUTPUT); //alarma este configurata ca iesire
attachInterrupt(0, obstacol, CHANGE); //Initializare întrerupere
Serial.begin(9600); // Porneste comunicarea prin intermediul portului serial la 9600bps
}
void loop(){
if (Serial.available() > 0) { // Verifică dacă se primeste semnal
semnal = Serial.read(); // Introducerea semnalului primit în variabila "semnal"
delay(10); // temporizare de 10 milisecunde care permite reimprospatarea semnalelor primite
// Verificarea semnalului primit
if (semnal == 'y'){ // dacă semnalul primit este "y" – mareste viteza
mareste_viteza();
}
else if (semnal == 'h'){ // dacă semnalul primit este "h" – reduce viteza
reduce_viteza();
}
else if (semnal == 't'){ // dacă semnalul primit este "t" – seteaza viteza maxima
viteza_maxima();
}
else if (semnal == 'g'){ // dacă semnalul primit este "g" – seteaza viteza minima
viteza_minima();
}
else if (semnal == 'i'){ // dacă semnalul primit este "i" – deplaseaza inainte
delpasare_inainte();
}
else if (semnal == 'u'){ // dacă semnalul primit este "u" – deplaseaza inainte-stanga
delpasare_inainte_stanga();
}
else if (semnal == 'o'){ // dacă semnalul primit este "o" – deplaseaza inainte-dreapta
delpasare_inainte_dreapta();
}
else if (semnal == 'j'){ // dacă semnalul primit este "j" – deplaseaza inapoi-stanga
delpasare_inapoi_stanga();
}
else if (semnal == 'l'){ // dacă semnalul primit este "l" – deplaseaza inapoi-dreapta
delpasare_inapoi_dreapta();
}
else if (semnal == 'k'){ // dacă semnalul primit este "k" – deplaseaza inapoi
delpasare_inapoi();
}
else if (semnal == 'b'){ // dacă semnalul primit este "b" – aprinde far
aprinde_far();
}
else if (semnal == 'n'){ // dacă semnalul primit este "n" – stinge far
stinge_far();
}
else if (semnal == ' '){ // dacă semnalul primit este "Spațiu" – porneste alarma
porneste_alarma();
}
}
else {
asteapta_semnal(); // Asteaptă semnal
}
}
// Măreste viteza
void mareste_viteza() {
valoarea_vitezei = valoarea_vitezei + 5;
verifica_viteza();
Serial.print("Viteza s-a marit la: ");
Serial.println(valoarea_vitezei);
}
// Reduce viteza
void reduce_viteza() {
valoarea_vitezei = valoarea_vitezei – 5;
verifica_viteza();
Serial.print("Viteza s-a redus la: ");
Serial.println(valoarea_vitezei);
}
// Viteza maxima
void viteza_maxima() {
valoarea_vitezei = 160;
verifica_viteza();
Serial.println("\nViteza este Maxima ");
}
// Viteza minima
void viteza_minima() {
valoarea_vitezei = 80;
verifica_viteza();
Serial.println(" \nViteza este Minima ");
}
// Verifica viteza
void verifica_viteza(){
if (valoarea_vitezei > 150){ // poate contine o valoare intre 0-255
valoarea_vitezei = 155;
Serial.print("Viteza este Maxima ");
}
if (valoarea_vitezei < 95){
valoarea_vitezei = 90;
Serial.print("Viteza este Minima ");
}
}
// Deplasarea inainte
void delpasare_inainte() {
if (stare==LOW) {
Serial.println("Deplasare inainte ");
analogWrite(inainte, valoarea_vitezei);
delay(25);
}
else{
Serial.println("Obstacol detectat ");
ocolire_obstacol();
}
}
// Deplasare inainte stanga
void delpasare_inainte_stanga() {
if (stare==LOW) {
Serial.println("Deplasare inainte-stanga ");
analogWrite(inainte, valoarea_vitezei);
digitalWrite(stanga, HIGH);
delay(25);
}
else{
Serial.println("Obstacol detectat ");
ocolire_obstacol();
}
}
// Deplasare inainte dreapta
void delpasare_inainte_dreapta() {
if (stare==LOW) {
Serial.println("Deplasare inainte-dreapta ");
digitalWrite(dreapta, HIGH);
analogWrite(inainte, valoarea_vitezei);
delay(25);
}
else{
Serial.println("Obstacol detectat ");
ocolire_obstacol();
}
}
// Deplasare inapoi-stanga
void delpasare_inapoi_stanga() {
Serial.println("Deplasare inapoi-stanga ");
digitalWrite(stanga, HIGH);
analogWrite(inapoi, valoarea_vitezei);
stare=LOW;
delay(25);
}
// Deplasare inapoi-dreapta
void delpasare_inapoi_dreapta() {
Serial.println("Deplasare inapoi-dreapta ");
digitalWrite(dreapta, HIGH);
analogWrite(inapoi, valoarea_vitezei);
stare=LOW;
delay(25);
}
// Deplasare inapoi
void delpasare_inapoi() {
Serial.println("Deplasare inapoi ");
analogWrite(inapoi, valoarea_vitezei);
stare=LOW;
delay(25);
}
// Aprinde Far
void aprinde_far() {
Serial.println("Farul s-a aprins ");
digitalWrite(far, HIGH);
delay(25);
}
// Stinge Far
void stinge_far() {
Serial.println("Farul s-a stins ");
digitalWrite(far, LOW);
delay(25);
}
// Asteapta semnal
void asteapta_semnal() {
digitalWrite(inainte, LOW);
digitalWrite(inapoi, LOW);
digitalWrite(stanga, LOW);
digitalWrite(dreapta, LOW);
}
// Porneste Alarma
void porneste_alarma() {
Serial.println("Avertizare sonora ");
tone(6, 4000);
delay(150);
noTone(6);
}
// Ocolire obstacol
void ocolire_obstacol() {
digitalWrite(inainte, LOW);
digitalWrite(inapoi, HIGH);
delay(10);
digitalWrite(inapoi, LOW);
delay(20);
}
void obstacol()
{
stare = !stare;
}
5.2. Programul pentru platforma Android:
Android este o platformă software și un sistem de operare pentru dispozitive și telefoane mobile bazată pe nucleul Linux. Această platformă permite dezvoltatorilor să scrie linii de cod în limbajul Java, controlând astfel dispozitivul prin intermediul bibliotecilor Java dezvoltate de Google.
Mediul de dezvoltare (IDE) pentru platforma Android este Eclipse împreună cu plug-in-ul Android Development Tools (ADT).
Aplicația scrisă în mediul de dezvoltare Eclipse cu ajutorul căreia este posibilă comanda robotului mobil are următoarea interfață:
Figura 5.1. Interfața programului pentru sistemul de operare Android
Codul sursa al acestei aplicații:
//Importarea librăriilor folosite pt aplicația RobotMobil
package android.RobotMobil;
import android.bluetoothtest.R;
import android.app.Activity;
import android.bluetooth.BluetoothAdapter;
import android.bluetooth.BluetoothDevice;
import android.bluetooth.BluetoothSocket;
import android.os.Bundle;
import android.os.Handler;
import android.view.MotionEvent;
import android.view.View;
import android.widget.TextView;
import android.widget.Button;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.Set;
import java.util.UUID;
import android.content.Intent;
import android.widget.ImageButton;
public class RobotMobil extends Activity
{
TextView myLabel;
TextView myRaspunsrobot;
BluetoothAdapter mBluetoothAdapter;
BluetoothSocket mmSocket;
BluetoothDevice mmDevice;
OutputStream mmOutputStream;
InputStream mmInputStream;
String msg;
Thread workerThread;
byte[] readBuffer;
int readBufferPosition;
int counter;
volatile boolean stopWorker;
boolean touched=false;
boolean inainte=false;
boolean sinainte=false;
boolean dinainte=false;
boolean inapoi=false;
boolean sinapoi=false;
boolean dinapoi=false;
boolean buzz=false;
boolean ON=false;
boolean OFF=false;
boolean vplus=false;
boolean vminus=false;
boolean vmax=false;
boolean vmin=false;
int time=30; // durata în milisecunde intre doua caractere transmise
@Override
public void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
myLabel = (TextView)findViewById(R.id.label);
myRaspunsrobot = (TextView)findViewById(R.id.raspunsrobot);
// definirea butoanelor cu ajutorul cărora se controlează robotul mobil
Button connectButton = (Button)findViewById(R.id.connectBT);
Button disconnectButton = (Button)findViewById(R.id.disconnectBT);
ImageButton inainteButton = (ImageButton)findViewById(R.id.inainte);
ImageButton sinainteButton = (ImageButton)findViewById(R.id.sinainte);
ImageButton dinainteButton = (ImageButton)findViewById(R.id.dinainte);
ImageButton inapoiButton = (ImageButton)findViewById(R.id.inapoi);
ImageButton sinapoiButton = (ImageButton)findViewById(R.id.sinapoi);
ImageButton dinapoiButton = (ImageButton)findViewById(R.id.dinapoi);
Button buzzButton = (Button)findViewById(R.id.buzz);
Button ONButton = (Button)findViewById(R.id.ON);
Button OFFButton = (Button)findViewById(R.id.OFF);
Button vplusButton = (Button)findViewById(R.id.vplus);
Button vminusButton = (Button)findViewById(R.id.vminus);
Button vmaxButton = (Button)findViewById(R.id.vmax);
Button vminButton = (Button)findViewById(R.id.vmin);
// butonul de detectareși conectare la robotul mobil prin intermediul interfeței Bluetooth
findBTdevice();
connectButton.setOnClickListener(new View.OnClickListener()
{
public void onClick(View v)
{
if(!mBluetoothAdapter.isEnabled())
{
myLabel.setText("Bluetooth-ul nu e activat!");
}
else
{
try
{
conectBT();
}
catch (IOException ex) { }
}
}});
// Butonul de deconectare a robotului mobil
disconnectButton.setOnClickListener(new View.OnClickListener()
{
public void onClick(View v)
{
if(mmOutputStream==null){
myLabel.setText("Nu este nici un robot conectat");
return;
}
try
{
disconectBT();
}
catch (IOException ex) { }
}
});
// Butonul de deplasare inainte
inainteButton.setOnTouchListener(new View.OnTouchListener()
{
public boolean onTouch(View v, MotionEvent event)
{
int action=event.getAction();
switch (action)
{
case MotionEvent.ACTION_DOWN:
touched=true;
inainte=true;
break;
case MotionEvent.ACTION_MOVE:
touched=true;
inainte=true;
break;
case MotionEvent.ACTION_UP:
touched=false;
inainte=false;
break;
}
return false;
}
});
sinainteButton.setOnTouchListener(new View.OnTouchListener()
{
public boolean onTouch(View v, MotionEvent event)
{
int action=event.getAction();
switch (action)
{
case MotionEvent.ACTION_DOWN:
touched=true;
sinainte=true;
break;
case MotionEvent.ACTION_MOVE:
touched=true;
sinainte=true;
break;
case MotionEvent.ACTION_UP:
touched=false;
sinainte=false;
break;
}
return false;
}
});
dinainteButton.setOnTouchListener(new View.OnTouchListener()
{
public boolean onTouch(View v, MotionEvent event)
{
int action=event.getAction();
switch (action)
{
case MotionEvent.ACTION_DOWN:
touched=true;
dinainte=true;
break;
case MotionEvent.ACTION_MOVE:
touched=true;
dinainte=true;
break;
case MotionEvent.ACTION_UP:
touched=false;
dinainte=false;
break;
}
return false;
}
});
inapoiButton.setOnTouchListener(new View.OnTouchListener()
{
public boolean onTouch(View v, MotionEvent event)
{
int action=event.getAction();
switch (action)
{
case MotionEvent.ACTION_DOWN:
touched=true;
inapoi=true;
break;
case MotionEvent.ACTION_MOVE:
touched=true;
inapoi=true;
break;
case MotionEvent.ACTION_UP:
touched=false;
inapoi=false;
break;
}
return false;
}
});
sinapoiButton.setOnTouchListener(new View.OnTouchListener()
{
public boolean onTouch(View v, MotionEvent event)
{
int action=event.getAction();
switch (action)
{
case MotionEvent.ACTION_DOWN:
touched=true;
sinapoi=true;
break;
case MotionEvent.ACTION_MOVE:
touched=true;
sinapoi=true;
break;
case MotionEvent.ACTION_UP:
touched=false;
sinapoi=false;
break;
}
return false;
}
});
dinapoiButton.setOnTouchListener(new View.OnTouchListener()
{
public boolean onTouch(View v, MotionEvent event)
{
int action=event.getAction();
switch (action)
{
case MotionEvent.ACTION_DOWN:
touched=true;
dinapoi=true;
break;
case MotionEvent.ACTION_MOVE:
touched=true;
dinapoi=true;
break;
case MotionEvent.ACTION_UP:
touched=false;
dinapoi=false;
break;
}
return false;
}
});
buzzButton.setOnTouchListener(new View.OnTouchListener()
{
public boolean onTouch(View v, MotionEvent event)
{
int action=event.getAction();
switch (action)
{
case MotionEvent.ACTION_DOWN:
touched=true;
buzz=true;
break;
case MotionEvent.ACTION_MOVE:
touched=true;
buzz=true;
break;
case MotionEvent.ACTION_UP:
touched=false;
buzz=false;
break;
}
return false;
}
});
ONButton.setOnTouchListener(new View.OnTouchListener()
{
public boolean onTouch(View v, MotionEvent event)
{
int action=event.getAction();
switch (action)
{
case MotionEvent.ACTION_DOWN:
touched=true;
ON=true;
break;
case MotionEvent.ACTION_MOVE:
touched=true;
ON=true;
break;
case MotionEvent.ACTION_UP:
touched=false;
ON=false;
break;
}
return false;
}
});
OFFButton.setOnTouchListener(new View.OnTouchListener()
{
public boolean onTouch(View v, MotionEvent event)
{
int action=event.getAction();
switch (action)
{
case MotionEvent.ACTION_DOWN:
touched=true;
OFF=true;
break;
case MotionEvent.ACTION_MOVE:
touched=true;
OFF=true;
break;
case MotionEvent.ACTION_UP:
touched=false;
OFF=false;
break;
}
return false;
}
});
vplusButton.setOnTouchListener(new View.OnTouchListener()
{
public boolean onTouch(View v, MotionEvent event)
{
int action=event.getAction();
switch (action)
{
case MotionEvent.ACTION_DOWN:
touched=true;
vplus=true;
break;
case MotionEvent.ACTION_MOVE:
touched=true;
vplus=true;
break;
case MotionEvent.ACTION_UP:
touched=false;
vplus=false;
break;
}
return false;
}
});
vminusButton.setOnTouchListener(new View.OnTouchListener()
{
public boolean onTouch(View v, MotionEvent event)
{
int action=event.getAction();
switch (action)
{
case MotionEvent.ACTION_DOWN:
touched=true;
vminus=true;
break;
case MotionEvent.ACTION_MOVE:
touched=true;
vminus=true;
break;
case MotionEvent.ACTION_UP:
touched=false;
vminus=false;
break;
}
return false;
}
});
vmaxButton.setOnTouchListener(new View.OnTouchListener()
{
public boolean onTouch(View v, MotionEvent event)
{
int action=event.getAction();
switch (action)
{
case MotionEvent.ACTION_DOWN:
touched=true;
vmax=true;
break;
case MotionEvent.ACTION_MOVE:
touched=true;
vmax=true;
break;
case MotionEvent.ACTION_UP:
touched=false;
vmax=false;
break;
}
return false;
}
});
vminButton.setOnTouchListener(new View.OnTouchListener()
{
public boolean onTouch(View v, MotionEvent event)
{
int action=event.getAction();
switch (action)
{
case MotionEvent.ACTION_DOWN:
touched=true;
vmin=true;
break;
case MotionEvent.ACTION_MOVE:
touched=true;
vmin=true;
break;
case MotionEvent.ACTION_UP:
touched=false;
vmin=false;
break;
}
return false;
}
});
// rutina de trimitere a semnalelor către robotul mobil
final Handler handler = new Handler();
Runnable runnable = new Runnable()
{
public void run()
{
if (touched==true )
{
if(mmOutputStream!=null)
{
if (inainte==true)
{
msg ="i";
}
if (sinainte==true)
{
msg ="u";
}
if (dinainte==true)
{
msg ="o";
}
if (inapoi==true)
{
msg ="kr";
}
if (sinapoi==true)
{
msg ="j";
}
if (dinapoi==true)
{
msg ="l";
}
if (buzz==true)
{
msg =" ";
}
if (ON==true)
{
msg ="b\n";
}
if (OFF==true)
{
msg ="n\n";
}
if (vplus==true)
{
msg ="y\n";
}
if (vminus==true)
{
msg ="h\n";
}
if (vmax==true)
{
msg ="t\n";
}
if (vmin==true)
{
msg ="g\n";
}
try
{
mmOutputStream.write(msg.getBytes());
}
catch (IOException ex) { }
}
}
handler.postDelayed(this, time);
}
};
runnable.run();
}
//funcția de conectare la robotul mobil prin intermediul interfeței Bluetooth
void conectBT() throws IOException
{
UUID uuid = UUID.fromString("00001101-0000-1000-8000-00805f9b34fb");
mmSocket = mmDevice.createRfcommSocketToServiceRecord(uuid);
mmSocket.connect();
mmOutputStream = mmSocket.getOutputStream();
mmInputStream = mmSocket.getInputStream();
beginListenForData();
myLabel.setText("Bluetooth Conectat");
}
//funcția de deconectare a robotul mobil
void disconectBT() throws IOException
{
mmOutputStream.close();
mmInputStream.close();
mmSocket.close();
myLabel.setText("Bluetooth Deconectat");
}
//funcția de detectare a robotul mobil cu ajutorul interfeței Bluetooth
void findBTdevice()
{
mBluetoothAdapter = BluetoothAdapter.getDefaultAdapter();
if(mBluetoothAdapter==null)
{
myLabel.setText("Adaptorul bluetooth nu e disponibil");
}
if(!mBluetoothAdapter.isEnabled())
{
Intent enableBluetooth = new Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE);
startActivityForResult(enableBluetooth, 0);
}
Set<BluetoothDevice> pairedDevices = mBluetoothAdapter.getBondedDevices();
if(pairedDevices.size() > 0)
{
for(BluetoothDevice device : pairedDevices)
{
}
}
myLabel.setText("Conectati dispozitivul la Robot");
}
// funcția de recepționare a stării actuale a robotului mobil
void beginListenForData()
{
final Handler handler = new Handler();
final byte delimiter = 10; //This is the ASCII code for a newline character
stopWorker = false;
readBufferPosition = 0;
readBuffer = new byte[1024];
myRaspunsrobot.setText("Se asteapta o comanda");
workerThread = new Thread(new Runnable()
{
public void run()
{
while(!Thread.currentThread().isInterrupted() && !stopWorker)
{
try
{
int bytesAvailable = mmInputStream.available();
if(bytesAvailable > 0)
{
byte[] packetBytes = new byte[bytesAvailable];
mmInputStream.read(packetBytes);
for(int i=0;i<bytesAvailable;i++)
{
byte b = packetBytes[i];
if(b == delimiter)
{
byte[] encodedBytes = new byte[readBufferPosition];
System.arraycopy(readBuffer, 0, encodedBytes, 0, encodedBytes.length);
final String data = new String(encodedBytes, "US-ASCII");
readBufferPosition = 0;
handler.post(new Runnable()
{
public void run()
{
myRaspunsrobot.setText(data);
}
});
}
else
{
readBuffer[readBufferPosition++] = b;
}
}
}
}
catch (IOException ex)
{
stopWorker = true;
}
}
}
});
workerThread.start();
}
}
Concluzie
Punctul de pornire al acestui proiect îl constituie un articol găsit pe internet unde s-a mentionat de posibilitatea de a controla un robot mobil prin intermediul interfeței Bluetooth. După prezentarea acestei idei profesorului coordonator s-a trecut la realizarea practică a acestui robot. Elementul inițial al acestei lucrari îl constituie o masinuță teleghidata apoi s-a pus la dispoziție de catre facultate a unei platforme Arduino UNO. S-a achiziționat modulul Bluetooth, compatibil cu platforma Arduino, necesar comenzii de la distanta, și pe urmă pentru a oferi mai multe funcții robotului, cat și un grad de complexitate mai mare, s-a procurat și un senzor de distanță cu ajutorul căruia se face detecția obstacolelor, două beculețe pe post de far și un minidifuzor pentru ai oferi posibilitatea de a emite un semnal sonor. Având toate acestea la îndemână s-a trecut la următoarea etapă, și anume la asamblarea componentelor, în urma căreia am ajuns la realizarea robotului.
După montajul fizic s-a trecut la partea de programarea a robotului în mediului de programare Arduino. Inițial comanda robotului s-a facut de la un Netbook Asus EeePC, dotat cu un modul Bluetooth, prin intermediul “HyperTerminal”-ului. Apoi pentru a simplifica metoda de conectare și comandă a robotului cat și pentru ai oferi un plus de mobilitate s-a decis crearea unei aplicații Android, compatibila cu orice smartphone care ruleaza sistemul de operare Android 2.1 sau mai mare.
În urma testelor s-a constatat că robotul detectează obstacolele aflate la o distanță de 10 cm (conform datelor de catalog) însă această distanță s-a dovedit a fi foarte mică, la viteze mai mari, iar robotul nu reuseste să se oprească la timp în fața obstacolelor, deoarece este antrenat mai departe de fortele de inerție. Soluția ar fi utilizarea unui alt tip de senzor de distanță care detectează obstacolele aflate la o distanta mai mare decat distanța parcursă de robot datorată forțelor de inerție.
Desi conform datelor de catalog modulul Bluetooth are o distanță minimă de transmisie de 10 metri, în urma testelor s-a dovedit ca funcționează fără pierdere de date până la 50 de metri, spatiu deschis fără obstacole.
În final rezultatul acestui proiect a fost realizarea unui robot mobil, care poate fi comandat, prin intermediul interfeței Bluetooth, să efectueze mișcări de deplasare în sensuri și direcții diferite, să se oprească la depistarea unui obstacol având și posibilitatea de a oferi un semnal sonor cât și capacitatea de a lumina zona de deplasare prin intermediul a două beculețe montate în față robotului.
Bibliografie:
[1] Bazele Roboticii, Gacsadi Alexandru, Universitatea din Oradea 2008.
[2] http://ro.wikipedia.org/wiki/Robot
[3] http://www.scribd.com/doc/117620464/Roboti-mobili-bun
[4] http://staticlb.didactic.ro/uploads/material/115/14/27//roboti.ppt
[5] http://www.scribd.com/doc/135435175/Proiect-roboti-mobili
[6] http://www.buydig.com/blog/wp-content/images/robotics/asimo.jpg
[7] http://industrial.panasonic.com/eu/i/29606/rw/rw/industrial_robots/industrial_robots/
tb1400.png
[8] http://storage0.dms.mpinteractiv.ro/media/401/321/5109/5449645/1/spirit-adio.jpg
[9] http://www.pacificamangarda.com/files/1331570206.jpg
[10] http://www.robotics.ucv.ro/old/wmrc2001/7.pdf
[11] http://www.scribd.com/doc/60481692/53247522-Minirobot-Mobil-Cu-Senzori-
Pentru-Detectare-Obstacole
[12] http://www.tocilar.ro/lucrare_de_diploma~nume-studiu_privind_proiectarea_unui_
robot_autonom_cu_roti_actionat_cu_motoare_de_curent_continu.html
[13] http://files.rbrusu.com/publications/RusuDissertationThesis.pdf
[14] http://www.scribd.com/doc/77272759/adi-pr
[15] Introduction to Autonomous Mobile Robots, Roland Siegwart, Illah R. Nourbakhsh,
2004.
[16] http://robofun.ro/docs/Arduino%20pentru%20Toti%20pagini%201-30.pdf
[17] http://www.robofun.ro/bluetooth_arduino
[18] http://playground.arduino.cc/Learning/Tutorial01
[19] www.pololu.com/catalog/product/1134
[20] www.robofun.ro/arduino/arduino_uno_v3
[21] www.arduino.cc/en/Guide/introduction
[22] www.arduino.cc/en/Main/ArduinoBoardUno
[23] www.arduino.cc/en/uploads/Main/Arduino_Uno_Rev3_schematic.pdf
[24] www.stritube.com/stiinta/informatica/notiuneademicrcocontroler
[25] www.atmel.com/Images/doc8161.pdf
[26] www.arduino.cc/en/Guide/Environment
[27] www.arduino.cc/en/Reference/HomePage
Anexa
Microcontrolerul ATmega328
Features:
• High Performance, Low Power AVR® 8-Bit Microcontroller
• Advanced RISC Architecture
– 131 Powerful Instructions – Most Single Clock Cycle Execution
– 32 x 8 General Purpose Working Registers
– Fully Static Operation
– Up to 20 MIPS Throughput at 20 MHz
– On-chip 2-cycle Multiplier
• High Endurance Non-volatile Memory Segments
– 4/8/16/32K Bytes of In-System Self-Programmable Flash progam memory
(ATmega48PA/88PA/168PA/328P)
– 256/512/512/1K Bytes EEPROM (ATmega48PA/88PA/168PA/328P)
– 512/1K/1K/2K Bytes Internal SRAM (ATmega48PA/88PA/168PA/328P)
– Write/Erase Cycles: 10,000 Flash/100,000 EEPROM
– Data retention: 20 years at 85°C/100 years at 25°C
– Optional Boot Code Section with Independent Lock Bits
In-System Programming by On-chip Boot Program
True Read-While-Write Operation
– Programming Lock for Software Security
• Peripheral Features
– Two 8-bit Timer/Counters with Separate Prescaler and Compare Mode
– One 16-bit Timer/Counter with Separate Prescaler, Compare Mode, and Capture.
Mode
– Real Time Counter with Separate Oscillator
– Six PWM Channels
– 8-channel 10-bit ADC in TQFP and QFN/MLF package
Temperature Measurement
– 6-channel 10-bit ADC in PDIP Package
Temperature Measurement
– Programmable Serial USART
– Master/Slave SPI Serial Interface
– Byte-oriented 2-wire Serial Interface (Philips I2C compatible)
– Programmable Watchdog Timer with Separate On-chip Oscillator
– On-chip Analog Comparator
– Interrupt and Wake-up on Pin Change
• Special Microcontroller Features
– Power-on Reset and Programmable Brown-out Detection
– Internal Calibrated Oscillator
– External and Internal Interrupt Sources
– Six Sleep Modes: Idle, ADC Noise Reduction, Power-save, Power-down, Standby,
and Extended Standby
• I/O and Packages
– 23 Programmable I/O Lines
– 28-pin PDIP, 32-lead TQFP, 28-pad QFN/MLF and 32-pad QFN/MLF
• Operating Voltage:
– 1.8 – 5.5V for ATmega48PA/88PA/168PA/328P
• Temperature Range:
– -40°C to 85°C
• Speed Grade:
– 0 – 20 MHz @ 1.8 – 5.5V
• Low Power Consumption at 1 MHz, 1.8V, 25°C for ATmega48PA/88PA/168PA/328P:
– Active Mode: 0.2 mA
– Power-down Mode: 0.1 μA
– Power-save Mode: 0.75 μA (Including 32 kHz RTC).
Tabel sumar cu spațiul memoriilor:
Bibliografie:
[1] Bazele Roboticii, Gacsadi Alexandru, Universitatea din Oradea 2008.
[2] http://ro.wikipedia.org/wiki/Robot
[3] http://www.scribd.com/doc/117620464/Roboti-mobili-bun
[4] http://staticlb.didactic.ro/uploads/material/115/14/27//roboti.ppt
[5] http://www.scribd.com/doc/135435175/Proiect-roboti-mobili
[6] http://www.buydig.com/blog/wp-content/images/robotics/asimo.jpg
[7] http://industrial.panasonic.com/eu/i/29606/rw/rw/industrial_robots/industrial_robots/
tb1400.png
[8] http://storage0.dms.mpinteractiv.ro/media/401/321/5109/5449645/1/spirit-adio.jpg
[9] http://www.pacificamangarda.com/files/1331570206.jpg
[10] http://www.robotics.ucv.ro/old/wmrc2001/7.pdf
[11] http://www.scribd.com/doc/60481692/53247522-Minirobot-Mobil-Cu-Senzori-
Pentru-Detectare-Obstacole
[12] http://www.tocilar.ro/lucrare_de_diploma~nume-studiu_privind_proiectarea_unui_
robot_autonom_cu_roti_actionat_cu_motoare_de_curent_continu.html
[13] http://files.rbrusu.com/publications/RusuDissertationThesis.pdf
[14] http://www.scribd.com/doc/77272759/adi-pr
[15] Introduction to Autonomous Mobile Robots, Roland Siegwart, Illah R. Nourbakhsh,
2004.
[16] http://robofun.ro/docs/Arduino%20pentru%20Toti%20pagini%201-30.pdf
[17] http://www.robofun.ro/bluetooth_arduino
[18] http://playground.arduino.cc/Learning/Tutorial01
[19] www.pololu.com/catalog/product/1134
[20] www.robofun.ro/arduino/arduino_uno_v3
[21] www.arduino.cc/en/Guide/introduction
[22] www.arduino.cc/en/Main/ArduinoBoardUno
[23] www.arduino.cc/en/uploads/Main/Arduino_Uno_Rev3_schematic.pdf
[24] www.stritube.com/stiinta/informatica/notiuneademicrcocontroler
[25] www.atmel.com/Images/doc8161.pdf
[26] www.arduino.cc/en/Guide/Environment
[27] www.arduino.cc/en/Reference/HomePage
Anexa
Microcontrolerul ATmega328
Features:
• High Performance, Low Power AVR® 8-Bit Microcontroller
• Advanced RISC Architecture
– 131 Powerful Instructions – Most Single Clock Cycle Execution
– 32 x 8 General Purpose Working Registers
– Fully Static Operation
– Up to 20 MIPS Throughput at 20 MHz
– On-chip 2-cycle Multiplier
• High Endurance Non-volatile Memory Segments
– 4/8/16/32K Bytes of In-System Self-Programmable Flash progam memory
(ATmega48PA/88PA/168PA/328P)
– 256/512/512/1K Bytes EEPROM (ATmega48PA/88PA/168PA/328P)
– 512/1K/1K/2K Bytes Internal SRAM (ATmega48PA/88PA/168PA/328P)
– Write/Erase Cycles: 10,000 Flash/100,000 EEPROM
– Data retention: 20 years at 85°C/100 years at 25°C
– Optional Boot Code Section with Independent Lock Bits
In-System Programming by On-chip Boot Program
True Read-While-Write Operation
– Programming Lock for Software Security
• Peripheral Features
– Two 8-bit Timer/Counters with Separate Prescaler and Compare Mode
– One 16-bit Timer/Counter with Separate Prescaler, Compare Mode, and Capture.
Mode
– Real Time Counter with Separate Oscillator
– Six PWM Channels
– 8-channel 10-bit ADC in TQFP and QFN/MLF package
Temperature Measurement
– 6-channel 10-bit ADC in PDIP Package
Temperature Measurement
– Programmable Serial USART
– Master/Slave SPI Serial Interface
– Byte-oriented 2-wire Serial Interface (Philips I2C compatible)
– Programmable Watchdog Timer with Separate On-chip Oscillator
– On-chip Analog Comparator
– Interrupt and Wake-up on Pin Change
• Special Microcontroller Features
– Power-on Reset and Programmable Brown-out Detection
– Internal Calibrated Oscillator
– External and Internal Interrupt Sources
– Six Sleep Modes: Idle, ADC Noise Reduction, Power-save, Power-down, Standby,
and Extended Standby
• I/O and Packages
– 23 Programmable I/O Lines
– 28-pin PDIP, 32-lead TQFP, 28-pad QFN/MLF and 32-pad QFN/MLF
• Operating Voltage:
– 1.8 – 5.5V for ATmega48PA/88PA/168PA/328P
• Temperature Range:
– -40°C to 85°C
• Speed Grade:
– 0 – 20 MHz @ 1.8 – 5.5V
• Low Power Consumption at 1 MHz, 1.8V, 25°C for ATmega48PA/88PA/168PA/328P:
– Active Mode: 0.2 mA
– Power-down Mode: 0.1 μA
– Power-save Mode: 0.75 μA (Including 32 kHz RTC).
Tabel sumar cu spațiul memoriilor:
Copyright Notice
© Licențiada.org respectă drepturile de proprietate intelectuală și așteaptă ca toți utilizatorii să facă același lucru. Dacă consideri că un conținut de pe site încalcă drepturile tale de autor, te rugăm să trimiți o notificare DMCA.
Acest articol: Comanda Unui Robot Mobil Prin Intermediul Interfetei Bluetooth (ID: 111720)
Dacă considerați că acest conținut vă încalcă drepturile de autor, vă rugăm să depuneți o cerere pe pagina noastră Copyright Takedown.
