Consideratii Privind Automatizarea

INTRODUCERE

Punctul de plecare al acestei lucrări de licență îl reprezintă tendința de automatizare pe scară din ce în ce mai largă în întreaga lume și în toate domeniile. Fiecare domeniu desfășoară o anumită activitate ce urmărește satisfacerea nevoilor individuale cu un efort depus cât mai mic. Pornind de la această idee, conform căreia automatizarea se desfășoară în fiecare domeniu am construit un sistem electromecanic compus dintr-o structură mecanică (un braț robotic) și un controler care acționează sistemul, iar comandat este realizată cu ajutorul unui smartphone Android prin tehnologia bluetooth.

Roboții sunt realizați utilizând combinația disciplinelor mecanică, electronică și

informatică, rezultând din combinația acestora mecatronica. Pentru realizarea de sisteme autonome este necesară legătura dintre mai multe discipline de robotică. Dezvoltarea electronicii din secolul al XX-lea a adus cu sine și o dezvoltare a roboticii. Oamenii de știința afirmă că într-o jumătate de secol roboții ar putea să ne ajungă din urmă în ceea ce privește complexitatea organismelor vertebrate. Aici se pune accent și pe legătura conceptelor de inteligență artificială sau neuroinformatică, care este parte a informaticii.

Sistemele care implementează algoritmi de control devin din ce în ce mai complexe, beneficiază de un consum redus de energie și au o flexibilitate sporită care permite extinderea funcționalității în mod continuu și creșterea acurateței controlului. Circuitele logice programabile vin în întâmpinarea acestor cerințe, permițând integrarea pe un singur chip atât a algoritmilor de control, cât și a celorlalte funcții periferice și aceasta la viteze ridicate datorită executării în hardware a tuturor operațiilor. Un alt avantaj adus de circuitele logice programabile fiind și timpul scurt de dezvoltare și lansare pe piață a aplicației de control.

Lucrarea de licența este structurată în 5 capitole, și în fiecare capitol am încercat să descriu și să evidențiez diferite informații legate de secvența de programare folosită pentru controlul brațului robotic, echipamente folosite (servomotoarele, microcontrolerul, module suplimentare pentru control / comandă și de comunicare).

În primul capitol sunt descriși și clasificați roboții în general. Roboții, datorită tendinței de automatizare pe scară din ce în ce mai largă și în majoritatea domeniilor, ocupă un loc foarte important în evoluția societății în încercarea de a ușura și îmbunătăți munca omului.

Capitolul II prezintă partea de proiectare a brațului robotic care este împărțit în 3 diferite părți: – partea mecanică: piesele mecanice din aluminiu proiectate și desenate în cadrul programului de modelare geometrică 3D, SolidWorks 2015

– partea electrică: componentele electrice alese, aici se referă la actuatoare, microcontroler, modul bluetooth pentru comunicare serială, și la controlerul PWM al servomotoarelor

– partea de comandă : programarea microcontrolerului Arduino Uno și al driverului de servomotoare în limbajul C în programul Arduino IDE și programarea aplicației de comandă pe un sistem Android în limbajul Java cu ajutorul software-ului Android Studio.

În capitolul III sunt parcurse toate etapele ale simulării, și se prezintă modul de realizare a părților componente ale brațului în cadrul programului CAD numit SolidWorks.

În capitolul IV este prezentată realizarea practică a brațului, detailând elaborarea componentelor și asamblarea propriu-zisă. În ultimul subcapitol este prezentat aplicația de control, așa-numit „RoboControl”, și codul scris în limbajul Java este explicat în detalii.

Ultimul capitol prezintă modul de testare a robotului cu ajutorul unor mișcări predefinite și analiza erorilor.

CAPITOLUL 1. BRAȚUL ROBOTIC

1.1. Istoric

Dezvoltarea sistemelor robotizate :

În 1941-1942 scriitorul american Isaac Asimov a formulat cele trei legi ale roboticii, care era un concept revoluționar la acea vreme.

Cele 3 legi sunt: – 1. Un robot nu are voie să cauzeze vreun rău unei ființe umane, sau, prin neintervenție, să permită ca unei ființe umane să i se facă un rău.

– 2. Un robot trebuie să se supună ordinelor date de către o ființă umană, atât timp cât ele nu intră în contradicție cu Legea 1.

– 3. Un robot trebuie să-și protejeze propria existență, atât timp cât acest lucru nu intră în contradicție cu Legea 1 sau Legea 2.

La începutul anilor 1950, in laboratoarele nucleare din Franța și apoi, în SUA se construiesc primele instalații de teleoperare, concepute pentru manipularea materialelor radioactive în zone expuse radiațiilor. Tehnica mecanismelor articulate din aceste instalații este dezvoltată mai departe, prin înlocuirea comenzii și acționării de către om, cu utilizarea calculatoarelor și a acționării hidraulice. [1]

George Devol proiectează în 1954 primul robot acționat și programat digital, depune brevetul de invenție în SUA în 1956 și îl realizează, împreună cu inginerul Joseph Engelberger, creatorul primului robot UNIMATE a firmei UNIMATION (cu acționare hidraulică). Robotul UNIMATE era instalată în anul 1961 într-o instalație la General Motors în Trenton, New Jersey, pentru a ridica piese fierbinți din metal. Robotul lui Devol reprezintă baza industriei robotice moderne. [3]

În anul 1966, inginerul mecanic norvegian Ole Molaug proiectează un braț robotic de vopsire pentru fabrica de mașini agricole TRALLFA din Bryne (Norvegia).

În 1973, Richard Hohn a dezvoltat pentru corporația Cincinnati Milacron. Robotul a fost denumit “The Tomorow Tool” sau ”T3”, și a fost primul robot industrial disponibil comercial, controlat de un microcomputer și este un exemplu de braț robotic articulat care se aseamănă cel mai mult cu brațul uman. [4]

În 1974 manipulatorul ASEA IRB a fost construit de Björn Weichbrodt, Ove Kullberg, Bengt Nilsson și Herbert Kaufmann și a fost fabricat de compania ASEA în Suedia. În 1975 compania ASEA a lansat IRB6, care a fost primul robot din lume complet acționat electric și controlat de un microprocesor, folosind primul chipset Intel. Robotul IRB6 a permit deplasarea în 5 axe, cu o capacitate de ridicare de 6 kg. [5]

La începutul anilor ‘80, firma UNIMATION construiește cu ajutorul companiei GENERAL MOTORS, robotul PUMA (“Programable Universal Machine for Assembly”, adică ”Mașina Universală Programabilă pentru operații de Asamblare”).

Primul robot de tip SCARA (Selective Compliance Assembly Robot Arm) a fost creat în anul 1978, în laboratorul profesorului Hiroshi Makino, la Universitatea Yamanashi, Japonia. Cel mai bun robot folosit pentru ridicarea pieselor și plasarea lor într-o altă locație, SCARA a fost introdus la liniile de asamblare în 1981. [7]

În anii '90 se remarcă o stagnare a sporirii aplicațiilor robotizate – datorită unor circumstanțe economice, mai ales în Japonia – cât și “saturarea” din punct de vedere științific al roboticii industriale.

După anii ’90 cu dezvoltarea electronicii și cu apariția circuitelor integrate mai avansate, s-a dezvoltat și tehnologia prin care se fac brațele robotice industriale, mai ales în procesele de fabricare și în biomedicină.

1.2. Tipuri de roboți industriali

Clasificarea roboților industriali se poate face după :

sursa principală de putere pentru acționare: – pneumatic, electric, hidraulic

