PROGRAMUL DE STUDIU AUTOMATICĂ ȘI INFORMATICĂ APLICATĂ [303400]

UNIVERSITATEA DIN ORADEA

FACULTATEA DE INGINERIE ELECTRICĂ ȘI TEHNOLOGIA INFORMAȚIEI

PROGRAMUL DE STUDIU AUTOMATICĂ ȘI INFORMATICĂ APLICATĂ

FORMA DE ÎNVĂȚĂMÂNT LA ZI

Proiect de diplomă

COORDONATOR ȘTIINȚIFIC

Conf. dr. ing. Barabás Tiberiu

ABSOLVENT: [anonimizat]ándor

ORADEA

2017

UNIVERSITATEA DIN ORADEA

FACULTATEA DE INGINERIE ELECTRICĂ ȘI TEHNOLOGIA INFORMAȚIEI

PROGRAMUL DE STUDIU AUTOMATICĂ ȘI INFORMATICĂ APLICATĂ

FORMA DE ÎNVĂȚĂMÂNT LA ZI

Comanda unui robot industrial echipat cu motoare servo cu
microcontroler ATmega328PU

COORDONATOR ȘTIINȚIFIC

Conf. dr. ing. Barabás Tiberiu

ABSOLVENT: [anonimizat]ándor

ORADEA

2017

Cuprins

Introducere 5

Capitolul 1. Introducere în lumea roboților industriali 6

1.1 Istoria roboților 6

1.2 Clasificarea roboților 9

1.3 Structura roboților 11

1.4 Comanda roboților 11

Capitolul 2. Prezentarea robotului din cadrul proiectului 12

2.1 Sistemul mecanic al robotului 12

2.2 Schema electrică de comandă a robotului 14

2.3 Placa de dezvoltare a robotului 15

2.4 Motoarele servo 16

Capitolul 3. Proiectarea sistemului de comandă 22

3.1 Noțiuni introductive privind microcontrolerele 22

3.2 Microcontrolerul ATmega328PU 24

3.3 Microcontrolerul ATtiny85 27

3.4 Interfața de dezvoltare Visual Micro 28

3.4.1 Instalarea extensiei Visual Micro 30

3.4.2 Programarea microcontrolerului ATmega328P-PU 32

3.4.3 Programarea microcontrolerului ATtiny85 36

3.5 Realizarea plăcii de dezvoltare pentru comanda robotului 39

Capitolul 4. Proiectarea programului de interfață PC 46

4.1 [anonimizat] 46

4.2 Instalarea programului 46

4.3 Conectare la placa de dezvoltare 46

4.4. Setarea legăturilor de pe placă respectiv parametrilor de control 46

4.5 Comandarea articulațiilor 46

4.6 Programarea robotului 46

Bibliografie 47

Anexa 1. Diagrama bloc pentru microcontrolerul ATmega328p-PU 49

Anexa 2. Diagrama pinilor pentru microcontrolerul ATmega328P-PU 50

Anexa 1. Diagrama bloc pentru microcontrolerul ATtiny85 51

Anexa 2. Diagrama pinilor pentru microcontrolerul ATtiny85 52

Introducere

Automatica este acea ramură a științei care studiază și realizează metode și mijloace prin care se exclude participarea directă a factorului uman asupra unor procese.

Această știință a apărut atunci când omul a recunoscut observat că tehnologia este așa de bine dispusă astfel încât unele procese repetitive pot fi efectuate de mașini.

Automatica s-a [anonimizat]. [anonimizat] o tendință tot mai mare de a [anonimizat], oferind o adaptabilitate mai sporită a [anonimizat].

[anonimizat], [anonimizat], funcția lor fiind de a mări productivitatea cu deplasări mai rapide și mai precise.

[anonimizat], în ce condiții.

În capitolul doi va fi vorba despre un robot industrial cu cinci grade de libertatea și se prezintă și partea practică a acestei lucrări.

Capitolul trei conține descrierea sistemului de comandă responsabil pentru achiziție și generare de semnale folosind circuitul ATmega 328 PU și ATtiny85 de la Atmel.

Următorul capitol prezintă mediul de dezvoltare Visual Micro pentru programarea microcontrolelor utilizați.

În ultimul capitol este prezentat mediul de dezvoltare Visual Studio, unde s-a dezvoltat programul de interfață a robotului pentru un calculator PC.

Capitolul 1. Introducere în lumea roboților industriali

1.1 Istoria roboților

Ideea „automation / automata ” își are originile în mitologiile diferitelor culturi ale lumii. Inventatorii din civilizațiile antice au încercat să construiască mașini care să funcționeze singure. Cele mai vechi descrieri se referă la păsările artificiale, la automaton care vorbește sau care spală. Aristotel a fost primul care a speculat că acele ”automatons” într-o zi va fi servi pe om, fiind egal cu el, prin ce se înțelege că omul va fi stăpânul iar roboții sclavii lui, [1][2]

Figura 1.1.1 „Automata” lui Yan Shji[3]

Pentru China antică s-au găsit descrieri ale „automata” din secolul III, când Yan Shji a creat un automat în dimensiuni naturale, care a fost capabil să performeze mai multe funcții impresionante. Automatizarea putea să se miște într-o manieră și putea cânta. Aceasta era realizată din piele, lemn și organe artificiale. (figura 1.1.1)

În figura 1.1.2 este prezentat motorul cosmic al lui Su Song, care defapt un turn cu ceas de 10 metri înalt, cu mecanism de tip „manachin” care sună în fiecare oră cu un clopoțel.[4]

Este și o legendă egipteană despre Rocail, fratele cel tânăr a lui Seth, că a construit un palat și un mormânt în care erau statui autonome ce erau acționate astfel încât duceau o viață asemănătoare cu cea a oamenilor. Statuile erau atât de bine realizate, încât puteau fi confundate cu niște ființe vii.[5]

O altă poveste de la Lokapannatti (un indian din sec. XI–XII) despre Regele Ajatashatru din Magadha, care a luat relicvele lui Buddha și le-a ascuns într-o „stupă” sub pământ. Relicvele erau protejate de roboți mecanici („bhuta vahana yanta” în limba lor),

Cele prezentate de mai sus, confirmă adevărul despre istoria roboților, că ei au apărut și au existat deja în lumea antică și dacă nu erau așa de performanți și de bine dispuși ca în zilele de azi.

Deși istoria roboților întinde până la lumea antică, eu zic că roboții au apărut atunci, când omul și-a imaginat dispozitive mecanizate și inteligente, care să preia cât mai mult din efortul fizic depus. În așa fel și-a imaginat roboții în cărți, desene, filme, după ce a construit jucării automate și mecanisme inteligente.

Termenul „robot” a fost utilizat pentru prima dată de în piesa „Rossum’s Universal Robots” al scriitorului ceh, Karel Čapek, în anul 1920, după care în 1941 Isaac Asimov a folosit cuvântul "robotizare" pentru descrierea tehnologiei roboților și a prezis creșterea unei industrii robotice puternice. Prin urmare conceptul modern al robotului a început să fie dezvoltat, într-adevăr, în perioada Revoluției Industriale, când era posibil să utilizeze sisteme mecanice complexe și a devenit cât mai accesibil și utilizarea electricității.

Primul robot industrial „The Iron Hand” a fost fabricat de către un inginer de la Erie Engineering Company în 1938, iar poza ce se poate vedea in figura 1.1.3 era realizat undeva în anii 1940-1950, data aceasta fiind aproximat după mașina care apare dreapta spate pe poză.

Figura 1.1.3 The Iron Hand [6]

Arăta că o macarea și avea un singur motor pentru acționare. Trebuie remarcat faptul că avea 5 grade de libertate. Acest robot nu putea fi utilizat pentru foarte multe acțiuni dar totuși era capabil să așeze placi și bucăți de lemne în „blocuri” de forme bine definite.[6]

Primul robot programabil și operabil în sistem digital a fost inventat de Geroge Devol în 1954, care ulterior a primit numele de „Unimate”. Acest robot a lucrat pe linia de asamblare a General Motors assembly line la New Jersey. A fost utilizat de a lua și a ridica piesele turnate din fontă și matrițe și apoi să le depoziteze. Brevetul lui Devol reprezintă fundamentul industriei moderne de robotică. [7]