comanda mișcării: – punct cu punct sau fără comandă de viteză (continuă sau discontinuă

– comanda pe traiectorie continuă

modele de programare: – prin învățare directă

prin generare de traiectorie

off-line

tipuri de senzori folosiți: – detectori de poziție

logica liniară simplă

senzori de semnale proporționale cu abaterea [8 ]

Clasificarea roboților după forma spațiului de lucru:

Braț robotic cartezian / fixat (cartesian / gandry robot arm): Este folosit pentru operații pick & place, aplicarea materialelor de etanșare, operațiile de asamblare, și pentru manipularea mașinilor-unelte de sudare cu arc electric. Este un robot al cărui braț are trei articulații prismatice, ale căror axe coincid cu un coordonator cartezian.

Braț robotic cilindric (cylindrical robot arm): Folosit pentru operațiuni de asamblare, manipularea mașinilor-unelte, de sudare, și pentru manipulare la mașini de turnat sub presiune. Este un robot ale căror axe formează un sistem de coordonate cilindric.

Braț robotic sferic / polar (spherical / polar robot arm): (cum ar fi și Unimate de exemplu) Acest tip de robot este folosit pentru manipularea mașinilor-unelte, sudare, turnat sub presiune.

Este un robot ale căror axe formează un sistem de coordonate polare.

Braț robotic de tip SCARA (SCARA robot arm): Este utilizat pentru operații pick & place, operațiile de asamblare, aplicarea materialelor de etanșare și pentru manipularea mașinilor-unelte. Acest robot are două articulații rotative paralele, pentru a asigura conformitatea într-un plan.

Braț robotic articulat (Articulated / jointed robot arm): Folosit pentru diferite aplicații: operații de asamblare, manipulare la mașini de turnat sub presiune, operații de sudări cu gaz, cu arc electric și vopsire prin pulverizare. Este un robot al cărui braț are cel puțin trei articulații rotative. Acest tip de robot este similar cu configurația unui braț uman. Se compune dintr-o coloană verticală, care pivotează cu privire la baza folosind un T-comun. articulația umărului (R-comun) este situat în partea superioară a coloanei. Elementul (legătura) de ieșire este o articulație de cot (o altă articulație R). [10]

Având în vedere că în lucrarea această de licență acest tip de robot este analizat și proiectat, o să intru în detalii cu explicarea câtorva concepte (definiții) fundamentale, care nu pot fi neglijate:

Grade de libertate – GDL (în engleză: Degrees Of Freedom – DOF): Numărul de mișcări independente în care efectorul final se poate deplasa, definită de numărul de axe de mișcare a manipulatorului. De exemplu, un punct situat într-un plan are două grade de libertate pentru translație, X și Y.

Acoperire/ întindere maximă (full reach): este lungimea măsurată din centrul robotului în cea mai mare extindere a brațului. La proiectarea unui braț robotic articulat prima dată trebuie să luăm în considerare această lungime și să calculăm cât mai precis ca să fie optimă pentru aplicația respectivă.

Sarcină utilă (payload): Sarcina utilă maximă este cantitatea de greutate transportată de manipulatorul robotului la viteză redusă menținând în același timp precizia nominală. Sarcina utilă nominală este măsurată la viteza maximă, menținând în același timp precizia nominală. Aceste evaluări depind în mare măsură de mărimea și forma sarcinii utile.

Cu alte cuvinte sarcina utilă este de fapt capacitatea de încărcare care poate fi categorizat după greutatea sarcinii: foarte ușori (<10 N), ușori (<100 N), mijlocii (<2000 N), grei (<10000 N), foarte grei (>10000 N).

La proiectare aceasta este caracteristică foarte importantă, care împreună cu întinderea maximă definesc construcția brațului robotic. După determinarea sarcinii utile maxime putem alege actuatoarele pe care vrem să le folosim și putem dimensiona piesele metalice de legătură.

Precizia (accuracy): Diferența dintre poziția reală și punctul pe care robotul încearcă să obțină. Precizia absolută este diferența dintre un punct instruit de către sistemul de control al robotului și punctul atins efectiv de către brațul manipulatorului, în timp ce repetabilitatea este variația ciclu la ciclu al brațul manipulatorului atunci când ajunge în același punct.

Precizia bună depinde de mai mulți factori, de exemplu.: rigiditatea construcției robotului împotriva inerției (deci cum reacționează brațul la o pornire / oprire bruscă), precizia motoarelor de acționare pe care le folosim (servo, pas cu pas , motor de c.c. etc.).

Precizia nu se confundă cu rezoluția sistemului, care este o altă caracteristică specifică!

Rezoluția (resolution): Cea mai mică incrementare de pas sau distanță, care poate fi detectată sau controlată de sistemul de control al unui braț robotic. Rezoluția oricărei articulații este în funcție de impulsuri pe rotație și raportul de antrenare, și depinde de distanța dintre punctul central și axa articulației.

Repetabilitate (repeatability): Capacitatea unui mecanism (în acest caz: braț robotic) de a repeta aceeași mișcare sau de a atinge aceleași puncte atunci când este controlat cu aceleași semnale de control.

Viteza maximă (maximum speed): Viteza maximă este calculat atunci când, vârful robotului se deplasează la extensie completă cu toate îmbinările care se deplasează simultan în direcții complementare. Pentru aplicații critice, cel mai bun indicator al timpului de ciclu este o simulare fizică.

Ciclu pick & place (pick & place cycle): Acest indicator este timpul, în secunde, pentru a executa următoarea secvență de mișcare: Deplasează în jos un inch (2.54 cm), prinde o sarcină utilă nominală, deplasează în sus un inch, deplasează lateral douăsprezece inci, deplasează în jos un inch, eliberează sarcina și deplasează în sus un inch pentru a reveni la starea de pornire.

Spațiul de lucru (work envelope): O formă tridimensională care definește limitele pe care manipulatorul robotului poate ajunge. [11]

Mai sunt și alți indicatori care caracterizează un întreg sistem robotic, dar cele menționate mai sus sunt cele mai importante.

1.3 Aplicații

Care sunt aplicațiile unui braț robotic industrial?

În cazul în care avem nevoie de un avantaj competitiv în procesul de fabricație, avem nevoie de un braț robotic industrial.

Practic, un braț robotic este destinat pentru orice muncă omenească, – iar dacă punem în funcțiune pentru lucruri specifice, robotul trebuie să fie echipat cu capul necesar, de exemplu: burghiu, manipulator, cameră video, pistolet sudură, pistol de lipit și etc.

Brațele robotice industriale pot fi echipate pentru aplicații multiple, pentru sudură, manipularea materialelor, pulverizarea termică, pentru foraj și vopsire.

1.4. Analiza soluțiilor

Eu am ales pentru lucrarea de diplomă brațul robotic articulat cu 6 grade de libertate (6 DOF). Această alegere am făcut-o din mai multe motive. În primul rând ca să explic alegerea mea trebuie să compar cu mai multe tipuri de brațe existente.

Principalul dezavantaj al brațului cartezian este faptul că acesta necesită un volum mare de spațiu pentru funcționare, și nici nu este utilizat spațiul în întregime, iar brațul robotic articulat este capabil să utilizează spațiul întreg de funcționare.

Brațul robotic de tip SCARA este o alegere optimă pentru manipularea mărfurilor, dar nu este flexibilă ca alte tipuri de roboți.

Spre deosebire de un robot cu șase axe, un robot de tip SCARA este mult mai limitat în mișcare. Roboții tip SCARA sunt înalți, așa că ei au nevoie de un loc de trecere destul de mare. Prin urmare roboții tip SCARA nu pot fi folosiți pentru aplicații de inserare și recuperare. [13]

Brațul robotic articulat cu 6 GDL este tipul care seamănă cel mai mult cu brațul uman prin urmare este capabilă să înlocuiască lucruri, să efectueze mișcări și gesturi omenești.

CAPITOLUL 2. PROIECTAREA BRAȚULUI ROBOTIC

2.1. Partea mecanică

Sistemul mecanic sau partea mecanică al unui robot are rolul să asigure realizarea mișcărilor acestuia și transmiterea energiei mecanice necesare interacțiunii cu mediul înconjurător. Cu alte cuvinte să aibă energia necesară pentru a deplasa un obiect.

Componenta din sistemul mecanic care realizează această deplasare se numește manipulator sau dispozitiv de ghidare.

Se înțelege prin manipulare modificarea situării în spațiu al unui obiect. Manipularea obiectului se realizează prin modificarea poziției efectorului.

Situarea, adică poziția unui corp în spațiul tridimensional este definită cu ajutorul poziției punctului caracteristic, și orientărilor dreptei caracteristice, respectiv a dreptei auxiliare.

Punctul caracteristic și dreapta caracteristică / auxiliară la un obiect cilindric se reprezintă astfel :

Se înțelege prin:

Punct caracteristic, un punct al obiectului, folosit pentru definirea poziției acestuia.

Dreapta caracteristică este o dreaptă care trece prin punctul caracteristic.

Dreapta auxiliară o dreaptă perpendiculară în punctul caracteristic pe dreapta caracteristică [14].

Calcularea cuplului necesar (Torque calculation)

Cum este prezentat mai înainte în Capitolul 1, unul dintre cei mai semnificativi caracteristici al unui braț robotic este sarcina utilă. În general procedura de proiectare începe cu definirea sarcinii utile, și apoi se aleg motoarele cu cuplu suficient de mare. În cazul meu procedura de proiectare este inversă, din cauză că nu fac acest robot pentru a fi folosit în procesele industriale, ci pentru a fi utilizat la aplicații mai mici.

Dar totuși indiferent de mărimea brațului robotic, neapărat trebuie calculat cuplul necesar pentru fiecare motor. Pentru aceste calcule am folosit un calculator așa numit ”Robot Arm Torque Calculator” pe care am găsit pe site-ul http://robotshop.com.

Acest calculator de cuplu este destinat pentru alegerea motorului (actuatorului) potrivit pentru fiecare articulație (joints) a brațului robotic.

Cuplul (T) necesar la fiecare articulație este calculat pentru situația cea mai nefavorabilă (ridicarea greutății la 90 de grade).

În continuare sunt prezentate modelele matematice și fizice, ca și noțiuni teoretice, pe care se bazează calculatorul de cuplu. Mărimile fizice sunt notate după terminologia engleză:

T (torque): cuplul [Nm, dar în cazul servomotoarelor sunt date în kgcm]

F (force): forța [N]

W (object’s weight): greutatea obiectului [N]

L (length from pivot to pivot): lungimea de la o articulație la articulație [cm]

M (link mass): masa legăturii [kg]

A (actuator mass): masa actuatorului (în cazul meu masa servomotorului) [kg]

A1 (load mass): greutatea sarcinii utile [kg]

Punctul pivot este de fapt un punct de articulație.

Cuplul (T) este definit ca o "forță" de răsucire și se calculează folosind următoarea relație:

T=F*L

Forța (F) acționează la o lungime (L) dintr-un punct de pivot. Într-un plan vertical, forța care acționează asupra unui obiect (determinându-l să scadă) este accelerația gravitațională (g = 9.81 m/s2) înmulțit cu masa:

F=m*g

Forța de mai sus este considerată ca și greutatea obiectului (W): W=m*g

Cuplul trebuie să mențină o masă la o anumită distanță de la un punct pivot deci relația este următoarea: T= (m*g)*L

Reținem că lungimea L este lungimea perpendiculară de la punctul pivot la forță F.

Pentru a estima cuplul necesar la fiecare articulație, trebuie să alegem cazul cel mai defavorabil. În Fig 2.4, o legătură de lungime L este rotită în sens orar. Numai componenta perpendiculară lungimii între pivotul și forța este luată în considerare.

Putem observa că distanța scade de la L3 la L1 (L1 fiind 0).

Având în vedere că ecuația de cuplu este lungimea (distanța) înmulțit cu forța, cea mai mare valoare va fi obținută cu utilizând L3 (F nu se schimbă).

Servomotoarele vor fi supuse la cel mai mare cuplu atunci când brațul este întins orizontal.

Greutatea obiectului A1 ("sarcina"), când este ridicat, înmulțită cu distanța dintre centrul de masă și cu pivotul dă cuplul necesar pentru pivotul respectiv. Calculatorul ia în considerare că legăturile au greutăți diferite și presupune că centrul de masă este situat la mijlocul lungimii.

Trebuie adăugate cuplurile rezultante de aceste mase diferite:

T1=L1*A1+1/2*L1*W1

Greutatea motorului A2 așa cum este prezentat în Fig. 2.5., nu este inclusă în calculul cuplului de la acel moment.

Acest lucru se datorează faptului că lungimea dintre centrul de greutate și punctul de pivotare este zero. În mod similar, atunci când se calculează cuplul necesar pentru motorul A3, nu este considerată masa sa proprie.

Cuplul necesar la a doua articulație trebuie recalculat cu lungimi noi, după cum se vede în Fig. 2.5.

Cuplul T2 se calculează conform relației următoare:

T2=L5*A1+L4*W1+L3*A2+L6*W2

Știind că greutatea legăturilor (W1, W2) se află în centrul lungimilor și distanțele dintre actuatoare (L1 și L3 în Fig.) se poate rescrie ecuația de mai sus:

T2=(L1+L3)*A1+(0.5*L1+L3)*W1+L3*A2+(0.5*L3)*W2

Dacă ne ocupăm cu această temă în mod mai avansat, trebuie să luăm în considerare că ecuațiile de mai sus sunt valabile numai în cazul în care brațul robotului este întins orizontal și nu este în mișcare.

Pentru deplasarea brațului dintr-o poziție de repaus, este necesară o accelerare. Pentru a rezolva problema cu acest cuplu adăugat, este cunoscut faptul că suma cuplurilor care acționează într-un punct de pivotare este egală cu momentul de inerție (notat cu I) înmulțit cu accelerația unghiulară (notat cu alpha – α): T=I*α

Pentru a calcula cuplul suplimentar, suficient pentru a deplasa brațul (adică pentru a creea o accelerație unghiulară) se calculează momentul de inerție al părții respective de la capăt la punctul de pivotare utilizând ecuația: I=(m*r2) / 2

Aici "r" reprezintă distanța de la centrul de masă până la punctul pivot.

Rezultând din ecuațiile mai sus, cuplul necesar pentru a accelera (când greutatea este ridicată de către un element de acționare) dintr-o poziție statică poate fi calculată utilizând următoarea relație:

∑TN=TN(static)+ TN(mișcare) [15]

În cazul meu lanțul cinematic al brațului robotic este prezentat în Fig. 2.6:

O scurtă explicație pentru figura de mai sus:

A1: masa sarcinii utile (masa obiectului de ridicat)

A2: masa servomotorului „Gripper”

A3: masa servomotorului „Wrist360”

A4: masa servomotorului „Wrist”

A5: masa servomotorului „Elbow”

A6: masa servomotorului „Shoulder” (dar aceasta nu luăm în considerare)

L1-L5 sunt lungimile legăturilor respective între articulații (între punctele pivot) și cu M1-M5 sunt notate masele legăturilor respective.

În acest calculator este calculat masa maximă a obiectului de ridicat care este notat cu A1, care este prezentat în Fig. 2.7. în chenar albastru. Pe figura se vede că masa unui servomotor este 55 de grame. Pornind din faptul că cuplul activ a unui servomotor MG995 este aproape 13 kg·cm la 6 V, iar cuplul motorului Power HD1501MG este în jur de 17 kg·cm, am setat calculatorul de cuplu astfel încât să fie T4 (servomotorul Elbow) egală cu maxim 17 kg·cm.

Cuplul activ cel mai mare este dezvoltat de către cele două servomotoare Shoulder care au rolul de a ridica brațul întreg.

Prin urmare cuplul T5 împărțit la 2 (pentru că avem 2 motoare sincronizate pentru dezvoltarea acestui cuplu) este mai mică decât cuplul unui singur motor.

Cu datele particularizate prezentate pe Fig. 2.7 se vede că masa maximă a sarcinii utile poate să fie 540 de grame, adică 0.540 kilograme.

2.2. Partea electrică

Partea electrică a brațului robotic este conceput astfel încât să realizabil la un preț acceptabil dar să funcționează cât mai performant.

În primul rând aspectele pe care am luat în considerare în procesul proiectării, sunt următoarele:

servomotoarele alese să aibă cuplul necesar, calculată cu ajutorul calculatorului de cuplu (Robot Arm Torque Calculator)

roțile dințate a servomotoarelor să fie făcute din metal

dimensiunile și masele motoarelor să fie cât mai mici dar să aibă cuplul suficient

servomotoarele să se poate roti 180˚ și 360˚ de grade

controlerul PWM să fie optim pentru servomotoarele TowerPro MG995 și Power HD1501MG și să aibă minim 8 canale

tensiunea de alimentare a driverului să fie între 4.8 și 6 V cu un curent de 2 A.

driverul servo să fie compatibil cu microcontrolerul Arduino Uno și să comunice serial cu acesta

modulul bluetooth să fie compatibilă cu placa Arduino Uno și să aibă o viteză de prelucrare ridicată, pentru a primi numerele trimise cât mai repede

În continuare este prezentat și detaliat fiecare component electric care face parte din brațul robotic.

2.2.1. Despre servomotoare. Servomotorul TowerPro MG995

Pentru a înțelege în totalitate modul în care funcționează un servomotor, trebuie să ne uităm ce este sub carcasa unui astfel de motor. În interior carcasei este un simplu ansamblu: un motor de curent continuu, un potențiometru, și un circuit de comandă.

Motorul este atașat cu roți dințate la roata de control. În timp ce motorul se rotește, rezistența potențiometrului se schimbă, astfel încât circuitul de comandă poate regla cu precizie cât de mare să fie mișcarea care s-a făcut și în ce direcție.

Când axul motorului se află în poziția dorită, puterea furnizată motorului este oprită.

Poziția dorită este trimis prin impulsuri electrice (semnale PWM-Pulse Width Modulation) prin firul de semnal (firul portocaliu).

Viteza motorului este proporțională cu diferența dintre poziția reală și poziția dorită.

Deci dacă motorul este aproape de poziția dorită, se va roti încet, în caz contrar se va roti rapid. Aceasta se numește control proporțional.

Acest lucru înseamnă că motorul va rula doar atât de tare cât este necesar pentru a realiza mișcarea dorită, deci putem spune că este un motoraș foarte eficient.

Servomotorul este asociat cu un anumit tip de traductor (encoder) pentru a asigura poziția și feedback-ul de viteză. Servomotoare mai ieftine folosesc ca encoder un potențiometru rezistiv (ca și MG995).

Acest tip de servomotor nu este utilizat pe scară largă în aplicații industriale pentru controlul mișcării, dar formează baza motoarelor simple și ieftine.

Servomotoare mai sofisticate folosesc encodere rotative optice pentru măsurarea vitezei la arbore și o unitate de control cu viteză variabilă pentru a controla viteza motorului [17].

Aceste îmbunătățiri, de regulă în combinație cu un algoritm de PID control, permit ca servomotorul să fie adus în poziția comandată mai rapid și mai precis, cu mai puține depășiri (overshooting). [18]

Precum s-a mai menționat, servomotoarele simple în cele mai multe cazuri utilizează potențiometre ca traductoare de poziție. Ele suferă de uzură și de zgomotul electric în traseul potențiometrului, care înseamnă erori.

Servomotoarele moderne și mai performante folosesc encodere rotative: absolute sau incrementale.

La cele mai multe cazuri, servomotoarele folosesc motor de c.c cu magneți permanenți cu perii , datorită simplității lor și costuri reduse. La servomotoare industriale mici sunt utilizate, de obicei motoare de c.c. fără perii (BLDC – Brushless DC).

Pentru servomotoare industriale mai mari, sunt utilizate motoare asincrone de curent alternativ, cu unitatea de control cu frecvență variabilă pentru a controlul vitezei lor.

În proiectul meu de diplomă am folosit 6 servomotoare TowerPro Mg995 (Fig. 2.9.) și un servomotor Power HD1501MG. Acest tip de servomotor este utilizat în aplicații robotice mai mici deoarece sunt ieftine dar au un cuplu foarte bun. Este un servo digital cu roți dințate metalice cum se vede și în Fig.2.10, care asigură un cuplu dezvoltat mai mare decât cele cu roțile dințate din plastic.

Circuitul de comandă este alcătuit din: 3 circuite integrate (2 dintre ele sunt punte H), condensatoare și rezistențe de tip SMD (montate pe suprafață), 2 tranzistoare, un regulator de tensiune de 3.3 V, un oscilator și un potențiometru care este de fapt traductorul de poziție.

Cele două IC-uri (lângă conexiunile motorului) conțin MOSFET-uri conectate într-o configurație completă punte H, astfel se poate inversa polaritățile motorului, deci se poate roti în ambele direcții.

Tranzistoarele amplifică tensiunea pentru a conduce MOSFET-uri în mod corespunzător, deci tensiunea să fie mai mult ca 3.3V, cu care se alimentează chip-ul.

2.2.2. Controlul PWM

Modulația impulsurilor în lățime (PWM) este o tehnică de modulare utilizată pentru a codifica un mesaj într-un semnal prin impulsuri. Această tehnică de modulare este utilizat des în următoarele aplicații:

controlul servomotoarelor

reglarea intensității luminoase a LEDurilor,

la surse de alimentare în comutație (Switch-Mode Power Supply, SMPS)

la amplificatoare de clasa D

etc.

Atunci când semnalul dreptunghiular este în starea „HIGH” (1) , acest lucru se numește "on time". Pentru a descrie cantitatea de "on time", se folosește conceptul „duty cycle”.

Duty cycle este măsurată în procente. Această perioadă este inversul frecvenței formei de undă. 100% duty cycle ar fi la fel ca setarea tensiunea la 5 volți (HIGH). 0% duty cycle ar fi la fel când semnalul este legat la masă (LOW). [15]

La controlul servomotoarelor există un puls minim, un puls maxim, și o rată de repetiție.

Un servomotor, de obicei, se poate roti numai cu 90 de grade în ambele direcții, pentru un total de 180 de grade de circulație.

Poziția neutră a servomotorului este definit ca poziția în care servo are același potențial de rotație în sens orar și în sens antiorar.

Semnalul PWM trimis la motor determină poziția arborelui, și se bazează pe durata impulsului transmis prin firul de comandă și rotorul se va deplasa la poziția dorită.

Servomotorul tot timpul așteaptă un impuls în fiecare 20 milisecunde (ms), iar lungimea pulsului va determina cât de mult se va roti axul motorului [20].

De exemplu, cu un impuls de 1.5 ms axul motorului va deplasa în poziția de 90 de grade.

Dacă durata impulsului este mai mică decât 1.5 ms se mută la 0 grade, și dacă este mai mare decât 1.5 ms și întinde spre 2 ms, axul motorului se va deplasa în poziția de 180 de grade, așa cum este prezentat în Fig. 2.14.

2.2.3 Microcontrolerul Arduino UNO

Placa de dezvoltare Arduino Uno este un microcontroler bazat pe chipul Atmega328.

Are 14 pini digitale de intrare / ieșire (dintre care 6 pot fi utilizate ca ieșiri PWM), 6 intrări analogice, un oscilator cu cuarț de 16 MHz, port USB, o mufă de alimentare, conexiune ICSP In-Circuit Serial Programming), și un buton de resetare.

Arduino Uno poate fi alimentat prin intermediul conexiunii USB sau cu o sursă de alimentare externă. Sursa de alimentare mai optimă este selectată în mod automat.

Puterea externă (non-USB) poate veni, fie de la un redresor (adaptor de AC/DC) sau de la baterie.

Adaptorul poate fi conectat prin conectarea unui ștecher de 2.1 mm cu centru-pozitiv în mufa de alimentare a plăcii. Firele bateriei pot fi introduse în GND și Vin.

Placa poate funcționa cu o sursă externă de 6 până la 20 de volți. În cazul în care este alimentat cu mai puțin de 7 V, cu toate acestea, pinul de 5 V poate furniza mai puțin de 5 volți și alimentarea plăcii poate fi instabilă. În cazul în care alimentăm cu mai mult decât 12 V, regulatorul de tensiune se va supraîncălzi și se poate deteriora placa. Intervalul recomandat este de 7 până la 12 volți.

Pinii de alimentare sunt următoarele:

Vin: Tensiunea de intrare la placa Arduino când folosește o sursă de alimentare externă

5V: Alimentarea cu tensiune stabilizată, utilizat pentru a alimenta microcontrolerul și alte componente de pe placă.

3V3: O sursă de 3,3 volți generată de regulatorul de tensiune „on-board”. Consumul maxim de curent este 50mA.

GND: masa

Pinii de intrare/ieșire (I/O pins)

Fiecare dintre cei 14 pini digitale pe Uno pot fi utilizați ca intrare sau ieșire, folosind funcțiile „built-in”: pinMode (), digitalWrite () și digitalRead ().

Acestea funcționează la 5 V și fiecare pin poate furniza sau primi un curent maxim de 40 mA și

are o rezistență de ridicare la 1 (pull-up resistor) internă (deconectat inițial) de 20-50 kΩ.

Câțiva pini au funcții speciale:

Serial: 0 (RX) și 1 (TX). Este folosit pentru a primi (RX) și transmite date seriale (TX) TTL. Aceste pini sunt conectate la pinii corespunzătoare ale ATmega8U2 chip.

Întreruperile externe: 2 și 3. Acești pini pot fi configurate pentru a declanșa o întrerupere la o valoare 0 (LOW) sau la modificarea valorii. (funcția attachInterrupt())

PWM (~): 3, 5, 6, 9, 10 și 11. 6 ieșiri PWM de 8 biți cu ajutorul funcției analogWrite ().

Interfața serială SPI: 10 (SS-Slave Select), 11 (MOSI-Master Output, Slave Input), 12 (MISO- Master Input, Slave Output), 13 (SCK – Serial Clock). Acești pini suportă comunicare SPI.

LED: 13. Există un „built-in” LED conectat la pinul digital 13. Atunci când PIN-ul are valoarea 1, LED-ul este aprins și atunci când PIN-ul este în starea 0, este stins.

Placa Arduino Uno are 6 intrări analogice (A0-A5), fiecare dintre ele oferă o rezoluție de 10 biți (1024 valori diferite).