În anii 1970, compania germană KUKA, a construit primul robot industrial din lume, cu 6 axe de mișcări comandate electromecanic, cunoscut sub denumirea FAMULUS.

Brațul robotic SCARA (Selective Compliance Articulated Robot Arm) a fost creat în 1978, ca braț robotic cu 4 axe. S-a dovedit a fi deosebit de eficient pentru apucarea reperelor și mutarea lor în altă locație, fiind introdus pe linia de asamblare în 1981.

În anii 1980, companiile din industria automobilului au făcut investiții masive la companiile din domeniul roboticii, cu toate că, nu întotdeauna, acestea s-au dovedit a-și atinge scopul. General Motors Corporation a cheltuit mai mult de 40 de biliarde de dolari pe tehnologii, dar, din păcate, o mare parte a investiției s-a dovedit a fi fost un eșec. În 1988, roboții de la fabrica Hamtramck Michigan au căzut, adică au spart geamurile și s-au vopsit unul pe altul. [8]

Anul 2010 a indus o accelerare a cererii pentru roboții industriali, datorită dezvoltării continue inovative și îmbunătățirii performanțelor roboților. Până în 2014 s-au înregistrat o creștere cu 29% a vânzărilor la nivel mondial. Deoarece în ultimii ani roboții au devenit tot mai performanți, s-a dezvoltat un sistem de operare pe computer pentru aceștia. Robot Operating System (ROS), reprezintă un set de programe „open-source” dezvoltat la Stanford University, Massachusetts Institute of Technology și Technical University of Munich. Sistemul permite variante avansate de software pentru programarea mișcărilor robotului, nivel ridicat de comandă și control, procesare cu acuratețe a imaginilor, evitarea obstacolelor etc. Atunci când ROS realizează „boot” / conexiune pe computer, se obțin date despre lungimea și mișcările brațului robotic, date care sunt apoi procesate prin algoritmi complecși, de înalt nivel (neutrosofic, logic, fuzzy etc.).

Baxter, este un robot industrial nou, construit de compania Rethink Robotics, care a fost utilizat din sfârșitul anului 2012. Era diferit de ceilalți roboți industriali în aceea că poate învăța. Un operator / muncitor îl poate învăța cum să desfășoare o activitate, mutând mâna cu mișcarea respectivă și, punându-l pe Baxter să o memoreze. Nu este nevoie de programare pentru ca robotul să execute operațiile.

A face parte din lume roboților este interesant, provocător și cu beneficii din ce în ce mai mari – în special pentru aplicațiile industriale – motiv pentru care am ales această cale pentru studiile mele superioare.

1.2 Clasificarea roboților

Robotul prin definiție este un sistem automatizat de înalt nivel capabil sa îndeplinească obiecte și scule în scopul suplinirii unor activități umane. Realizarea și implementarea aplicațiilor necesită cunoștințe din domenii diverse ( mecanică, hidraulică, electrotehnică, electronică, informatică).[9]

Astfel robotul industrial, în prezent este definit ca un manipulator tridimensional, multifuncțional, reprogramabil și capabil să deplaseze materiale, piese, unelte sau aparate speciale după traiectorii programate, în scopul efectuării unor operații diversificate de fabricație.

Un robot industrial, pe lângă faptul că trebuie să îndeplinească cerințele mediului industrial după cum trebuie să fie și foarte flexibil, ca să poate fi adaptat pentru orice serii de fabricație într-un mod cât mai ușor, să aibă o productivitate cât mai crescută, să fie fiabil, toate aste cu un cost cât mai redus. Acești roboți sunt utilizați în aplicațiile ce sunt caracterizate prin repetabilitate, cadență foarte mare, în medii nocive.

Roboții, după modul deplasării se disting în două mari categorii. Astfel există roboți:

Roboți ficși, cei care sunt imobili față de anumite componente ale mediului în care evoluează

Roboți mobili, utilizați din ce în ce mai mult în diverse aplicații pentru a îndeplini sarcini complexe în spații sau în medii în care accesul omului este dificil sau chiar imposibil. Deplasarea se face folosind roți, senile sau prin păsare

Clasificarea pe generalități, folosește drept criteriul de bază, capacitatea mașinii de percepere și interpretare a semnalelor din mediul exterior, precum și de adaptare la mediu în timpul procesului de lucru.

Generațiile manipulatoarelor:

Manuale (prima generație): este vorba de un sistem de manipulatoare amplificatoare de efort cu cel puțin 3 grade de libertate care permite, prin comenzi umane, efectuarea operațiilor în medii improprii sau nocive activități umane

Automate (generația a doua): acestea sunt mecanisme de manipulare cu cel puțin două axe, care realizează deplasări după un ciclu bine prestabilit, într-un regim automat. Ele nu au senzori și lucrează în buclă deschisă, de aceea sunt utilizați la operații mai simple cum este de exemplu încărcare/descărcare.

Inteligente (generația a treia): sunt mecanisme de manipulare, în care comanda umană este îmbinată cu controlul de finețe asistat de senzori inteligenți. Scopul acestei comenzi constă în depășirea limitelor senzoriale asupra organismului uman.

Generațiile roboților industriali

Manipulatoarele automate programabile construiesc prima generație, având minim trei axe, dintre care măcar două sunt programabile fie printr-un limbaj simbolic fie prin învățare. Acești roboți lucrează în buclă închisă, datorită unor senzori de control a poziției, care se află pe fiecare axă. Comanda lor se poate face de la un automat programabil sau de la un calculator.

Generația a doua cuprinde manipulatoarele automate tot cu cel puțin 3 axe programabile, dar sunt dotate cu mai multe senzori specializați, cum sunt senzori de tip tactil, de forță, camere video și așa mai departe. Datorită acestor senzori au o coordonare de tip ochi-mână, ceea ce înseamnă că pot identifica obiecte de formă simplă așezate aleator. Sunt comandați de cel puțin un calculator și cu ajutorul lui pot face deplasări pe traiectorie în funcție de modificările mediului de lucru într-un mod interactiv, așa că pot executa operații indiferent de poziția inițială a subcomponentelor.

Roboții din generația a treia sunt dotați cu senzori mai performanți și inteligenți, care prelucrează datele local, analizează datele și furnizează doar informația necesară către sistemul de comandă.

Inteligenți pe care rulează programe în care este implementat o inteligență artificială la care se mai adaugă și senzori de înalt nivel, așa că robotul fiind foarte dotat, are capacitatea de autoinstruire, interpretând și folosind experiențe dobândite din situații anterioare.

Majoritatea roboților industriali, care sunt mai des folosite în zilele de azi aparțin generației 1 respectiv 2.

Bla bla bla bla

1.3 Structura roboților

1.4 Comanda roboților

Capitolul 2. Prezentarea robotului din cadrul proiectului

Robotul prezentat în proiect este distribuit de firma Lynxmotion. Această firmă se ocupă cu distribuirea mai multor tipuri de roboți cum sunt: dronele, brațele robotice, roboți humanoide(bipeduri), quadropoduri, hexapod, mașini/rovere, roboți sumo, tancuri; respectiv accesorii pentru asamblarea un robot anume din mici bucăți cum sunt motorașele, propellere, roțile cu cauciucuri, cabluri, controllere și multe alte piese sau accesorii ce pot fi de folos pentru a construi cu ușurință un robot care să ne place.

2.1 Sistemul mecanic al robotului

Acest robot este de tip SECSAC-KT Lynx SES Aluminum. Dispozitivul de ghidare este alcătuit din cinci cuple cinematice, fiecare cuplă cinematică fiind de tip R, astfel robotul având cinci grade de libertate de tip RRRRR. Pe lângă aceste, mai este adăugat, ca și efector final, un gripper, pentru prinderea unor obiecte aflate în interiorul acelei zone, unde robotul poate să ajungă și să le prinde.

Figura 2.1.1 Robotul SECSAC-KT