I2C (Inter-Integrated Circuit): Magistrala I2C este compusă din două linii: A4 (SDA-Serial Data Line) și A5 (SCL-Serial Clock Line). Suportă comunicarea serială folosind biblioteca Wire.h.

AREF (Analog reference): Tensiunea de referință pentru intrări analogice. Folosit cu funcția analogreference().

Reset: Conectând acest pin la masă (GND) se poate reseta microcontrolerul [22].

2.2.4. PCA9685 PWM servo shield cu 16 canale

Controlul motoarelor servo cu biblioteca Arduino Servo este destul de ușor, dar fiecare dintre ele consumă un curent mai mare decât cel pe care Arduino poate furniza.

Cu driverul servo PWM cu 16 canale se poate controla simultan 16 servomotoare cu ajutorul I2C cu doar 2 pini conectate la Arduino.

PIN-ul VCC este doar pentru alimentarea cipului.

Este recomandat conectarea puterii prin intermediul blocului terminal albastru deoarece este protejat în cazul polarității inverse.

Cele mai multe servomotoare sunt concepute pentru a funcționa la aproximativ 5 sau 6 V. Având în vedere că în multe cazuri la brațul robotic servomotoarele funcționează simultan, curentul absorbit poate fi de câteva sute de mA.

Servomotoarele cu cuplu mai mare vor absorbi mai mult de 1A sub sarcină în timpul deplasării. Pentru brațul robotic cu 7 servomotoare trebuie măsurat curentul absorbit sub sarcină pentru fiecare motor.

După măsurarea curenților am constatat că curentul maxim absorbit de un servomotor în deplasare este în jur de 450-500 de mA. Dacă robotul face o mișcare mai complexă, unde se mișcă minim 5 motoare, curentul absorbit este peste 2,5 A.

Putem trage concluzia că avem nevoie de o sursă de alimentare cu un curent de ieșire de 3 A și cu tensiunea 5-6 V.

Nu este recomandată utilizarea pinului 5V din Arduino pentru a alimenta servomotoarele, deoarece placa devine instabilă, funcționează haotic și se produc zgomote electrice și căderi de tensiune sau în cazul cel mai rău placa se poate încălzi și deteriora.

Este un loc pe placă pentru un condensator electrolitic. În funcție de utilizare, este posibil să

nu avem nevoie de condensator. Dacă vrem să alimentăm o mulțime de motoare de la o sursă de alimentare, trebuie să luăm în considerare căderile de tensiune, deci este recomandat lipirea unui condensator cu valoarea n*100uF, unde „n” este numărul de servomotoare.

În proiectul meu am nevoie de 7 motoare deci am ales un condensator de 1000 uF (10 V) pentru că această valoare nominală este cea mai apropiată care este pe piață.

Calibrarea servomotoarelor:

Sincronizarea impulsurilor variază în funcție de diferite mărci și modele. Pentru controlul precis al poziției, trebuie calibrat minimul și maximul al lățimii impulsului.

Programarea trebuie făcută cu grijă la reglarea SERVOMIN și SERVOMAX. Depășind limitele fizice ale traseului poate deteriora permanent motorul și roțile dințate.

Conversia de la grade la lungimea impulsului se face cu funcția built-in map()

care este o modalitate ușoară de a converti grade de rotații în lungime a impulsurilor calibrate minimul și maximul cu SERVOMIN, respectiv SERVOMAX.

Dacă pentru un servo tipic cu 180 de grade de rotație este calibrat SERVOMIN în poziția 0 grade și SERVOMAX în poziția de 180 de grade, se poate converti orice unghi între 0 și 180 de grade corespunzătoare cu lungimea impulsului. Ca urmare linia de cod arată așa:

pulselength= map(degrees, 0, 180, SERVOMIN, SERVOMAX)

Funcția setPWMfreq(freq)

Această funcție poate fi utilizată pentru a regla frecvența PWM, care determină cât de multe impulsuri sunt generate pe secundă de către IC.

Frecventa este importantă în PWM, deoarece setarea frecvenței la prea mare, cu un duty cycle foarte mic poate cauza probleme, deoarece "timpul de creștere" a semnalului (timpul necesar pentru a ajunge de la 0V la VCC) poate să fie mai mare decât în momentul în care semnalul este activ, iar la ieșirea PWM va apărea atenuare și poate nici măcar nu ajunge la VCC, care poate provoca o serie de probleme.

Argumentul funcției freq reprezintă frecvența în Hz, și este între 40 și 1000.

Funcția setPWM(channel, ON, OFF)

Această funcție setează începutul (ON) și sfârșitul (OFF) din segmentul superior al semnalului PWM pe o anumită canal.

Specificând două valori între 0÷4095 putem controla începutul și sfârșitul semnalului.

Canalul indică care dintre cele 16 ieșiri PWM ar trebui să fie actualizate cu noile valori.

Argumentele funcției:

channel: ieșirea PWM pe care ar trebui să fie actualizate cu noile valori

ON: valoarea (între 0..4095) atunci când semnalul ar trebui să facă tranziția de la LOW la HIGH

OFF: valoarea (între 0..4095) atunci când semnalul ar trebui să facă tranziția de la HIGH la LOW [23]

Concluzia este că la o aplicație unde vrem să folosim mai multe servomotoare (până la 992!) putem alege acest driver pentru că dimensiunile sunt destul de mici, nu consumă mult și este ușor de programat.

2.2.5. Modulul bluetooth HC-06

Seria experimentelor cu diverse module și o placă de dezvoltare (compatibilă) Arduino a ajuns la modulul bluetooth în varianta ieftină, tip HC-06.

Acest modul permite orice microcontroler cu un standard port serial RS232 pentru a comunica cu un PC sau un cu un smartphone echipat cu un modul master Bluetooth.

Specificații:

Bluetooth Număr: FC-114 – HC-06, cu montare pe suprafață cu antenă integrată.

Tensiune de operare: 5 volți, redus la 3,3 volți

Curent: în timpul operării: 8 mA, în timpul conectării: 30 mA

Chip integrat: BC417

Frecvența: 2.47 GHz

Memoria flash: 8 Mbit

Rata de transfer implicit (Baud rate): 9600 bps.

PIN implicit: 1234

Clasa: 2, cu o acoperire de până la 10 metri. [24]

Pinuri: – VCC este indicat în intervalul 3.6V-6V. Modulul a lucrat pentru mine cu ambele

3.3V și 5V.

– GND: masa

– TXD: ieșirea serială a modulului, care urmează să fie conectat la pinul RX la Arduino

– RXD: intrarea serială a modulului, care urmează să fie conectat la pinul TX la Arduino

Semnale RXD și TXD folosesc nivele logice de 3,3V.

2.3 Comenzii (Arduino IDE)

Arduino IDE (Integrated Development Environment) conține un editor de text pentru scrierea codurilor, o zonă de mesaj, o consolă de text, o bară de instrumente cu butoane pentru funcții comune și o serie de meniuri. Se conectează la hardware-ul Arduino pentru a încărca programe și de a comunica cu el.

Programele scrise utilizând software-ul Arduino (IDE) sunt numite schițe (sketches). Aceste schițe sunt scrise în editorul de text și sunt salvate cu extensia de fișier .ino.

Zona de mesaje ne dă feedback în timp ce salvează și exportează, prin urmare, afișează erori.

Colțul din dreapta jos al ferestrei afișează placa Arduino configurată și portul serial. Butoanele din bara de instrumente permit verificarea și încărcarea programe, de a crea, deschide, și de a salva schițe, și deschide monitorul serial (Serial Monitor).

Programarea microcontrolerului Arduino în IDE

Prima dată trebuie apelat biblioteca Wire.h , care permite microcontrolerului să comunice cu dispozitivele I2C/TWI (Two Wire Interface, în cazului Arduino Uno dispozitivul respectiv este chipul Atmega328P). Pe bordul Arduino R3, care este versiunea mai nouă, pinii SDA (linia de date) și SCL (linie de ceas) sunt lângă pinul AREF.

Hardware-ul Arduino are suportul built-in pentru comunicarea serială pe pinii 0 și 1 (care, de asemenea, merge la calculator prin conexiunea USB). Biblioteca SoftwareSerial.h a fost dezvoltat pentru a permite comunicarea serială pe alte pinii digitale ale Arduino.

Funcțiile implicite în biblioteca SoftwareSerial.h pe care am folosit sunt următoarele:

SoftwareSerial(rxPin, txPin): este utilizat pentru a crea o instanță a unui obiect SoftwareSerial

mySerial.begin (): permite începe comunicarea serială

mySerial.available(): obține numărul de octeți / bytes (caractere) disponibile pentru citirea dintr-un port serial

mySerial.read(): returnează un caracter care a fost primit de la pinul RX al portului serial

A treia bibliotecă care trebuie apelat în program este Adafruit_PWMServoDriver.h. Această bibliotecă este dedicat pentru driverul servo pe care am folosit pentru a controla brațul robotic.

Apelarea celor 3 biblioteci:

#include <Wire.h>

#include <SoftwareSerial.h>

#include <Adafruit_PWMServoDriver.h>

Inițializarea driverului PWM și declararea variabilelor care reprezintă defapt minimul și maximul al lungimii impulsului.

Adafruit_PWMServoDriver pwm1 = Adafruit_PWMServoDriver(0x40);

#define SERVOMIN 120

#define SERVOMAX 580

Variabile declarate pentru lung. de impulsuri a fiecărui servomotor:

int pulselen1, pulselen2, pulselen3, pulselen4, pulselen5, pulselen6;

Comunicarea serială cu modulul bluetooth HC-06 se face prin pinul 10 și 11:

int bluetoothTx = 10; //pinul Tx va fi pinul digital 10

int bluetoothRx = 11; //pinul Rx va fi pinul digital 11

După apelarea bibliotecilor și declararea variabilelor urmează funcția setup() care după rularea programului va rula numai o singură dată. În interiorul funcției setup() este inițializat rata baud pentru comunicarea serială:

Serial.begin(9600);

bluetooth.begin(9600);

pwm1.begin(); //inițializează cipul driverului servo

pwm1.setPWMFreq(60); //setează frecvența PWM

Frecvența ciclului de ceas este setat la 60 de Hz, deoarece majoritatea servomotoarelor funcționează cu o frecvență în intervalul [40÷200] Hz.

După rularea void setup() urmează bucla consecutivă void loop(), permițând programului să se schimbe și să răspundă în mod activ.

Arhitectura buclei void loop() arată în modul următor:

void loop() {

if (bluetooth.available())

{ delay(10);

servopos = bluetooth.read();

if ((char)servopos == '\n')

{

if (command>=0 && command<180)

{ Serial.print(" – Base360: ") ;

Serial.println(command) ; }

if (command>=180 && command<=359)

{ Serial.print(" – Shoulder: ") ;

Serial.println(command); }

[…]

Prima condiție ”if” este îndeplinită numai dacă conexiunea și comunicarea serială prin bluetooth este activă între dispozitivul Android și modulul bluetooth.

Atunci când este conectat variabila de tip caracter servopos primește valorile citite prin intermediul bluetooth, iar valorile trebuie convertite din ASCII în decimal. Soluția cea mai simplă este scăzând 48 din fiecare valoare citite.

else {

Serial.print(servopos-48);

command*=10;

command+=servopos-48;

}

În variabila command care este de tip integer este stocată valoarea care ne dă exact poziția servomotoarelor respective. Problema apare atunci când vrem să trimitem prin bluetooth un număr de mai multe cifre, pentru că variabila servopos poate stoca numai un caracter. Prin urmare variabila command este înmulțit cu 10 și sunt adunate cifrele deja convertite în decimal.

Pentru a decide intervalul de control al fiecărui servomotor am utilizat din nou condițiile if .

De exemplu secvența următoare prezintă cum este realizat controlul poziției a motorului utilizând funcțiile condiționale inclusiv și funcțiile implicite:

if (command>=180 && command<=359)

{

pulselen2 = map(command, 180, 359, SERVOMIN, SERVOMAX);

pwm1.setPWM(14, 0, pulselen2);

pwm1.setPWM(15, 0, pulselen2);

}

Secvența de cod de mai sus rulează dacă numărul primit prin bluetooth este între intervalul definit. Variabila pulselen2 reprezintă lungimea impulsului care primește valoarea asociată cu ajutorul funcției map. Funcția map convertește grade de rotații în lungimi de impulsuri.

Funcția setPWM() activează canale 14 și 15 pentru a controla cele 2 servomotoare conectate la aceste canale.

CAPITOLUL 3. SIMULAREA

3.1. SolidWorks model

SolidWorks este un program de proiectare asistată de calculator (CAD), care permite proiectanților, studenților sau inginerilor crearea unui model matematic corect al unui obiect solid care poate fi stocat într-o bază de date.

Când modelul matematic al unei părți sau de asamblare este asociat cu proprietățile materialelor utilizate, obținem un model solid, care poate fi utilizat pentru a simula comportamentul unui element sau model cu elemente finite.

Eu am ales acest program pentru proiectarea părților componente al brațului robotic, pentru că am considerat programul are o serii de avantaje:

ușor de învățat și pentru un utilizator care nu are experiență foarte mare în proiectare și design în programele CAD

programul are o interfață grafică inteligentă și ”user-friendly”

programul oferă o serie de instrumente de proiectare inteligente cu care putem reduce timpul efectiv de lucru

dimensionare automată și în vedere 3D

se pot face detalii convingătoare cu reprezentări de modele 3D, desene 2D, animații și randări fotorealiste înainte de fabricare

convertirea instantanee a modelelor 3D în 2D sau în desen tehnic

simulări dinamice cu ajutorul Motion Study (studiu de mișcare)

reducerea necesității de a realiza prototipuri (prin urmare cost redus)

Dacă deschidem programul Solidworks și vrem să creăm un proiect nou, putem alege din 3 variante. În continuare o să prezint aceste trei componente fundamentale care împreună alcătuiesc un model.

Parte (Fig. 3.1.):

Elementul de bază al unui model SolidWorks. Partea este blocul de construcție a modelelor 3D.

Ansamblu (Fig. 3.2.):

Ansambluri sunt colecții de piese care sunt asamblate într-un anumit mod, folosind ”mates”.

Un ansamblu poate să cuprindă

mai multe subansamble.

Desen (Fig. 3.3.)

Desenul este al treilea component care este modul

tipic de a reprezenta un

model 3D în 2D, astfel încât

orice inginer sau

producător poate crea partea sa.

Înainte de a începe recrearea și desenarea modelului braț robotic în 3D am luat în considerare dimensiunile maxime. Lungimile părților de legătură am luat din calculatorul de cuplu din Capitolul 2.

În continuare voi folosi mai ales terminologia engleză pentru numele funcțiilor și comenzilor din SW, pentru că n-am avut la dispoziție alte limbi instalate împreună cu programul.

Crearea schițelor

Pentru crearea unui obiect solid tridimensional prima dată trebuie făcută o schiță (Sketch) care este ca și o secțiune transversală 2D a piesei.

Pentru a schița o formă geometrică în SW, trebuie mai întâi să selectăm planul schiței.

Solidworks oferă trei opțiuni din planuri: planul superior (Top plane), planul lateral (Right plane), planul din față sau frontal (Front plane). La alegerea planului trebuie să luăm în considerare că dacă nu alegem bine planul respectiv, mai târziu o să fie mai greu la asamblarea părților componente.

Imediat după ce am ales planul unde vrem să lucrăm putem începe desenarea propriu-zisă.

În meniul Sketch (Fig. 3.4.) alegem instrumentul cu care vrem să lucrăm, de exemplu: linie, dreptunghi, poligon, cerc, arc de cerc, elipsă, parabolă, hiperbolă, text, punct etc.

Unele dintre beneficiile programului SW 2015 este dimensiunea inteligentă (Smart Dimension) cu care reducem efortul și timpul de lucru.

Dimensiunea inteligentă poate fi folosit a următoarele cazuri:

1) click pe o linie pentru lungime

2) click pe două puncte pentru aflarea distanței între 2 puncte

3) click pe o linie și pe un punct pentru aflarea distanței

4) click pe două linii paralele, pentru aflarea distanței

5) click pe două linii care nu sunt paralele pentru aflarea unghiului

Pasul următor imediat după dimensionarea schiței este extrudarea, care înseamnă pur și simplu, trecerea din 2D în 3D. Aceasta operație se regăsește în meniul Features și se numește Extruded Boss/Base, așa cum arată și Fig. 3.5.

În proiectul meu am folosit numai acest tip de extrudare, pentru că nu am avut forme rotunde sau foarte complicate. Alte tipuri de transformări în 3D sunt de exemplu Revolved Boss/Base sau Swept Boss/Base care sunt utile în cazul în care vrem să facem o sferă sau o geometrie mai complexă și complicată.

Dacă avem o schiță cu contururi închise și dăm un click pe Extruded Boss/Base imediat programul face automat o extrudare ca să vedem cum arată piesa noastră în 3D. În cazul în care nu avem un contur închis în schiță, programul ne dă un mesaj cu erori că extrudarea nu se poate face din cauza că există spărturi sau spații pe contur. Cu un singur click putem vedea unde am greșit și putem corecta erorile făcute.

Deci prin urmare, dacă nu avem erori și ne extrudează schița, o să apară o fereastră cu proprietățile unde avem posibilitatea de a seta adâncimea și direcția extrudării. În cele mai multe cazuri am folosit extrudarea pe o direcție. Sunt cazuri unde trebuie extrudat în ambele direcții.

Figura 3.6 prezintă extrudarea schiței în 3D, elementul transformat este baza brațului robotic.

Schița poate fi modificată oricând după transformarea ei în 3D cu un click pe schița respectivă și apoi pe Edit Sketch.

În următoarele o să prezint pe scurt comenzile de editare și utilizarea lor, care am folosit pentru realizarea modelului braț robotic.

Chamfer: creează o teșire pe un colț sau pe o muchie.

selectarea zonelor la care se aplică teșirea

setarea distanței și unghiului

Fillet: este utilizat pentru a crea o racordare.

setarea raza racordării

selectarea entitățile ce vor fi filetate

Scale: se utilizează pentru a scala un model

Linear pattern: multiplicarea formelor selectate după un tipar

multiplicarea se poate face linear, circular sau de-a lungul unei curbe

setarea direcției

setarea spațierea dintre instanțe pe direcția setată

definirea nr. de instanțe (include și instanța de referință)

Circular pattern

setarea unghiului dintre instanțe

definirea nr. de instanțe (inclusiv și cea inițială)

Mirror: face o copie a uneia sau mai multe forme oglindite față de o linie sau de o suprafață

Offset: creează o entitate paralelă cu o entitate deja existentă, la o distanță setată de către utilizator

Utilizarea funcției Mates la asamblare

Funcția Mates crează relații geometrice între componentele de asamblare. Pe măsură ce adăugăm Mates, definim direcțiile permise de mișcare liniară sau de rotație a componentelor. Avem posibilitatea să mutăm o componentă în termen de grade de libertate, vizualizând comportamentul sistemului asamblat.

În programul CAD Solidworks 2015 sunt 3 tipuri de Mates: mates standarde, mates avansate și mates mecanice.

Mates standarde (standar mates) includ unghi, coincidente, concentrice, la distanță, de blocare, paralele, perpendiculare, și mates tangente. Acestea tipuri de mates am utilizat cel mai des în procesul proiectării și simulării.

Mates avansate (advanced mates) pe care am folosit sunt următoarele:

Limit mates: Permite componentelor să se deplaseze într-un interval de distanță sau de unghi. Trebuie specificat distanța de pornire sau unghi, precum și o valoare maximă și minimă. Am folosit acest tip de mates mai ales la asamblarea manipulatorului în SW, unde găurile servomotorului nu au fost concentrice cu găurile suportului servo.

Symmetry mates: forțează două entități similare să fiu simetrică față de un plan sau de o componentă al ansamblului. Am folosit la ghearele manipulatorului să fie simetrice față de axa de simetrie când ele sunt în mișcare.

Mates mecanice (mechanical mates) sunt cele mai interesante și cele mai des folosite în domeniul mecatronicii. Mates mecanice pe care am folosit sunt următoarele:

Gear mates (Fig. 3.7): forțează două componente să se rotească în raport una față de cealaltă în jurul axelor selectate. Cu această funcție am realizat cuplajul între angrenajele manipulatorului.

Screw mates: constrânge două componente să fiu concentrice. Această funcție am utilizat pentru fixarea componentelor cu șuruburi și cu piulițe. De asemenea, rotirea unei componente determină translația celeilalte componente.

Randarea modelelor în Solidworks (Rendering)

Instrumentul PhotoView360 este un add-in în SW care combină instrumentele de randare cu efectele vizuale pentru a transmite mai departe viziunea unui proiect și pentru a crea un model 3D fotorealistic. Este destinat tuturor celor care trebuie să obțină în mod profesionist animații și imagini de calitate ridicat într-un mod ușor și rapid. [25]

Se poate vizualiza modelul realizat în 3D cu diferite configurații vizuale, având in spate diverse scene, lumini și filtrări artistice.

Este util ca oamenii doresc să vadă modele 3D așa cum ar apărea în viața reală, folosind culori și materiale specifice, într-un mediu specific.

Înainte de randare finală am ales materialul din care va fi fabricat piesa respectivă și culoarea piesei. Sunt o serii de materiale și culori în meniul Appearances.

Ca material eu am ales pentru piese din aluminiu Aluminium Alloy 1060.

CAPITOLUL 4. REALIZAREA PRACTICĂ

4.1. Asamblarea mecanică și elaborarea componentelor

Piesele din aluminiu au fost făcute în atelierul mecanic al Universității Tehnice cu mașină de debitat și cu mașină de frezat.

După fabricarea pieselor metalice din aluminiu am verificat fiecare component și am măsurat dimensiunile cu liniar. Cel mai important lucru care trebuie luat în considerare la brațul robotic, din punct de vedere mecanic, asamblarea să nu fie forțată. Aici mă refer la găuri neconcentrice, la distanțe sub- sau supradimensionate, sau piese aproape paralele.

Și eu am avut mici probleme la asamblare, pentru că unele piese nu au avut dimensiuni corespunzătoare modelului în SolidWorks. Până la urmă am rezolvat aceste probleme cu soluția manuală.

După măsurarea pieselor am curățat suprafețele ca să nu fie unsuroasă, după care am vopsit fiecare piesă metalică cu un spray de culoare negru.