Articulațiile robotului sunt puse în aplicare cu ajutorul motorașelor servo iar elementele care se leagă articulațiile fiind legături din aluminiu. Comanda motoarelor, respectiv controlul traiectoriei gripperului este realizat de microcontrolerului ATmega328PU, fabricat de Atmel. Pentru calculele și sincronizarea motoarelor am folosit un alt microcontroler și anume ATtiny85 care are rolul de a apela o întrerupere din exteriorul ATmega328PU. Pentru un aspect mai bun, am realizat o placă de dezvoltare, pentru a face conexiuni mai clare, fără multe cabluri. Echipamentele sunt alimentate de o sursă externă, cu mufa de ATX cu 24 de pini, care se poate regăsi în orice calculator personal. Robotul în sine are o greutate de 1.5 KG și poate ridica o greutate maximă de 250gr (10oz/inch) la înălțimea maximă de 38cm.

În ceea ce privește structura robotului, trebuie specificat următoarele caracteristici:

Distanța dintre axe este de 15,5 cm

Gripperul se poate deschide maxim la 3.5 cm

Rotația motoarelor este de 192o

Alimentarea motoarelor se face la 5V

Consumul motoarelor este de 450mA, iar la peak poate atinge și 2500mA

Masa totală al robotului este de 1.5 KG

Masa totală de ridicare este de 250gr

Comanda se face cu programul „RobotArm” conectând partea de comandă la un calculator prin cablu USB

Pe partea de comandă a robotului inițial, se află un controler servo tot de la firma Lynxmotion, numit SSC-32. Acest controler are multe caracteristici. Are o rezoluție foarte mare de 1uS pentru poziționare cât mai clară și pentru mișcări foarte mici. Intervalul pentru impulsuri este de la 0.5 ms până la 2.5 ms pentru 180o . Mișcarea controlată cu acest controler poate să fie executată imediat, se poate regla viteza de mișcare sau timpul în care să fie efectuat mișcarea, sau combinat. De asemenea este posibil controlul mai multor motoare în aceeași timp, se poate controla astfel să se pornească motorașele împreună și să și termine mișcarea împreună. Acest controler avea conectivitate serială folosind protocolul RS-232 pentru a comunica cu un calculator.

Din motivul că protocolul RS-232 începe să fie învechit m-am gândit să realizez eu o altă placă, cu un alt microcontroler cu conectivitate USB pentru a comanda robotul.

2.2 Schema electrică de comandă a robotului

Figura 2.2.1 Schema electrică de principiu

În figura 2.2.1 este prezentat schema electrică de conectare de principiu a robotului realizată de mine. Placa pe lângă alte componente electrice cum sunt rezistențele, condensatoarele și ledurile, mai conține și un oscilator cu cuarț, care furnizează un tact de ceas pentru microcontrolerul ATmega328PU pe 16 MHz. Pe placă se regăsește încă un alt microcontroler și este vorba despre ATtiny85, care ajută la sincronizarea motoarelor cu un tact la pinul de întrerupere al ATmega328PU. Pentru a informa vizual utilizatorul sunt montate leduri de informare despre alimentare respectiv de funcționare. Pentru alimentarea plăcii utilizez un conector ATX, care se regăsește pe orice sursa de tensiune din orice calculator PC. Cu ajutorul acestei surse sunt alimentate atât microcontrolere cât și motoarele.

Placa de dezvoltare dă posibilitatea ca motoarele servo să fie conectat la orice intrare al microcontrolerului ATmega328PU care are dotarea de a genera semnale PWM. Astfel motoarele pot fi conectate la pinii 3,5,6,9,10,11. In continuare, se regăsește încă doi pini liberi de la ATtiny85 dintre care unu trebuie conectat la pini 1 și 2 la ATmega328PU pentru întreruperea externă, iar celălalt pin la orice pin digital liber, care va da semnal de pornire/oprire pentru generarea întreruperii. Ultimul pin care trebuie conectat este pinul de pornire sursă. El poate fin conectat la orice pin digital liber și are rolul de a porni sursa de tensiune, care în momentul conectării la priza de alimentare, nu pornește simultan, ci așteaptă după un semnal. Acest semnal este controlată de microcontroler.

Trebuie menținut că după conectarea motoarelor respectiv tuturor semnalelor care ajută funcționarea corectă a robotului, când pornim aplicația RobotArm, trebuie să specificăm la setări, locul fiecărei semnal conectat la microcontroler.

Conectarea inițială este următoarea:

ATtiny85 pinul P0 este conectat la ATmega85PU pinul digital D4

ATtiny85 pinul P1 este conectat la ATmega85PU pinul digital D2

Pinul 9 (PS_ON) din conectorul ATX la ATmega85PU pin digital D12

La ATmega328PU pinul D3 este conectat motorul de la baza robotului

La ATmega328PU pinul D5 este conectat motorul de la a doua articulație

La ATmega328PU pinul D6 este conectat motorul de la a treia articulație

La ATmega328PU pinul D9 este conectat motorul de la a patra articulație

La ATmega328PU pinul D10 este conectat motorul de la a cincea articulație

La ATmega328PU pinul D11 este conectat motorul de la gripper

Așa cum am specificat și mai sus, orice modificare la conectare, trebuie introdusă în programul de control al robotului, pentru funcționare corectă. Această corectură se poate face conform instrucțiunilor din capitolul 4.4.

2.3 Placa de dezvoltare a robotului

Controlul unui astfel de robot nu este așa de simplă cum se pare la început. Necesită multe gândiri, programare și multe atenție la conectarea legăturilor între componentele electrice respectiv comunicarea între microprocesoare. Pentru a evita în viitor aceste greșeli, m-am hotărât să realizez o placă de dezvoltare specific pentru controlul acestei robot.

Din punct de vedere estetic, este vorba despre o placă foarte simplă, ce se poate realiza acasă, așa cum am făcut și eu. Realizarea unei astfel de plăci, nu necesită echipamente scumpe, pe care le folosim rare ori și nu sunt echipamente greu de folosit. Ne trebuie doar să folosim capul în primul rând pentru a realiza trasee cât mai optimizate și clare între componente. După ce am ajuns la o versiune finală, urmează să introducem desenul nostru într-un program, specific pentru realizarea și desenarea astfel de circuite, pe care la sfârșit vom lista, și cu metoda fierului de călcat vom realiza cablajul imprimat. Această metodă presupune listarea cablajului împrimat cu o împrimantă laser. Foaia listată punem cu fața în jos pe partea cu cupru a plăcii. După ce am fixat, aplicăm fierul de călcat pe ei, ca să topim tonerul de pe foaie, pe placă. După pest 6-7 minute, luăm cu grijă placa, și punem în apa fierbinte, ca să eliminăm foaia de pe ea. Dacă totul este în regulă și nu am stricat circuitul, putem să placa într-o soluție chimică de corodare și anume în clorură ferică. Așteptăm până când soluția scoate cuprul din înafara tonerului topit, după care scoatem și ștergem placa cu acetonă, astfel obținând circuitul final. Metoda este mai bine arătat și explicat în capitolul 3.4.

2.4 Motoarele servo

Motoarele servo sunt dispozitive electro-mecanice, închise într-o cutie, care cuprinde un motor de curent continu (DC), electronică pentru controlul motoarelor de la un semnal de comandă, transmisie intermediară pentru a crește puterea de rotire și pentru a reduce turația motorului și un potențiometru, care furnizează dispozitivului informație despre poziția actuală a motorului. [14]

Figura 2.4.1 Structura servomotorului[10]

Aceste motoare sunt fabricate în trei mărimi: micro, normal și gigant, iar sunt cu același sistem de bază constructiv. Se utilizează de obicei pentru poziționare, de exemplu pentru reglarea direcției la o mașinuță, la mișcarea brațelor robotice, etc.

Figura 2.4.2 Tipuri de motoare servo[11]

La comanda motoarelor servo, ele vin cu mai multe feluri de dispozitive, care pot fi montate pe ei, depinde doar de noi care vom folosi, care se potrivește mai bine pentru proiect, pentru aspectul (designul) robotului.

Figura 2.4.3 Dispozitive atașabile la servomotor[12]