Prima dată am început asamblarea din partea jos în sus. Pentru că servomotorul Base360 singur nu poate să țină orizontal discul care rotește, am pus 3 role fixe pentru a sprijini discul care sunt poziționate simetric decalate cu 120 de grade.

Piesa de bază este elementul care servește la fixarea servomotorului de bază, fixarea microcontrolerului Arduino și a driverului. Lângă microcontrolerul Arduino sunt două găuri pentru un switch SPDT (Single Pole Double Throw), și pentru un indicator LED.

După ce am terminat asamblarea părților care alcătuiesc baza robotului, am fixat suporturile pentru cele două servomotoare Shoulder. La fixare am luat în considerare că profilul ”U” care este înșurubat pe cele două discuri metalice de servo, nu poate să fie forțată și laturile trebuie să fie paralele. Vizavi de acestea înainte de asamblare cele 2 servomotoare trebuie calibrate astfel încât să fie în aceeași poziție și la poziția minimă a sliderului brațul să fie în poziție orizontală și la 90 de grade să fie întins vertical.

Dacă motoarele nu sunt calibrate în mod corespunzător, poate să apară probleme când alimentăm și încălcăm limitele mecanice care pot duce la deteriorarea motoarelor.

Partea Shoulder este alcătuită din două profiluri U care sunt înșurubate împreună dar cu direcția opusă. Apoi urmează servomotorul Elbow care este fixat și încorporat într-un suport de servo.

Servomotorul Elbow și Wrist sunt legate între ele cu două piese metalice din fier, ca să fie cât mai rigidă construcția robotului.

Manipulatorul este atașat direct la servomotorul Wrist360 cu 360 de grade de rotații. Pentru asamblare am folosit șuruburi cu următoarele mărimi:

M6*18 – pentru fixarea rolelor

M4*40 – pentru suportul bazei

M4*10 – pentru fixarea motoarelor și a componentelor metalice

M3*4 – pentru fixarea pieselor de legătură pe discurile metalice a servomotoarelor

M3*8 – pentru asamblarea manipulatorului

Un lucru foarte important la asamblarea manipulatorului este că axa servomotorului trebuie să fie cât mai departe de roțile dințate ale manipulatorului. Acest lucru se datorează faptului că, dacă montăm servomotorul prea aproape, cele două angrenaje vor fi prea strânse, și astfel nu permit ca gheara să se deschidă și să se închidă.

Înainte de montarea finală a discului metalic de cuplaj pe axa motorului, trebuie verificată poziția motorului. Motorul trebuie calibrat astfel încât la primirea comenzii maxime (poziția maximă în grade) manipulatorul să fie în poziția închisă. Dacă nu setăm în poziția corectă gheara, nu se poate deschide la maxim sau deloc.

Eu am făcut setarea limitelor în program în felul următor: la comanda minimă gheara este deschis maxim dar fără a forța motorul și la comanda maximă să fie închisă dar să nu fie prea strânsă. În cazul în care este forțat motorul și încălcăm limitele mecanice se aude un zgomot din motor și absoarbe un curent mult mai mare care poate duce la deteriorarea lui.

Acest lucru este valabil și pentru celelalte servomotoare, deci trebuie calibrate foarte precis cu mare atenție înainte de asamblare.

4.2. Asamblarea părții electrice

Schema electrică de conexiuni este prezentat în Fig. 4.4. și componentele care alcătuiesc întregul sistem de control sunt următoarele:

microcontrolerul Arduino Uno versiunea R3

driverul servo PWM cu 16 canale

modulul bluetooth HC-06

un comutator SPDT de 3A

un LED verde indicator

o rezistență pentru LED de 150 Ω

o mufă de conectare pentru alimentarea motoarelor

o baterie de 9 V

o sursă de alimentare în comutație de 6V cu un curent de ieșire de 2A (nu este prezentat în figură)

set fire pentru breadbord mamă-tată

6 servomotoare TowerPro MG995 și un servomotor Power HD1501MG

Microcontrolerul Arduino Uno este alimentat de la bateria de 9V, plusul bateriei este conectat la pinul Vin și minusul la pinul GND. Conexiunea între Arduino și controlerul PWM este realizată prin conectarea celor 4 pini:

pinul SCL (Serial Clock) a driverului este conectat la intrarea analogică A5

pinul SDA (Serial Data) este conectat la intrarea analogică A4

pinul VCC este conectat la pinul 5V

pinul GND a driverului este conectat la pinul GND pe Arduino

O observație importantă privind alimentarea plăcii de control PWM este că pinul VCC este numai pentru alimentarea chipului, pentru alimentarea servomotoarelor este destinat pinul V+ sau terminalul albastru.

Pe Fig. 4.4. nu sunt conectate servomotoarele la controlerul PWM, dar sunt menționate canale PWM la care se conectează.

Modulul bluetooth HC-06 este conectat direct la microcontrolerul Arduino Uno prin intermediului 4 pini. Comunicație serială, adică transmiterea și receptarea datelor este realizat prin conectarea celor 2 pini Rxd și Txd. Microprocesorul Arduino este programat astfel încât să utilizeze pinii digitali I/O 10 și 11 ca Rxd și Txd.

Nivelul tensiunii de alimentare a modulului este 3,3 V deci este alimentat de la pinul 3.3V pe Arduino și bineînțeles că pinul GND a modulului este conectat la unul dintre cei 3 pini GND ai microcontrolerului.

Pentru a porni sau opri alimentarea servomotoarelor prin intermediul driverului, este conectat un comutator SPDT de 3 A. În paralel cu comutator este conectat un indicator cu un LED verde și o rezistență de 220 Ω înseriată cu LED-ul. O mufă alimentare tată cu șurub servește pentru conectarea sursei de alimentare în comutație cu 5-6 V. Minusul este legat la comutator, iar plusul este conectat direct la terminalul albastru al driverului.

Pentru conectarea servomotoarelor la controlerul PWM am folosit cabluri prelungitoare de tip JR de 30 de cm. Conexiunile între dispozitive sunt realizate cu ajutorul cablurilor de tip jumper.

4.3. Partea de programare: Aplicația RoboControl

4.3.1. Despre Android Studio și limbajul Java

Conceptul de a controla brațul robotic de pe un smartphone vine din faptul că în zilele noastre toate lumea are un smartphone care poate comunica serial prin intermediul mai multor tehnologii (de ex.: bluetooth, Wi-Fi).

Pentru programarea aplicației numit „RoboControl” am ales platforma Android Studio 1.5.1 care este mediul de dezvoltare (IDE-Integrated Developing Environment) oficială pentru dezvoltarea aplicațiilor Android, și a fost lansat în 2013.

Limbajul de programare este Java, care este un limbaj de programare de nivel înalt, dezvoltat de JavaSoft, companie în cadrul firmei Sun Microsystems.

Avantajele limbajului Java:

ușor de învățat, caracteristicile complicate (șabloane, supraîncărcarea operatorilor) întâlnite în alte limbaje de programare sunt eliminate.

robustețe, elimină sursele frecvente de erori ce apar în programare prin eliminarea pointerilor, administrarea automată a memoriei și eliminarea fisurilor de memorie printr-o procedură de colectare a 'gunoiului' care rulează în fundal. Un program Java care a trecut de compilare are proprietatea că la execuția sa nu "crapă sistemul".

portabilitate, cu alte cuvinte Java este un limbaj independent de platforma de lucru, aceeași aplicație rulând, fără nici o modificare, pe sisteme diferite cum ar fi Windows, Macintosh, sau UNIX

orientat pe obiecte: elimină complet stilul de programare procedural; se bazează pe încapsulare, moștenire, polimorfism.

programarea în rețea este mult mai ușor

securitate: este cel mai sigur limbaj de programare disponibil în prezent.

face diferența între literele mici și mari (este case sensitive)

conține o librărie de clase și interfețe pentru domenii specific

este modelat după C și C++, trecerea de la C / C++ la Java este ușor.

permite dezvoltarea aplicațiilor pentru Internet – crearea unor documente Web îmbunătățite cu animație și multimedia.

Java Development Kit (JDK) este disponibil gratis pentru utilizatori [26]

Utilizarea Editorului Layout în Android Studio

Android Studio are un editor avansat de layout și permite în mod drag-and-drop inserarea unui widget în layout-ul respectiv și în timpul editării a codului XML, afișează modificările.

În cadrul editorului de layout, se poate alege între 2 moduri de vizualizare și editare: Text View și Design View, cum este prezentat mai jos în Fig. 4.1 și 4.2.

Dacă lucrăm în Text View, modificările sunt vizualizate instantaneu pe fereastra principală, evitându-se astfel necesitatea de a schimba între Text View și Design View pentru a vedea modificările.

În Design View paleta (Palette) oferă acces la gama de componente care sunt grupate în categorii pentru navigare mai ușoară. Articolele pot fi adăugate la layout, fie prin glisarea unei componente din paleta și inserarea ei în poziția dorită pe layout-ul, sau făcând click pe un widget din paleta și apoi făcând un click pe locul de pe layout unde vrem să inserăm componentul respectiv.

4.3.2. Arhitectura aplicației RoboControl și widgeturi folosite

Pentru controlul poziției și controlul vitezei (în două cazuri) servomotoarelor în aplicația am folosit un slider (SeekBar) pentru fiecare motor. Utilizatorul poate atinge și poate să-l tragă spre stânga sau spre dreapta pentru a seta nivelul de progres actual.

SeekBar.OnSeekBarChangeListener

este o apelare inversă, care notifică clienții atunci când nivelul de progres a fost schimbat. Aceasta include modificări care au fost inițiate de către utilizator printr-un gest tactil.

Declararea componentului SeekBar se face în modul următor:

import android.widget.SeekBar; //importăm (apelăm) widgetul ”SeekBar”

Tot programul rulează în interiorul clasei ”MainActivity”, pentru că rolul aplicației este să controlăm motoarele, deci întotdeauna modificăm sliderul și trimitem numerele instantanee prin bluetooth.

Extensia ”AppCompatActivity” este defapt o librărie Android, o versiune mai recentă, care suportă mai multe implementări care nu era în versiuni mai vechi. (de ex. Action Bar)