Cele mai utilizați tipuri de motoare servo au conexiuni cu 3 pini cu același semnal de control, care va face pe motoarele servo să fie interschimbabili între ele în mod rezonabil. Acești conectori sunt de tip mamă, cu cap de 0.1”. Ceea ce se poate confunda este culoarea, care nu sunt consistente tot timpul și depinde de producător. O faptă bună este că ordinea pinilor, în mare majoritate, este aceeași, așa că diferența se găsește doar la culoare. Trebuie totuși menținut culorile negru și maro care este împământarea (ground) și roșu care este alimentarea (vcc). Culoarea semnalului de comandă poate să diferă de la un producător la altul, așa că dacă nu suntem siguri în ceea ce facem, atunci mai bine ne uităm în documentație. De obicei pentru comandă se utilizează culorile alb, galben și portocaliu. [15]

A fost menționat mai sus, că semnalul de control este al treilea pin din conector, care este utilizat pentru a zice motorului unde anume, în ce direcție să se întoarce. Acest semnal de control este un șir de impulsuri. Impulsurile apar într-un interval de 20 de milisecunde (în 50Hz) iar lungimea unui impuls variază între 1-2 milisecunde. Unele sisteme cu rezoluție crescută ne va permite comanda impulsurilor de la 0.5 ms până la 2.5 ms. Pentru generarea acestor semnale PWM (Pulse Width Modulation) este ușor de a folosi un microcontroler, care să aibă pini dotați pentru generarea astfel de impulsuri.

Idea de protocol pentru poziționare constă în faptul că la o comandă de 1,5 ms motorul se rotește la poziția centrală, având valoarea unghiulară de 90 de grade. Atunci când comandăm un impuls care tinde mai spre 1 ms atunci motorul se va roti spre stângă, iar în caz contrar când este mai aproape de 2 ms se va roti spre dreapta. Fiecare impuls măsurat va afla între 1 ms și 2 ms după cum va fi decis rotire la stânga sau la dreapta a motorului. Comanda fiind analog, practic orice poziție poate fii atinsă. Știind deja cum comandăm un servo motor, știm că metoda cea mai simplă pentru generarea semnalului PWM de comandă este utilizarea unui microcontroler, rămâne de știut doar că pozițiile valabile sunt dependente de rezoluția ceasului (timer) al microcontrolerului. De exemplu, este posibil ca un impuls să aibă numai 256 pași intre 1 ms și 2 ms care este destul de ajuns pentru orice aplicație. Trebuie menționat observația, că motorul în sine nu poate să fie foarte precis din cauza rezoluției. [16]

În cadrul proiectului motoarele servo utilizați sunt motoare servo analogice, furnizate de către firma HiTec cu seria de HS-475HB și HS-645MG. Cel din urmă este un servo motor de cuplu ridicat, cu rulment dublu, cu un motor de curent continuu cu 3 poli și cu magneți ferită, cu 3 angrenaje metalice și încă un angrenaj din metal rezinat, cu un potențiometru de calitate înaltă de 5K ohmi și cu un circuit IC hibrid pentru controlul motorului.[19] Despre celălalt motor nu avem așa de multe informații așa de detailate ceea ce privește structura interioară. De știut este că în interior are un motor de curent continuu cu perii din metal feromagnetic, cu angrenaj din metal rezinat, mă gândesc că are un potențiometru tot de 5K ohmi și un circuit IC pentru control.[20]

Am vorbit despre circuit IC, care comandă motorul, dar să vedem ce este defapt. Un microcontroler trimite foarte mai multe impulsuri către servo, cu lărgimea impulsului între 1 ms și 2 ms. 50 de impulsuri ajung în într-o secundă, și acest IC, amplificator, verifică tot timpul, dacă trebuie ca motorul să fie rotit sau nu. Dacă sesizează că trebuie rotit, trimite un semnal scurt către motor, ca să se rotească. În cele mai multe aplicații funcționează bine, iar din cauza că nu este în continuu alimentat (este rotit doar pentru un moment, când primește semnal de la amplificator), nu se poate folosi cuplul și viteza maximă a motorului. [22]

Problema cu motoare servo analogice, cum avem și noi, este că nu lucrează cu aceeași cuplu tot timpul. Valoarea cuplului depinde de diferența de poziție comandată și poziția actuală. Cu cât această diferență este mai mică, cu atât și cuplul va fi mai mic. În realitate dacă diferența este mică, cuplul motorului va fi foarte mică și din această cauză, nu va putea mișca brațul și de aceea se mișcă doar foarte puțin și se aude un zgomot.

În figura 2.4.6 este ilustrat un amplificator liniar cu tranzistori complementari.

Figura 2.4.6 Amplificator linear

Sensul de rotație în acest caz, va depinde de tranzistorul care comută. Dacă T1 comută și T2 închide atunci motorul se va roti în sens invers față de cazul in care T1 se închide și T2 se deschide.

Figura 2.4.7 Amplificator diferențial

Figura de mai sus (figura 2.4.7) ilustrează un controler de comandă pentru servomotoare cu un amplificator diferențial. Sensul de rotație a motorului va depinde care tranzistorii care se comută, astfel va roti într-un sens, dacă este alimentat T1 și T4 și în sens invers în cazul în care se comută perechea format din tranzistorii T3 și T2.

Motorașele servo utilizate în cadrul proiectului, sunt comandate după principiul prezentat în figura 2.4.7. Dacă s-ar demonta motorul, în interiorul său am putea găsi o placă de circuit electric, care va conține atât tranzistoarele, cât și un circuit amplificator, montat separat.

Caracteristicile motorașelor servo, sunt cuprinse în tabelul de mai jos:

Tabelul 2.4.7 Caracteristicile motoarelor servo utilizați[19][20]

În cazul robotului din proiect, este utilizat 5 motorașe de tip HS-645MG pentru rotirea bazei robotului (articulația 1), două pentru articulația 2 (partea superioară a brațului), unu pentru articulația 3 (antebrațul) și unu pentru articulația 5, care ajută la rotirea gripperului în sens orar sau anti orar (stânga și dreapta). Motorașele HS-475HB se regăsesc de două ori în structura constructivă a robotului și sunt utilizați pentru mișcarea articulației 4 pe axă verticală, deci în sus-jos, respectiv pentru închiderea și deschiderea gripperului.

Capitolul 3. Proiectarea sistemului de comandă

3.1 Noțiuni introductive 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și 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 și împreună cu dispozitivul cel mai necesar, generatorul de tact extern. Î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.[23][24]

În general un microcontroler conține de obicei următoarele:

CPU (unitatea centrală de prelucrare)

Dispozitive/interfețe de intrare-ieșire (I/O) seriale și/sau paralele

generator de tact la care se adaugă din exterior un cristal de cuarț sau un circuit RC în aplicații mai simple

memorie volatilă RAM

memorie nevolatilă ROM/PROM/EPROM/EEPROM (depinde de model)

controler de întreruperi

controler DMA (pentru accesare directă memoriei)

numărătoare/temporizatoare

convertoare A/D, D/A.

și eventual alte periferice (depinde de model)

Cu toate cele enumerate de mai sus schema bloc dezvoltată al unui microcontroler în caz general arată conform figurii de mai jos:

Figura 3.1.1 Schema bloc generalizată a unui microcontroler[23]

Se poate observa în figura 3.1.1 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 intermediul magistralei de date de la memoria program. Structura Harvard fiind foarte răspândit, se poate regăsi în microcontrolerele, fapt după care știm că instrucțiunile sunt stocate în memoria ROM iar datele în memoria RAM. Magistrala de date și cea de adrese pot fi izolate sau multiplexate.

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 stare. Prin acest registru se pot genera și întreruperile către unitatea centrală.

3.2 Microcontrolerul ATmega328PU

Nucleul Atmel AVR® conține un set de instrucțiuni bogat cu 32 de registre de uz general. Fiecare registru este conectat direct la unitatea aritmetică și logică ALU, care acceptă să fie accesat de doi regiștri independenți sub o singură instrucție executat într-un ciclu program. Arhitectura ce rezultă din această structură este mult mai eficient din punct de vedere a programării astfel rezultând un microcontroler CISC convențional de aproape 10 ori mai rapid.

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 utiliza pe chip, 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.2.1 Microcontrolerul ATmega328P-PU

Termenul de RISC este frecvent întâlnită în literatura 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 arhitectura von-Neumann ș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: 8/K octeți de memorie In-System-Programmable Flash cu, capacități Read-While-Write, 1K bytes memorie EEPROM, 2K bytes 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 economisire selectabile a consumului 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ță” (oprește) oscilatorul dezactivând toate celelalte funcții ale chip-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.

Modul de reducere ADC al zgomotului oprește 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.

Microcontrolerul este fabricat utilizând tehnologia de memorie non-volatilă Atmel de nivel ridicat. Memoria 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 de memorie convențională non-volatilă (reprogramabilă) sau de un program de „bootare”(bootloader) 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.

Diagrama bloc a microcontrolerului este afișat în Anexa1 iar diagrama pinilor în Anexa2

3.3 Microcontrolerul ATtiny85

În capitolul anterior am explicat ce beneficii are un microcontroler AVR îmbunătățit cu arhitectura RISC. Astfel putem spune că și microcontrolerul ATtiny85 beneficiază de acești trăsături, fiind un microcontroler care face parte din familia CMOS , lucrând pe 8 biți și este bazat pe arhitectura AVR RISC, la fel ca și modelele ATtiny25/45.

Faptul că ATtiny85 este un microcontroler RISC ne arată că acesta are un set redus de instrucțiuni dar foarte necesare și utile. Prin executarea unor instrucțiuni precise într-un singur ciclu de tact, ATtiny85 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.

Nucleul AVR combină un set de instrucțiuni bogat pe 32 de registre generale accesabile. 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 ATtiny85 prezintă următoarele caracteristici: memorie de tip ”In-System Programmable Flash” de 8K bytes, memorie EEPROM de 512 bytes, 256 bytes memorie SRAM, 6 linii de intrare-ieșire cu scopuri generale, 32 de regiștri pentru uz general, un singur Timer/Counter(temporizator/numărător) pe 8 biți cu mod de comparare și încă unu, tot pe 8 biți dar de mare viteză, interfață universală serială, întreruperi interne și externe, convertor analog-numeric pe 10 biți în 4 canale, temporizator programabil Watchdog cu oscilator intern și 3 moduri de economisire selectabile a consumului de energie.

Modul Idle oprește pe CPU (unitatea centrală de prelucrare) lăsând pe SRAM, temporizatoarele/numărătoarele, convertoarele analog-numerice, comparatoarele analogice și sistemul de întreruperi să funcționeze în continuare.

Modul Power-down salvează conținutul registrelor, oprind funcționalitatea întregului controlerului până la următoarea întrerupere sau până la o resetare hardware.

Modul de reducere zgomot la ADC oprește Unitatea Centrală de Prelucrare și toate modulele de intrare-ieșire pentru minimizarea zgomotelor respectiv perturbațiilor în timpul conversiei analog-numeric. [26]

Microcontrolerul este echipat de memoria non-volatilă Atmel de nivel ridicat. Memoria 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 de memorie convențională non-volatilă (reprogramabilă) sau de un program de „bootare”(bootloader) on-chip rulat pe CPU. Acesta poate utiliza orice interfață pentru a descărca aplicația-program în Application Flash Memory.

Acest microcontroler din cauza că necesită resurse puține este de ajuns de a folosi în cadrul proiectului cu rolul de a genera semnalele de întrerupere către celălalt microcontroler în fiecare 20 de milisecunde.

Diagrama bloc a microcontrolerului este afișat în Anexa3 iar diagrama pinilor în Anexa4

3.4 Interfața de dezvoltare Visual Micro

Visual Micro este un așa-numit extensie pentru Microsoft Visual Studio 2008-2015 și pentru Atmel Studio, care dă posibilitatea ca orice proiect Arduino să poate fi dezvoltat, compilat și după aceasta încărcat pe orice Arduino în timp ce ia caracteristicile foarte avantajoase de la Visual Studio sau Atmel Studio.

Această interfață de dezvoltare este compatibil total cu mediul de dezvoltare Arduino și folosește aceeași librării, același cod sursă și același instrumente de dezvoltare.

Diferența între Arduino IDE și Visual Micro se află în interfață. Astfel cel din urmă oferind un mediu de dezvoltare mai avansată și profesională și permite o dezvoltare mai avansată și mai ușoară decât Arduino IDE actuală.

În descriere, până acuma, am folosit de mai multe ori termenul ”IDE”. Acesta este un termen standardizat în industrie și ceea ce înseamnă este un Mediu de Dezvoltare Integrat (Integrated Development Environment). Aceasta este o aplicație software care încorporează un editor de cod sursă și construiește uneltele, instrumentele ca și un compilator și un sistem de depanare (debugging system). Această aplicație software IDE este folosit pentru a scrie, edita, construi și testa aplicația scrisă. În timp ce IDE-ul lui Arduino oferă un IDE de nivel inițial de bază, Visual Micro împreună cu Microsoft Visual Studio sau Atmel Studio (depinde în care mediu folosim extensia) oferă un IDE îmbunătățit și mai funcțional. [27]

Modulul de instrumente GCC constă în toate instrumentele care rulează în spate (background) dacă selectăm comenzile ”build” sau ”upload”. Aceste instrumente sunt in principal compilatorul GCC și linker-ul și instrumentul de încărcare (de obicei avrdude.exe). Fiindcă lucrăm cu IDE, nu trebuie să lucrăm direct cu programele de unelte sau cu modulele deoarece aceste sunt controlate de IDE în spate. Cu toate acestea modulul GCC este un set de linii de comandă de programe independente (*.exe) care pot fi utilizați și fără IDE.

Driverul USB VCP (Virtual Com Port) este deasemenea furnizat de Arduino (în cazul în care avem la dispoziție o placă Arduino) sau de producătorul plăcii și este responsabil pentru comunicarea dintre placa utilizată și calculator PC.

În figura 3.4.a este prezentat cum arată mediul de dezvoltare fără Visual Studio / Atmel Studio, deci ce ne oferă furnizorul de hardware Arduino. Astfel putem vedea, că avem un IDE făcut de Arduino pentru compilare, modul care ajută la compilare și la încărcarea fișierului și driverul care va ajuta pe calculatorul nostru să comunice cu microcontroler.

În figura 3.4.b se vede foarte bine, care este diferența între mediul de dezvoltare dintre Arduino IDE și Visual Micro astfel putem aștepta multe diferențe și între interfața de dezvoltare. Așa cum reiese de pe figură și cum este exprimat și mai sus, utilizând pe Visual Micro, aceasta va înlocui IDE-ul nostru original, care nu va fi dezinstalat și vom putea folosi în cazul în care o să mai avem nevoie de el. Visual Micro este numit ca și extensie pentru că se integrează în Visual Studio sau Atmel Studio și adaugă funcții noi pentru acești medii de programare, permițând astfel programarea altor plăci. În acest caz modulul GCC Toolchain și driverul VCP va rămâne la fel și nemodificat, doar că în acest caz, va fi controlat de Visual Micro nu de IDE-ul original. [28]

3.4.1 Instalarea extensiei Visual Micro

Pentru a putea folosi extensia Visual Micro, avem nevoie de un mediu de programare Visual Studio sau Atmel Studio, care ne va oferi un IDE performant pentru compilarea codului. Având mai multă experiență în programare, eu am avut instalat deja mediul Visual Studio Community 2015, cu care am mai făcut aplicații, precum și aplicația pentru comandarea robotului din cadrul proiectului. Acest mediu de programare este compatibil cu Visual Micro și la asta pot să adaug/instalez extensia respectivă.

Instalarea extensiei se va începe cu descărcarea lui de pe pagina https://marketplace.visualstudio.com/items?itemName=VisualMicro.ArduinoIDEforVisualStudio. După ce am salvat fișierul, cu dublu click îl instalăm. Asta nu necesită pricepere, trebuie să dăm click pe next și la sfârșit pe finish. Partea mai grea urmează doar după aceasta, când trebuie configurat în Visual Studio.