public class MainActivity extends AppCompatActivity implements SeekBar.OnSeekBarChangeListener {

Declarăm un număr întreg constant pentru fiecare slider, pentru că în aplicația este un buton numit ”Start position”, cu care putem seta robotul într-o poziție inițială. Deci altfel spus pentru fiecare servomotor corespunde o constantă care este de fapt poziția motorului.

Java oferă un mai multe niveluri de acces pentru clase, variabile și metode: private, public și protected. Una dintre cele trei este ”private„ care am folosit și eu foarte des în aplicația mea. Termenul ”final int” indică faptul că valoarea variabilei – care este un număr întreg – nu se va schimba (rămână constantă).

private static final int DEFAULT_BASE_360 = 75;
private static final int DEFAULT_SHOULDER = 20;
private static final int DEFAULT_ELBOW = 10;

private static final int DEFAULT_WRIST = 45;
private static final int DEFAULT_WRIST_360 = 75;
private static final int DEFAULT_GRIPPER = 30;

Pentru fiecare slider este atașat un identificator (ID), în cazul meu numerele de la 0 la 5. ID-ul ne ajută la definirea valorilor minime și maxime a fiecărui slider, care o să prezint și explic mai târziu.

public static final int ID_SLIDER_BASE_360 = 0;
public static final int ID_SLIDER_SHOULDER = 1;
public static final int ID_SLIDER_ELBOW = 2;
public static final int ID_SLIDER_WRIST = 3;
public static final int ID_SLIDER_WRIST_360 = 4;
public static final int ID_SLIDER_GRIPPER = 5;

În partea aceasta sunt declarate și apelate cele 6 slideuri ca și componente. Prefixul ”m” arată o variabilă membru (member) care face parte dintr-o clasă (class) specifică.

private SeekBar mBaseSeekBar;
[…]
private SeekBar mGripperSeekBar;

În partea următoare din codul aplicației este vorba despre setarea limitelor inferioare și superioare a sliderilor. În cazul controlul primului motor așa numit ”Base_360” a trebuit să fac o excepție din punctul de vedere de definirea intervalul sliderului, pentru că servomotorul respectiv poate să-l rotească 360 de grade (nu numai 180 de grade ca servomotoarele obișnuite), deci nu are senzor de poziție. Poate să-l rotească în ambele direcții cu viteze diferite. Intervalul [45-95] rezultă după simulări și calcule. Valoarea minimă 45 înseamnă că rotește în sens orar cu viteză maximă. Când schimbăm poziția sliderului spre dreapta și viteza motorului scade în trepte, până la un anumit nivel, unde se oprește. În intervalul [70-79] motorul este oprit. Mergând mai departe cu analogia anterioară, de la 80 până la 95 motorul începe să rotească în sens antiorar, și la limita superioară a intervalului rotească cu viteza maximă.

Înainte de buclă este declarată valoarea minimă, maximă și pasul de incrementare, care este 1.

int step = 1;
int max = 95;
int min = 45;

mBaseSeekBar = (SeekBar) findViewById(R.id.seekbar_base);
mBaseSeekBar.setProgress(DEFAULT_BASE_360);
mBaseSeekBar.setTag(ID_SLIDER_BASE_360);
mBaseSeekBar.setMax((max – min) / step);

mBaseSeekBar.setOnSeekBarChangeListener(new

SeekBar.OnSeekBarChangeListener() {

Funcția ”onProgressChanged” informează utilizatorul când nivelul de progres s-a modificat.

@Override
public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {
int step = 1;
int min = 45;

Partea cea mai importantă a aplicației este trimiterea informațiilor prin bluetooth la Arduino. Pentru această operație avem o funcție ”ConnectedThread.write(nr.getBytes())” care pur și simplu trimite serial numărul care se află în paranteză. Deoarece în mediul de programare Arduino IDE, în care am programat microcontrolerul Arduino Uno, le citesc valorile ca un text, nu ca un număr, a trebuit să convertesc numerele întregi în string cu ajutorul funcției ”Integer.toString()”. Cu funcția ”Math.floor” se face rotunjirea numerelor de tip float în sus spre numărul întreg cel mai apropiat.

mConnectedThread.write((Integer.toString((int) Math.floor( min + (progress * step))) + SEPARATOR).getBytes());
}

Funcțiile următoare fac parte din clasa SeekBarOnChangeListener, și rolul lor este de a notifica când utilizator a început sau a terminat un gest tactil.

@Override
public void onStartTrackingTouch(SeekBar seekBar) { }

@Override

public void onStopTrackingTouch(SeekBar seekBar) { }
});

Având în vedere că la controlul servomotoarelor care pot roti 180 de grade avem nevoie o scală cu 180 de numere, deci trebuie calculat matematic cu ajutorul ID-ul sliderilor. Calcularea se face în modul următor: dacă luăm primul caz, ID-ul motorului ”Shoulder” este 1, deci seekBar.getTag() va fi egală cu 1. Apoi este înmulțită cu 180, care va fi limita inferioară a sliderului. Progresul care în intervalul [0-100], este înmulțit cu 1,79 și este adunat cu 180. Astfel rezultând o scală care începe de la 180 până la 359. După aceeași analogia este calculat și scala celorlalte slidere.

mConnectedThread.write((Integer.toString((int) Math.floor((180 * (int) seekBar.getTag()) + (progress * 1.79))) + SEPARATOR).getBytes());

Cu aplicația RoboControl nu numai cu slidere putem controla brațul robotic, ci în plus avem 5 mișcări predefinite / preprogramate (Motion), din care putem alege o variantă. Partea aceasta a aplicației este făcut cu ajutorul unor butoane radio (radio buttons). Pe lângă butoane radio avem încă două butoane, una pentru executarea mișcării respective (”Execute” button) și una pentru oprirea mișcării (”Stop” button).

Butoanele radio permit utilizatorului să selecteze o opțiune dintr-un set. În cazul în care este necesar afișarea opțiunilor posibile unu lângă altul, este recomandat să folosim butoane radio.

În app-ul RoboControl sunt 5 opțiuni, deci 5 mișcări predefinite.

Declararea butoanelor radio se face în mod similar cu cea a sliderelor. Prima dată apelăm widgetul ”RadioButton”. Cu toate acestea, deoarece butoane radio se exclud reciproc, trebuie să grupat împreună în interiorul unui ”RadioGroup”.

Prin gruparea lor, sistemul asigură că doar un singur buton poate fi selectat la un moment dat.

import android.widget.RadioButton;
import android.widget.RadioGroup;

Deoarece numerele sunt rezervate până la 1079 pentru slidere, am ales o variantă mai elegantă și mai clară pentru declararea ID-ul butoanelor radio. Este declarant o constantă ”ACTION MOTION” cu valoarea 900, cu care adunăm ID-urile fiecărui butoane, dar partea de adunare este mai încolo.

public static final int ACTION_MOTION = 900;

public static final int ID_MOTION_1 = 1;
[…]

public static final int ID_MOTION_5 = 5;

Este definit și declarat grupul radio, care conține cele 5 butoane, ca și componente.

private RadioGroup mMotions;

private RadioButton mMotion1;

[…]
private RadioButton mMotion5;

La butonului de executare este atașat un ”ClickListener” și rolul ei este de a notifica, când utilizatorul a dat un click. Pentru alegerea butoanelor radio după un click se face cu ajutorul switch-case.

mExecuteButton = (Button) findViewById(R.id.button_execute);
mExecuteButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
int selectedMotion = 0;
switch (mMotions.getCheckedRadioButtonId()) {
case R.id.motion_1:
selectedMotion = ID_MOTION_1;
break;
[…] //se repetă și pentru celelalte butoane radio

Următoarea secvență de cod are rolul când smartphone-ul Android este conectat la modulul Bluetooth trimite serial numărul corespunzător pentru butonului ales: (de ex.: după apăsarea butonului radio 1 numărul trimis va fi 900+1, deci 9001)

if (mIsConnected) {
mConnectedThread.write((Integer.toString(ACTION_MOTION) + Integer.toString(selectedMotion) + SEPARATOR).getBytes()); }

Declararea și funcționarea butonului de oprire este similară cu butonul de executare, diferența este că butonul de oprire trimite un alt număr. (9000)

4.3.3. Realizarea comunicației seriale via Bluetooth

Partea cea mai interesantă dar și cea mai grea a codului Java este realizarea comunicației seriale cu tehnologia Bluetooth.

Sistemele Android oferă Bluetooth API (Application Programming Interface), cu care putem:

găsi dispozitive Bluetooth associate

căuta alte dispozitive Bluetooth

conecta la una sau mai multe dintre aceste dispozitive

primi și transfera date

O funcționalitate foarte importantă în tehnologia Bluetooth, este de a scana și a căuta dispozitive care sunt detectabile și pot fi accesate într-o zonă locală. Atunci când spunem detectabilă, ne referim la faptul că un dispozitiv este activat și toate informațiile sale sunt împărtășite (shared) și vizibile.

Înainte de procedura de descoperire este recomandat pentru a interoga setul de dispozitive asociate, deoarece dispozitivul dorit poate fi deja cunoscut.

Aparatele asociate (paired devices) sunt dispozitive conectate anterior, în care informațiile sunt stocate și reutilizate de către Bluetooth API-uri.

Pentru a interacționa cu bluetooth, ar trebui să fie utilizată clasa BluetoothAdapter, și getDefaultAdapter() este instrucțiunea care ia o instanță a acestei clase.

import android.bluetooth.BluetoothAdapter;
import android.bluetooth.BluetoothDevice;
import android.bluetooth.BluetoothSocket; //inițializează și manipulează conexiuniile

și acesta este punctul de conectare, care permite schimbului de date cu un alt dispozitiv Bluetooth prin intermediul InputStream și OutputStream.

private BluetoothAdapter mBluetoothAdapter; //declararea variabilei membru

Pentru a activa bluetooth, în primul rând ar trebui să verificăm dacă adaptorul bluetooth este deja activată. În începutul codului trebuie tratat toate cazurile posibile:

if (mBluetoothAdapter == null) { //Dacă nu găsește adapterul afișează un mesaj
showSnackBar(getString(R.string.no_bluetooth));

Dacă telefonul are adaptor de Bluetooth, programul face o verificare dacă Bluetooth este activ sau nu pe telefonul respectiv, și în cazul în care nu este activ, cere utilizatorului să-l activeze.

if (!mBluetoothAdapter.isEnabled()) {

Intent enableBluetoothIntent =

new Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE);
startActivityForResult(enableBluetoothIntent, BLUETOOTH_REQUEST_CODE);

Având în vedere că avem nevoie de un singur modul de Bluetooth cu care vrem să realizăm conexiune, nu are rost să căutăm după alte dispozitive Bluetooth, deci cu alte cuvinte, după apăsarea butonului de conectare, dispozitivul Android încearcă să conecteze direct la dispozitivul respectiv, dar după găsirea ei în lista de dispozitive asociate.

În cazul meu acest dispozitiv este modulul Bluetooth HC-06, care are două parametrii importante: adresa de MAC și UUID (Unique ID).

De acești doi parametrii avem nevoie pentru realizarea conexiunii între cele două dispozitive.

În codul Java partea de implementare a celor două parametrii arată astfel:

private static final UUID ROBO_UUID = UUID.fromString("00001101-0000-1000-8000-00805f9b34fb");
private static final String ROBO_MAC_ADDRESS = "30:14:12:04:14:66";

Dacă Bluetooth este activat, programul încearcă să găsească modulul Bluetooth HC-06 din lista dispozitivelor asociate (list of paired devices) și în momentul în care a găsit, conectează.

else { //Connect to Robo.
List<BluetoothDevice> pairedDevices = new ArrayList<>(mBluetoothAdapter.getBondedDevices());
if (pairedDevices.size() > 0) {
boolean isConnecting = false;
for (int i = 0; i < pairedDevices.size(); i++) {
BluetoothDevice device = pairedDevices.get(i);
if (device.getAddress().equals(ROBO_MAC_ADDRESS)) {
(new ConnectThread(device)).start();
isConnecting = true;
}

Un aspect foarte important este utilizarea firului de comunicare ”CommunicateThread”, care este o secvență de instrucțiuni a programului, și a oricăror alte fire, care se execută în mod independent.

Cu utilizarea firelor de comunicație, un program multi-threaded poate accepta o conexiune de la un client, începe un fir pentru acea comunicare, și să continue ascultare pentru solicitări din partea altor clienții.

(1 ) Not connected (2) Connecting… (3) Connected

Declararea variabilei boolean mIsConnected este necesară pentru a verifica dacă este conectat sau nu (true=conectat, false=nu este conectat). Pentru CommunicateThread este atașat o variabilă pe care se poate folosi la întreruperea sau începerea comunicației sau la trimiterea datelor cu mConnectedThread.write(int.getbytes()).

private boolean mIsConnected;

private CommunicateThread mConnectedThread;

Având în vedere că înainte de realizarea conexiunii, nu avem ce face cu aplicația, deci nu putem folosi în mod util, așa gândit este aplicația să fie inactivă interfața grafică (GUI) până realizarea conexiunii. Inactivitate se referă la 6 slidere, 3 butoane și 5 butoane radio, numai butonul de conectare rămâne activ.

Metoda OnConnectivityChange cu o variabilă boolean:

private void onConnectivityChange(boolean enable) {
mIsConnected = enable;

mBluetoothButton.setEnabled(true);
if (enable) {

Dacă a conectat afișează imaginea (1):

mBluetoothButton.setImageDrawable(ContextCompat.getDrawable(mBluetoothButton.getContext(), R.drawable.ic_bluetooth_disable_24dp)); }

mBaseSeekBar.setEnabled(enable); //activează cele 6 slidere
mShoulderSeekBar.setEnabled(enable);
[…]
mStartPositionButton.setEnabled(enable); //activează cele 3 butoane
mExecuteButton.setEnabled(enable);
mStopButton.setEnabled(enable);

mMotion1.setEnabled(enable); //activează cele 5 butoane radio
[…]
mMotion5.setEnabled(enable); }

În caz contrar afișează imaginea (3):

else { mBluetoothButton.setImageDrawable(ContextCompat.getDrawable(mBluetoothButton.getContext(), R.drawable.ic_bluetooth_enable_24dp)); }

Toast este o vedere care conține un mesaj rapid mic pentru utilizator.

Un snackbar oferă feedback cu privire la o operație. Snackbaruri apar mai presus de toate celelalte elemente de pe ecran și numai unul poate fi afișat la un moment dat. Metoda showSnackBar setează înapoi culoarea backgroundului.

private void showSnackBar(String text) {
Snackbar snackBar = Snackbar.make(mBluetoothButton, text, Toast.LENGTH_SHORT); snackBar.getView().setBackgroundColor(ContextCompat.getColor

(mBluetoothButton.getContext(), R.color.colorPrimaryDark));
snackBar.show(); }

În următoarea secvență programul a relizat deja comunicația cu dispozitivul respectiv, afișează mesajul „Connection successful” cu ajutorul SnackBarului și începe firul de comunicare.

Imediat după conectare inițializează un click automat pe butonul de StartPosition cu funcția performClick(), astfel setând brațul în poziție inițială.

private void startCommunication(BluetoothSocket socket) {
showSnackBar(getString(R.string.connection_successful));
onConnectivityChange(true);
mConnectedThread = new CommunicateThread(socket);
mConnectedThread.start();
mStartPositionButton.performClick(); }

Secvențele de cod prezentate și explicate mai înainte sunt cele mai semnificative din punct de vedere al controlului și a designului. Secvențele pe care nu le-am explicat sunt declarări de variabile, importări de widgeturi și alte funcții clare care nu neapărat trebuie explicate.

În ultima parte a codului metoda void run() și public CommunicateThread() care au rolul de a trata (de a prinde) excepțiile I/O. de exemplu când avem comunicarea între două dispozitive bluetooth și una face o operație de oprire sau de întrerupere, celuilalt dispozitiv să sesizează aceasta operație și să afișeze un mesaj că nu mai există comunicația.

Această parte a codului este luat de pe site-ul programatorilor http://stackoverflow.com dar este modificat să fie optimă pentru aplicația RoboControl.

CAPITOLUL 5. TESTAREA BRAȚULUI

În procesul de testare al brațului robotic am obținut următoarele rezultate, luând în considerare caracteristicile menționate în subcapitolul 1.2.:

La o mișcare secvențială programată, durata ciclului pick & place este 5,2 secunde.

Acoperirea / întinderea maximă în poziția orizontală măsurat din centrul robotului până la capătul manipulatorului: 38 de cm.

Viteza maximă în gol (fără sarcină) este 0,25 m/s.

Rezoluția: incrementarea de pas minimă este 1,5 cm, iar trebuie menționat că fiecare servomotor are o mișcare liberă de câțiva milimetri și adăugând aceste distanțe rezultă valoarea obținută.

Precizia brațului robotic am măsurat fără mișcarea de rotație de bază, pentru că motorul cu 360 de grade nu are encoder de poziție.

Sarcina maximă utilă în practică este în jur de 400 g. La sarcini mai mari motoarele sunt forțate.

CONCLUZII

În lucrarea prezentă sunt prezentați toți pașii efectuați pentru realizarea practică a unui braț robotic, începând de la partea de proiectare, simulare și de control, până la asamblarea și testarea brațului. Caracterul inovativ constă în simplitatea și utilitatea construcției, atât a structurii mecanice, cât și a părților electrice, care oferă posibilitatea de a înțelege cât mai ușor modul de funcționare a roboților, și a oricărei structuri mecatronice.

Controlul brațului se poate face prin mai multe metode, de pe calculator, prin tehnologia wireless etc., dar totuși eu am ales comanda prin bluetooth pentru că este mult mai accesibil și confortabil pentru toată lumea.

Având în vedere că distanța maximă de operare a modulului bluetooth este 9-10 metri, ne dă posibilitatea de a controla brațul la manevre mai periculoase.

Scrierea aplicației Android în limbajul Java era partea cea mai dificilă, prin urmare a însemnat și cea mai mare provocare, dar totuși prin studierea programării în Java, am acumulat cunoștințe suficiente pentru a face orice aplicație de control.

Bineînțeles că aplicația de control s-ar fi putut face și într-un mod mult mai complex cu un design mult mai complicat, dar nu asta era esențialul.

Robotul poate fi utilizat de către studenți sau de către cei interesați în mecatronică sau în robotică.

Avantajele brațului robotic sunt următoarele:

ușor de controlat de la orice smartphone Android

are o serie de mișcări preprogramate, care se pot modifica ușor pentru diferite mișcări și aplicații

are 6 grade de libertate, deci se poate mișca în spațiu

are un singur comutator numai pentru pornirea / oprirea alimentării a servomotoarelor

mișcarea simultană a motoarelor cu viteze diferite

cost redus

Dezavantajul acestui braț robotic constă în faptul că nu se poate folosi în aplicații, sau în domenii care necesită o precizie foarte bună și viteză de repetabilitată ridicată. Un alt dezavantaj este că robotul nu poate prinde obiecte cu un diametru mai mare decât 55 de mm.

O îmbunătățire a brațului robotic ar fi , schimbarea microcontrolerului Arduino Uno cu un microcontroler real-time de tip FPGA de exemplu (MyRIO) pentru a îmbunătăți viteza de prelucrare a comenzilor primite prin bluetooth.

O altă îmbunătățire ar fi înlocuirea servomotoarelor TowerPro cu motoare americane mult mai performante (de exemplu: Hitec) care au o capacitate de încărcare mai ridicată la aceeași dimensiune ca și motoarele standarde.

Brațul robotic este în așa fel gândit ca să se poate monta pe un alt robot mobil cu care se poate traversa distanțe mai mari și se poate manipula obiectele în jurul robotului. În punctul meu de vedere domeniul roboticii este unul dintre cele mai importante domenii în prezent, și trebuie dezvoltat cu seriozitate maximă, pentru că poate să înlocuiască munca umană în locuri periculoase salvând astfel vieți omenești.

În viitor dacă voi proiecta un alt braț robotic articulat, merită să fac cu posibilitatea de a înregistra mișcările făcute de un braț prototip, la care servomotoarele sunt înlocuite cu potențiometre.

În final sper că proiectul meu de diplomă va da informații utile și valoroase pentru cititorii interesați în acest domeniu care doresc să experimenteze cât mai mult cu brațe robotice.

BIBLIOGRAFIA

[1] http://biblioteca.regielive.ro/referate/automatica/roboti-industriali-295579.html

accesat în 10.04.2016

[2] http://spectrum.ieee.org/automaton/robotics/industrial-robots/george-devol-a-life-devoted-to-invention-and-robots accesat în 10.04.2016

[3] http://www.robotshop.com/media/files/PDF/timeline.pdf accesat în 10.04.2016

[4] H.McCain:A hierarchically controlled, sensory interactive robot in the automated manufacturing research facility, Librăria digitală IEEE, 2012

1985,

[5] V. Daniel Hunt: Industrial Robotics Handbook,Editura Industrial Press Inc., New York, 1983

[6] http://helix.gatech.edu/Students/SiouxWill/arm1.JPG

[7] Internation Federation of Robotics – IFR: History of Industrial Robots, 2012, Frankfurt am Main, Germania

[8] http://www.qreferat.com/referate/mecanica/Roboti-Industriali724.php

accesat în 15.04.2016

[9] http://nptel.ac.in/courses/112103174/module7/lec5/3.html accesat în 15.04.2016

[10] ÇETİNKAYA. Ö, KUȘÇU. H: Classifications of the industrial robot arms, International Scientific Conference, Gabrovo, 2007

[11] https://en.wikipedia.org/wiki/Articulated_robot accesat în 17.04.2016

[12] http://www.rasfoiesc.com/inginerie/tehnica-mecanica/PROIECT-DE-ABSOLVIRE-Mecatroni57.php accesat în 17.04.2016

[13] http://www.used-robots.com/articles/viewing/the-advantages-and-disadvantages-of-scara-material-handling-robots accesat în 02.05.2016

[14] MICU SACEANU F. NINETA SIDONIA: Roboți industriali, Universitate din Craiova

[15] Coleman Benson: Robot Arm Torque Tutorial, http://www.robotshop.com/blog/en/robot-arm-torque-tutorial-7152 accesat în 15.05.2016

[16] http://www.pyroelectro.com/tutorials/servo_motor/parts/hitec_servo_b.jpg

[17] Jacek F. Gieras: Permanent Magnet Motor Technology: Design and Applications, Third Edition, CRC Press

[18] Ralf Der, Georg Martius: The Playful Machine: Theoretical Foundation and Practical Realization of Self-Organizing Robots. Springer Science & Business Media, 2012

[19] https://learn.sparkfun.com/tutorials/pulse-width-modulation

[20] http://www.jameco.com/jameco/workshop/howitworks/how-servo-motors-work.html accesat în 17.05.2016

[21] https://www3.ntu.edu.sg/home/ehchua/programming/arduino/images/ArduinoUno.png

[22] http://digital.csic.es/bitstream/10261/127788/7/D-c-%20Arduino%20uno.pdf accesat în 17.05.2016

[23] https://cdn-learn.adafruit.com/downloads/pdf/16-channel-pwm-servo-driver.pdf accesat în 19.05.2016

[24] http://www.puntoflotante.net/BLUETOOTH-HC-06-WITH-SERIAL-PORT-EASY-GUIDE accesat în 20.05.2016

[25] https://www.solidworks.com/sw/products/3d-cad/photoview-360.htm

[26] S. Tanasa, C. Olaru, S. Andrei: Java de la 0 la expert, Editura POLIROM, Iași, 2003

[27] http://androidstudio.eu/android-studio.png

Similar Posts