Dacă am instalat pentru prima dată, fereastra ”Configuration Manager”, unde putem configura sistemul nostru. Visual Micro trebuie să știe versiunea și locația, unde aplicația Arduino IDE era instalat mai înainte., sau alte aplicații care au IDE similare, cum sunt și mpIDE, Energia sau Wiring.

Figura 3.4.1.1 Fereastra ”Configuration Manager” [29]

În figura de mai sus este prezentat fereastra Configuration Manager. Pe figură sunt numerotate următoarele căsuțele în care trebuie specificat:

Tipul și versiunea IDE instalat.

Locația mapei (Folderului) unde IDE a fost instalat

Dacă până acuma nu am descărcat nici un IDE, extensia ne oferă soluția să îl descărcăm și să-l instalăm acuma

Cele marcate cu acest număr sunt setări opționale pentru cei mai avansați și nu necesită să le completăm la instalarea inițială. Sketchbook location specifică locația unde Visual Micro se va căuta după librăriile utilizatorului. Se recomandă să lăsăm liber, că atunci extensia va utiliza locația IDE-ului original.

Dacă am trecut peste acești pași, înseamnă că am terminat instalarea și am configurat setările, astfel sistemul nostru este pregătit pentru a fi utilizat. [29]

În cazul în care lucrăm cu plăci diferite, probabil vom fi obligați să lucrăm cu un alt IDE, sau și în cazul în care avem mai de a folosi multe versiuni de Arduino IDE, suntem obligați să le instalăm acești IDE. Cele instalate vor fi cuprinse într-o listă, ce vom putea găsi pe toolboxul extensiei Visual Micro, de unde pe urmă putem selecta pe ori care dorim să folosim.

Figura 3.4.1.2 Lista cu IDE instalate

În dreapta acestei listă găsim o altă listă și anume lista acelei plăci, pentru care IDE-ul nostru poate să compileze codul sursă scrisă de noi. De aici vom selecta iarăși placa noastră.

Figura 3.4.1.3 Lista cu plăcile de dezvoltare cunoscute de IDE selectat

3.4.2 Programarea microcontrolerului ATmega328P-PU

Pentru a programa un microcontroler suntem nevoiți să conectăm cumva la un calculator cu care să se comunice. Pentru aceasta avem nevoie de un port deschis de comunicare atât pe calculatorul nostru cât și în microcontroler. Sunt microcontrolere care au deja implementat aceea funcție în care el poate comunica cu calculator direct conectând cu USB. Sunt microcontrolere care au doar o interfață serială având pinii RX (Receive) și TX (Transmit) pentru a comunicare cu exterior, ceilalți care sunt un pic mai deștepți cunoaște și protocolul USART, care acceptă programarea serială. La fel este dotat și microcontrolerul nostru ATmega328P-PU.

Legătura între calculator PC și între microcontroler am realizat folosind un adaptor USB – TTL având pe placa integratul CP2102. Acest integrat este un controler USB-UART care ajută adaptarea semnalului RS-232 la protocolul cel mai frecvent folosit în zilele de azi USB. Acest integrat cuprinde un controler complet de USB 2.0 cu viteză crescută, un transmițător-receptor USB, un oscilator, EEPROM și o magistrală serială asincronă de date (UART) totul într-o cutiuță de tip MLP-28 de dimensiuni 5 x 5 mm. [30]

Figura 3.4.2.1 Adaptorul CP2102

Interfața asincronă UART al adaptorului CP2102 pe lângă semnalele de date TX (transmit) și RX (receive) mai știe să folosească și semnalele de control RTS/CTS, DSR,/DTR, DCD și RI (X-On/X-Off handshake). Această interfață permite o gamă largă de formate de date și rate de transfer (Baud Rate).

Programarea microcontrolerului se face folosind acest adaptor. Conexiunea se face după figura următoare:

Figura 3.4.2.2 Conectare ATmega328 la UART

Conexiunile sunt făcute pe placa de dezvoltare, noi trebuie doar să conectăm adaptorul CP2102 la calculator, folosind un cablu micro USB – USB. După conectare trebuie să instalăm driver-ul adaptorului de pe pagina de web a producătorului. Descărcăm și conform sistemului de operare pe care îl folosim instalăm fișierul CP210xVCPInstaller_x64 pentru sisteme cu 64 de biți sau CP210xVCPInstaller_x86 pentru sisteme cu 32 de biți. Driverul este compatibil sistemele de operații Windows XP/Server2003/7/8/8.1/10 sau și cu altele cum sunt Linux, Android sau Macintosh OSX.

După instalare reconectăm adaptorul și verificăm la Device Manager numărul portului serial pe care noi vom putea folosi în cadrul programării microcontrolerului sau la comunicarea cu microcontroler.

Figura 3.4.2.3 Port serial CP2102

În cazul meu, cum se vede și pe figura 3.4.2.3 portul serial se află la COM15, astfel înainte de a programa sau a comunica cu microcontroler trebuie să fie selectat ca port de comunicare portul COM15.

Figura 3.4.2.4 Pașii pentru deschiderea proiectului nou

Primul pas pentru programare este să deschidem programul Visual Studio. Din bara de sus alegem meniul File -> New -> Project.. . Ne va deschide fereastra 2 unde trebuie să căutăm pe Visual Micro în Installed -> Templates -> Visual C++. Din secția din dreapta vom alege opțiunea Arduino Project. Mai rămâne să dăm un nume proiectului și să selectăm unde dorim să salvăm, după care apăsând butonul OK, se va deschide fișierul programului.

Dacă cineva a mai lucrat în interfața Arduino va știe cum se lucrează, structura programului și instrucțiunile fiind la fel, nu va avea dificultăți. Pentru ceilalți ofer să studieze un pic cum anume se poate programa în Arduino, că restul va fi la fel.

Un program de exemplu pentru clipirea (blinking) unui LED este următoarea:

// funcția setup este rulat o singură dată când pornim microcontrolerul sau îl resetăm

void setup() {

// inițializează LED-ul ce se regăsește pe orice placa Arduino

// conectat la pinul D13

pinMode(LED_BUILTIN, OUTPUT);

}

// funcția loop va rula tot timpul pană când microcontrolerul este alimentat

void loop() {

digitalWrite(LED_BUILTIN, HIGH); // aprinde becul

delay(1000); // așteaptă o secundă

digitalWrite(LED_BUILTIN, LOW); // stinge becul

delay(1000); // așteaptă o secundă

}

Figura 3.4.2.5 Încărcarea programului pe microcontroler

După ce am scris programul din toolBox-ul de sus trebuie să selectăm IDE-ul pe care vom folosi, în cazul nostru Arduino 1.6/1.8 placa de dezvoltare pe care o utilizăm. Noi având doar microcontrolerul, nu avem nici o placă iar prin documentație știu că placa Arduino Uno folosește tot acest tip de microcontroler. Așa că în continuare voi alege placa Arduino / Genuino Uno și portul serial COM15. Ca să ne verificăm dacă codul sursă este corect scris și nu avem greșeli de implementare apăsăm buton Compilare (Figura 3.4.2.5). Dacă totul este în regulă și nu avem greșeli sau le-am corectat putem încărca programul în microcontroler apăsând butonul de Încărcare (Figura 3.4.2.5)

Astfel parcurgând acești pași, putem încărca orice program scris pe microcontrolerul ATmega328P într-un limbaj foarte asemănător cu C++ în același mod cum am programa în interfața Arduino. Motivul pentru care eu am ales totuși această interfață, Visual Micro, este că programul rulează mai ușor, compilatorul fiind mai optimizat față de interfața Arduino.

3.4.3 Programarea microcontrolerului ATtiny85

Programarea microcontrolerului ATtiny85 seamănă cu programarea celuilalt microcontroler, dar nu este la fel. La acest microcontroler lipsesc pinii de date RX și TX așa că nu putem folosi în mod direct adaptorul CP2102 pentru programarea lui, astfel vom avea nevoie de un programator ISP care programează microcontrolerele prin pinii MISO, MOSI și SCK. Acest tip de programator se numește USBISP/USBISP.

Un programator USBASP se poate găsi de la 10-20 lei în sus la noi, dar dacă nu vom mai folosi, de ce să cheltuim și la asta, dacă putem să facem noi unu? În capitolul 3.4.2 am prezentat cum anume se poate programa un microcontroler ATmega328P simplu printr-un adaptor. Am căutat pe internet și am găsit un mod în care putem să convertim acest microcontroler astfel încât să funcționeze ca un programator ISP. Dacă am avea pe asta am putea să programez pe ATtiny85 cu ajutorului unui microcontroler ATmega328 pe care îl cunoaștem deja.

Primul lucru este să modific atunci pe ATmega328 să funcționeze ca și un programator. Pentru asta urmărim pașii de programare din capitolul 3.4.2, iar de data asta vom încărca programul ArduinoISP , pe care se poate găsi pe următoarea pagină web: https://github.com/rsbohn/ArduinoISP/blob/master/ArduinoISP/ArduinoISP.ino Copiem codul sursă de aici și lipim în Visual Micro și încărcăm programul pe microcontroler.

Cu ajutorul interfeței Arduino IDE trebuie să descărcăm modulul care compilează programul realizat pe microcontrolerul ATtinyXX. Pentru asta deschidem interfața Arduino și intrăm în File -> Preferences unde la lista „Addition Boards Manager URLs” adăugăm textul

Figura 3.4.3.1 Adăugare site de sincronizare pentru plăci cunoscute

cu linkul care conține informații despre modul de descărcare a compilatorului. Dăm click pe butonul OK și mergem la meniu Tools->Board->Boards manager… unde se va deschide o fereastră cu plăcile deja cunoscute. Din lista Type alegem „Contributed”. Din lista filtrată

3.4.3.2 Lista cu plăci cunoscute

obținută alegem pe attiny by David A. Mellis și îl instalăm, după care cu Close închidem fereastra. Până aici avem un microcontroler pregătit pentru programare și un alt microcontroler care urmează a fi programat. Rămâne să le conectăm între ele și să programăm pe ATtiny85.

3.4.3.3 Schema de principiu a conectării ATtiny85 la ATmega328

Am realizat schema de mai sus conectând ATtiny85 la ATmega328 cu următoarele pini: VCC – 5V; GND – GND; Pin 2 – Pin 13; Pin 1 – Pin 12; Pin 0 – Pin 11; RESET – Pin 10; și un condensator la ATmega328P de 10uF între RESET și GND.

După ce am realizat conexiunile, deschidem interfața Arduino IDE, în care vom scrie codul sursă. Un exemplu și aici este clipirea (blinking) a unui LED:

#define LED_BUILTIN 0 //pentru ATtiny85 ledul se află la pinul 0

// funcția setup este rulat o singură dată când pornim microcontrolerul sau îl resetăm

void setup() {

// inițializează LED-ul ce se regăsește pe orice placa Arduino

// conectat la pinul D13

pinMode(LED_BUILTIN, OUTPUT);

}

// funcția loop va rula tot timpul pană când microcontrolerul este alimentat

void loop() {

digitalWrite(LED_BUILTIN, HIGH); // aprinde becul

delay(1000); // așteaptă o secundă

digitalWrite(LED_BUILTIN, LOW); // stinge becul

delay(1000); // așteaptă o secundă

}

După ce am scris codul sursă alegem compilatorul (placa) conform figurii 3.4.3.4. Acest meniu se găsește la Tools -> Board și alegem ATtiny25/45/85 de pe listă. Așa vom avea alte opțiuni de selectat și anume Procesorul. Aici vom selecta pe ATtiny85 că pe asta dorim să-l programăm. Mai jos avem un Clock, unde după cum dorim noi selectăm frecvența. Atenție, să fie selectat Internal și nu External! Ultimul este folosit în cazul în care tacul va da un oscilator extern. Selectăm portul COM15 și la Programmer selectăm pe ArduinoISP, astfel zicem compilatorului tipul programatorului. Un sfat bun este ca înainte de a programa să alegem și opțiunea Burn Bootloader, pentru a modifica setările microcontrolerului referitor la frecvența și modul de lucru. După ce am setat totul urmează programarea în sine utilizând funcția Sketch -> Upload Using Programmer. Dacă totul am făcut bine, la sfârșit primim mesajul de confirmare „Done!”

3.5 Realizarea plăcii de dezvoltare pentru comanda robotului

Desenul sau numit layoutul am realizat folosind programul Altium Designer 17 [17]. Acest program ne ajută să realizăm orice placă PCB. Pornind de la schema electrică putem să ajungem rapid la vizualizarea în 3D a plăcii proiectat. Etapele de proiectare se încep cu realizarea schemei electrice. Aici adăugăm fiecare component în parte și le conectăm, virtual, trasând firele între ele. După ce am terminat, și am obținut schema electrică ce vom folosi în continuare, trebuie actualizat aparițiile componentelor folosind comanda Annotate (Adnotare) din meniul Tools -> Annotation -> Annotate Schematics Quietly. Această funcție identifică componentele într-un mod unic, atribuind referințe unice de componente la fiecare componentă din proiect. Astfel fiecare element în parte primește un cod unic în proiect. Programul va identifica fiecare component, după acest cod pentru a evita confuzia între elemente.

Schema electrică fiind gata și adnotat, urmează să adăugăm componentele pe placa virtuală. Aceasta se face utilizând funcția Update PCB Document, din meniul Design -> Update PCB Document <nume fișier>. După ce am dat click, va apărea o fereastră cu toate traseele posibile respectiv toate componentele folosite. Pe această fereastră, jos, vom găsi două butoane: Validate și Executate. Vom apăsa în această ordine, timp în care programul își verifică toate componentele și le trasează între ele cu o linie întreruptă pentru a ajuta munca noastră în continuare. Se va deschide fereastra cu placa noastră, și lângă ea sunt puse toate componentele. Urmează deci să facem puțină ordine și să le punem la loc, așa cum dorim să fie așezați. După ce am făcut și această etapă, să desenăm traseele, așa cum vor ieși și pe placă. Pentru aceasta, programul ni le oferă opțiunea de trasare automată, ceea ce este o opțiune foarte bună, dar nu este garantat că reușește să le traseze mai ales la un proiect mai complicat. Așa că este mai bine să le trasăm noi, manual, că va ieși mult mai clar pentru noi și e mai posibil că evităm unele greșeli ce pot apărea în timpul trasării automate.

După ce am realizat traseele și am salvat documentul, urmează să listăm schema. Listarea se face pe orice foaie cu o imprimantă laser. Eu prefer să listez pe o foaie lucioasă (cerată) și reglez imprimanta să listeze cât mai închis, ca să intră cât mai multă ”cerneală” (toner topit) pe foaie.

Observația este că partea cu traseele trebuie printat cu ”citire din dreapta” iar textul trebuie printat oglindit (invers, verso).

Urmează să o curățăm partea de cupru a plăcii. Astfel luăm o bucățică de hârtie abrazivă cu duritatea de 400-500 și se șlefuiește placa ușor, pe direcția diagonalelor pe sensuri opuse. După aceea o curățăm cât mai bine posibil cu acetonă sau cu alcool pe un prosop de hârtie. Trebuie să fim atenți la petele de grăsimi, care sunt contra noastră la realizare.

Placa fiind curățată, urmează să punem foaia listată cu fața în jos pe placă, deci partea printată a foii să fie pe parte de cupru a plăcii, și îndoim foaia ca să nu se miște peste placă. Între timp pregătim și fierul de călcat, pe care îl încălzim aproape la maxim. Punem o foaie albă curată între placă și fierul de calcat ca să îl protejăm, după care îl aplicăm apăsând puternic în jos și încercăm să nu glisăm, pentru că stratul de suprafață din plastic al hârtiei lucioase se va topi instantaneu, formând un strat temporar alunecos. După câteva minute putem mișca fierul de călcat încet până când întreaga placă este acoperită. Timpul total de călcare este de aproximativ 5-10 minute.

Acuma punem placa imediat într-o tavă cu apă fierbinte timp de vreo 15 minute. O parte din hârtie va începe să iasă imediat. Trebuie să înlăturăm orice hârtie rămasă de pe placă, având grijă la trasee, deci să nu încercăm să depărtăm cu unghiile. Aproximativ peste 20 de minute traseele vor fi clare. Cazul în care urmele sunt încurcate în orice fel, putem curăța tonerul topit cu acetonă și începem de la început cu curățarea plăcii, sau dacă nu este așa de grav, putem corecta cu un marker permanent.

Urmează partea riscantă în realizarea plăcii PCB, că trebuie să punem placa într-un container din plastic, umplut cu o soluție corozivă, în cazul nostru în clorură ferică. Să nu lăsăm soluția să ajungă pe nici un obiect din metal sau pe corp omenesc. Lăsăm placa în clorură până când iese cuprul nedorit de pe ea. În funcție de starea clorurei, aceasta poate dura și 15-20 de minute, iar putem ajuta să iasă mai repede mișcând un pic în soluție. Trebuie să fiim atenți să nu lăsăm prea mult timp în soluție, că în acest caz s-ar putea să scoate și ceea ce nu ar trebui. Ștergem tonerul rămas de pe suprafața cu cupru cu acetonă și ne va rămâne doar partea lucioasă a traseelor. După aceasta putem găuri locurile lăsate pentru componente cu burghiu de 0.5 mm sau 0.7 mm sau la cât am fixat noi. După ce am găurit toate găurile, a rămas doar să lipim toate componentele pe placă și să încercăm cu un test, dacă am proiectat corect sau dacă sunt undeva greșeli. [18]

Urmărind instrucțiunile de mai sus am realizat și eu placa mea de dezvoltare pentru acest proiect. Schema electrică a plăcii se regăsește în Anexa 5. Tabelul următor reprezintă componentele electrice utilizate pe schema electrică.

Tabelul 3.5.1 Tabelul componentelor

Pentru schema electrică de mai sus am obținut placa cu traseele din figura 3.5.2.

După obținerea plăcii virtuale, am listat schema cu trasee cu imprimanta HP LaserJet Pro MFP M26a pe o hârtie lucioasă.

Am curățat placa cu hârtie abrazivă de 400 după care am șters frumos cu acetonă
(figura 3.5.4). Placa curățată fiind pregătită, am pus cu fața în jos pe partea din cupru al plăcii, pe care după asta am pus fierul de calcat, încălzit la maxim, figura 3.5.5

Figura 3.5.5 Aplicarea fierului de călcat

După 7-8 minute am scos placa de sub fierul de călcat și am pus într-o tavă umplută cu apă fierbinte, unde am scos atent hârtia de pe placă fără să îl zgâriez, obținând astfel placa cu traseele cu toner topit pe ea, care o să protejeze partea de cupru de la soluția de corodare (figura 3.5.6-(1)). După asta, am pus placa în soluția numită clorură ferică, pentru a scoate cuprul de pe dinafara traseului (2). Am legat cu o sârmă ca să pot să scot mai ușor și cu care în timp ce este băgat în soluție, pot să-l mișc. Mișcarea aceasta ajută cuprul să se dezlipească mai ușor. Trebuie să fiim atenți să nu lăsăm prea mult timp în soluție-acid, că după un timp avem șansa că se dezlipește și ce nu am dori. După ce am văzut că a rămas doar traseul (cel mult 16 minute), am scos placa din soluție, având grijă să nu ating soluția cu mână, altfel lasă urme grave în piele. L-am spălat la chiuvetă, după care am curățat iarăși cu acetonă (3) ca să scap de tonerul lipit și să văd doar cuprul rămas. Rezultatul se vede pe figura 3.5.6, unde pe lângă pașii explicate mai de sus, este afișat placa finală (4), care conține doar circuitele proiectate anterior.

Figura 3.5.6 Pașii de corodare a plăcii

Am obținut placa, urmează deci găurirea locurilor. Pentru aceasta avem nevoie de un burghiu cu diagonală de 1 mm pentru fiecare component, cu excepția mufei ATX de alimentare, unde avem nevoie de un burghiu de 1.5 mm. (figura 3.5.7)

Figura 3.5.7 Găurirea circuitului

După ce toate găurile sunt disponibile, urmează lipirea componentelor pe placă. Este ultimul pas pentru obținerea plăcii circuitului. După ce am terminat și cu asta, urmează să le legăm firele fiecare la locul lui, care sunt necesare pentru controlarea robotului, respectiv motorașele robotului. După ce suntem gata și cu asta (figura 2.3.7) va urma partea de test, când în primul punem placa sub tensiune, conectând sursa exterioară la rețea, după care conectăm placa la calculator, pornim aplicația RobotArm și după ce am făcut conexiunea cu placa (capitolul 4.3) și am setat conexiunile (capitolul 4.4) încercăm să dăm comenzi robotului. Dacă am lucrat bine, robotul va executa cerințele noastre și va aștepta să îl comandăm.

Figura 2.3.7 Placa realizată sub tensiune și conectată la robot

Capitolul 4. Proiectarea programului de interfață PC

4.1 Mediul de dezvoltare Visual Studio – Windows Form

4.2 Instalarea programului

4.3 Conectare la placa de dezvoltare

4.4. Setarea legăturilor de pe placă respectiv parametrilor de control

4.5 Comandarea articulațiilor

4.6 Programarea robotului

Bibliografie

Mihaiela Iliescu, Istoria și Filosofia roboților industriali, 2016

Needham, Joseph (1991). Science and Civilization in China: Volume 2, History of Scientific Thought. Cambridge University Press. ISBN 0–521-05800–7

http://blog.salvius.org/2014/01/a-history-of-robotics-yan-shi-artificer.html

https://en.wikipedia.org/wiki/Su_Song

William Godwin (1876). „Lives of the Necromancers”

http://kerrykirsch.com/History-Iron_Hand.html

http://spectrum.ieee.org/automaton/robotics/industrial-robots/george-devol-a-life-devoted-to-invention-and-robots

https://www.used-robots.com/education/the-history-of-industrial-robots

http://yamaho.eu/files/roboti.pdf

https://cdn.sparkfun.com/assets/learn_tutorials/5/2/6/servo-guts_1.jpg

https://cdn.sparkfun.com/assets/learn_tutorials/5/2/6/servo-samples.jpg

http://img.dxcdn.com/productimages/sku_148051_4.jpg

https://c2.staticflickr.com/6/5472/31084586086_90cf3e51e9_o.jpg

https://arduino-info.wikispaces.com/Servos

https://learn.sparkfun.com/tutorials/hobby-servo-tutorial

https://ebldc.com/?p=48

http://www.altium.com

http://www.apcc.tk/diy-projects/diy-pcb

http://www.robotshop.com/media/files/pdf/hs645mg.pdf

http://www.swarthmore.edu/NatSci/ceverba1/Class/e5/E5Lab2/Servo%20Hitec%20HS-475hb%20spec.pdf

zeus.nyf.hu/~elat/Elir1/Szervomotorok.doc

http://kecskemetircmodell.blog.hu/2011/03/22/hogyan_mukodnek_a_szervok

http://www.scritub.com/stiinta/informatica/Notiunea-de-microcontroller-De95575.php

Liviu Kreindler, Răducu Giuclea, „Bazele Microprocesoarelor”, 1998 București, MATRIX ROM

http://www.atmel.com/Images/Atmel-42735-8-bit-AVR-Microcontroller-ATmega328-328P_Datasheet.pdf

http://www.atmel.com/images/atmel-2586-avr-8-bit-microcontroller-attiny25-attiny45-attiny85_datasheet.pdf

http://www.visualmicro.com/page/User-Guide.aspx?doc=what_is_visual_micro.html

http://www.visualmicro.com/page/User-Guide.aspx?doc=How-The-Tools-Play-Together.html

http://www.visualmicro.com/page/User-Guide.aspx?doc=First-steps.html

https://www.sparkfun.com/datasheets/IC/cp2102.pdf

Anexa 1. Diagrama bloc pentru microcontrolerul ATmega328p-PU

Anexa 2. Diagrama pinilor pentru microcontrolerul ATmega328P-PU

Anexa 3. Diagrama bloc pentru microcontrolerul ATtiny85

Anexa 4. Diagrama pinilor pentru microcontrolerul ATtiny85

Anexa 5. Schema electrică a circuitului de control RobotArm

Similar Posts