Str. Științei Nr. 2, cod poștal 800146, Galați, România, tel/fax: +0236 4 70 905, e-mail: aciee@ugal.ro, web: www.aciee.ugal.ro Anexa 8 la… [630227]
UNIVERSITATEA „DUNĂREA DE JOS” DIN GALAȚI
FACULTATEA DE AUTOMATICĂ, CALCULATOARE, INGINERIE
ELECTRICĂ ȘI ELECTRONICĂ
Str. Științei Nr. 2, cod poștal 800146, Galați, România, tel/fax: +0236 4 70 905, e-mail: [anonimizat], web: www.aciee.ugal.ro
Anexa 8 la Regulamentul de întocmire a proiectelor de diplomă și a lucrărilor de disertație
PROIECT DE DIPLOMĂ / LUCRARE DE
DISER TAȚIE
Îndrumător proiect/ Coordonator științific,
S.l. dr. ing. Andrei Mihaela
Absolvent: [anonimizat]
2019
UNIVERSITATEA „DUNĂREA DE JOS” DIN GALAȚI
FACULTATEA DE AUTOMATICĂ, CALCULATOARE, INGINERIE
ELECTRICĂ ȘI ELECTRONICĂ
Str. Științei Nr. 2, cod poștal 800146, Galați, România, tel/fax: +0236 4 70 905, e-mail: [anonimizat], web: www.aciee.ugal.ro
SPECIALIZAREA: Electronică Aplicată
BRAȚ ROBOTIC CO MANDAT WIRELESS
Coordonator științific,
S.l. dr. ing. Andrei Mihaela
Absolvent: [anonimizat]
2019
UNIVERSITATEA „DUNĂREA DE JOS” DIN GALAȚI
FACULTATEA DE AUTOMATICĂ, CALCULATOARE, INGINERIE
ELECTRICĂ ȘI ELECTRONICĂ
Str. Științei Nr. 2, cod poștal 800146, Galați, România, tel/fax: +0236 4 70 905, e-mail: [anonimizat], web: www.aciee.ugal.ro
Anexa 1 la Regulamentul de întocmire a proiectelor de diplomă și a lucrărilor de disertație
Departamentul __________________________________________________________________________
PROIECT DE DIPLOMĂ/LUCRARE DE DISERTAȚIE
Numele si prenumele absolvent: [anonimizat]: __ ___________________________________________________________
Domeniul / Specializarea: _________________________________________________________________________
Tema proiectului de diplomă/ lucrării de disertație ____________________________________________
_____________________________________________________________________________________________________________
_______________________________________________________________________________ ________________________ ______
_____________________________________ ________________________________________________________________________
_____________________________________________________________________________________________________________
Conducător științific: ___________________________________________________ ___________________________
Consultant de specialitate: ________________________________________________________________________
Data primirii temei:____________________________
La elaborarea proiectului de diplomă / lucrării de disertație se va respecta Regulamentul
de întocmire a proiectelor de diplomă și a lucrărilor de disertație, disponibil pe site -ul facultății
http://www.aciee.ugal.ro/studenti/finalizare -studii/regulamente -si-formulare
Conducător științific, Absolvent: [anonimizat] „DUNĂREA DE JOS” DIN GALAȚI
FACULTATEA DE AUTOMATICĂ, CALCULATOARE, INGINERIE
ELECTRICĂ ȘI ELECTRONICĂ
Str. Științei Nr. 2, cod poștal 800146, Galați, România, tel/fax: +0236 4 70 905, e-mail: [anonimizat], web: www.aciee.ugal.ro
Anexa 2 la Regulamentul de întocmire a proiectelor de diplomă și a lucrărilor de disertație
Nr. _____/__________________
Aprobat,
Decan
DOMNULE DECAN
Subsemnata/Subsemnatul, ________________________________________________ _______________________,
absolventă/absolvent a/al Facultății de Automatică, Calculatoare, Inginerie Electrică și
Electronică, din cadrul Universității Dunărea de Jos din Galați, domeniul
__________________________________, specializarea (licență/master) _ _____________________________________
_____________________________________________________________________________________________________________,
promoția ______________, vă rog să -mi aprobați înscrierea la examenul de licență/disertație
sesiunea ____________________________________________ _____.
Am ales proiectul de diplomă/lucrarea de disertație cu titlul
_________________________________________________
_____________________________________________________________________________________________________________
sub îndrumarea _____________ ______________________________________________________________.
Am citit cu atenție REGULAMENTUL DE ÎNTOCMIRE A PROIECTELOR DE DIPLOMĂ ȘI
LUCRĂRILOR DE DISERTAȚIE și l -am respectat integral.
Data: __________________________ Semnătura ___________________ _________
Viza îndrumătorului proiectului/coordonatorului lucrării __________________________
Viza Directorului de departament ce coordonează programul __________________
Media
multianuala Viză secretariat
ACIEE
UNIVERSITATEA „DUNĂREA DE JOS” DIN GALAȚI
FACULTATEA DE AUTOMATICĂ, CALCULATOARE, INGINERIE
ELECTRICĂ ȘI ELECTRONICĂ
Str. Științei Nr. 2, cod poștal 800146, Galați, România, tel/fax: +0236 4 70 905, e-mail: aciee@ugal.ro, web: www.aciee.ugal.ro
Anexa 3 la Regulamentul de întocmire a proiectelor de diplomă și a lucrărilor de disertație
DECLARAȚIE
Subsemnata (ul), ______ ________________________ ___________________________________________________
absolventă/absolvent a/al Facultății de Automatică , Calculatoare, Inginerie Electrică și
Electronică, din cadrul Universității “Dunărea de Jos” din Galați, promoția ________________,
specializare a _____________________________________________________________________________________________,
declar pe prop rie răspundere că proiectul de diplomă/lucrare de disertație cu titlul
„____________________________________________________________________________________________________________
____________________________________________________________________________ ________________________________”
este elaborat/elaborată de mine și nu a mai fost prezentat/prezentată niciodată la o altă
facultate sau instituție de învățământ superior din țară sau străinătate. De asemenea, declar că
toate sursele utilizate, inclusive c ele de pe Internet, sunt indicate în proiect/lucrare, cu
respectarea regulilor de evitare a plagiatului.
“Plagiatul: însușirea ideilor, metodelor, procedurilor, tehnologiilor, rezultatelor sau textelor
unei persoane, indiferent de calea prin care acestea au fost obținute, prezentându -le drept creație
proprie.”
Am luat la cunoștință că prezentarea unui/unei proiect/lucrări plagiate va conduce la
anularea diplomei de licență/master.
Lucrarea conține un număr de __________ pagini.
Data: ________________ S emnătura ____________________________
UNIVERSITATEA „DUNĂREA DE JOS” DIN GALAȚI
FACULTATEA DE AUTOMATICĂ, CALCULATOARE, INGINERIE
ELECTRICĂ ȘI ELECTRONICĂ
Str. Științei Nr. 2, cod poștal 800146, Galați, România, tel/fax: +0236 4 70 905, e-mail: aciee@ugal.ro, web: www.aciee.ugal.ro
Anexa 4 la Regulamentul de întocmire a proiectelor de diplomă și a lucrărilor de disertație
ACORD PRIVIND TRANSFERUL REZULTATELOR PROIECTULUI DE DIPLOMĂ/LUCRĂRII DE
DISERTAȚIE
Subsemnata (ul), _________________________________________________________, absolventă/absolvent
a/al Facultății de Automatică, Calculatoare, Inginerie Electrică și Electronică, din cadrul
Universității “Dunărea de Jos” din Galați, promoția _______________ ________, specializare
_____________________________________________________________________________________________________________,
(NU) SUNT DE ACORD * să cedez rezultatele software și hardware – aferente proiectului de
diplomă/lucrării de disertație – în favoarea Facultății de Automatică, Calculatoare, Inginerie
Electrică și Electronică, din cadrul Universității “Dunărea de Jos” din Galați, pentru creșterea
dotării materiale a facultății și în folosul exclusiv al studenților.
Proiectul/lucrarea conțin e următoarele:
1) Partea hardware compusă din:
_____________________________________________________________________________________________________
_____________________________________________________________________________________________________
________ _____________________________________________________________________________________________
_____________________________________________________________________________________________________
______________________________________________________________ _______________________________________
2) Partea software compusă din:
_____________________________________________________________________________________________________
____________________________________________________________________________________ _________________
_____________________________________________________________________________________________________
_____________________________________________________________________________________________________
_____________________________________ ________________________________________________________________
Data: ________________ Semnătura ____________________________
Notă:
* Se taie (bifează), după caz
Anexa 5 la Regulamentul de întocmire a proiectelor de diplomă și a lucrărilor de disertație
Departamentul __________________________________________________________________________
Sesiunea:_________________________________________________________________________________
REFERAT DE EVALUARE
a proiectului de diplomă / lucrării de disertație cu titlul ________________________________________
_________________________________________ ______________________________________________________________
_______________________________________________________________________________________________________
___________________________________________________________________________________________ ____________
Elaborat (ă) de absolventul _______________________________________________________________________
Perioada de documentare și pregătire ___________________________________________________________
Conținutul proiectului _______________________ ______________________________________________________
_______________________________________________________________________________________________________
__________________________________________________________________________________________________ _____
_______________________________________________________________________________________________________
_______________________________________________________________________________________________________
Contribuții personale ale autorului ________ _______________________________________________________
_______________________________________________________________________________________________________
_________________________________________________________________________________________________ ______
_______________________________________________________________________________________________________
_______________________________________________________________________________________________________
Respectă regulile de întocmire și redactar e? DA / NU *
Se propune ADMITEREA / RESPINGEREA proiectului / lucrării pentru susținerea publică.
Nota propusă _________________________ (această notă nu va fi luată în calculul mediei finale)
Data, Conducător științific,
Notă:
* Se taie (bifează), după caz
Rezumat
În aproape toate domeniile de activitate se urmărește înlocuirea oamenilor cu o forță
de muncă mai precisă, care nu obosește niciodată , deci cu un robot. Pe lângă roboți sau
maș inile automatiza te, brațul robotic a pătruns î n diverse sectoare cum ar fi medicina sau
industria pentru manipulare, deplasare sau transport.
Sistemul dezvoltat în această lucrare se adresează utilizatorilor care sunt profani în
domeniul interacțiunilor cu roboții și care doresc să comunice cu robotul personal sau de
asistență într -un mod natural, obișnuit, fără multe pregătiri prealabile. Această interacțiune
este bazată pe recunoașterea gesturilor umane, inclusiv gesturi de indicare (fund amentale
atunci când se lucrează cu roboț i). Scopul este de a oferi un sistem care poate fi utilizat în
timp real și poate face față diverș ilor utilizatorilor în timpul execuției gesturilor.
Proiectul de față constă î n implementarea un ui sistem de control a unui braț robotic
folosind o comunicație wireless. Părțile componente sunt: o mănușă prevăzută cu senzori de
control a 5 motoare servo, un dispozitiv de transmisie pentru a prelua comenzile de la
mănușă și a le transmite wireless către modulul de comandă a braț ului, un rece ptor wi reless,
un modul de comandă a motoarelor și braț ul propriu zis.
Pentru implementare am folosit două plă ci de dezvoltare Arduino ,un Arduin o Nano
pentru preluarea informațiilor de la senzorii amplasați pe manușă , codarea lor ș i
transmiterea printr -un modu l wireless către cutia de comandă a brațului. Cea de -a doua
placă de dezv oltare este un Ardui no Uno R3, folosit pentru recepția informației de la
transmițător, decodarea acesteia și retransmiterea ei sub formă de comenzi către braț ul
robotic.
Mănuș a este prevăzută cu doi senzori. Primul este un accelerometru giroscop Gy -521
folosit pentru a controla cotul, umărul și baza braț ului astfel:
• Înclinarea palmei în sus și în jos deplasează cotul în sus și în jos;
• Înclinarea palmei spre dreapta și spre stân ga mișcă umărul în sus și în jos ;
• Înclinarea palmei spre dreapta și stânga deplasează baza în spre dreapta și spre
stânga
Al doilea sensor este unul flexibil de ti p SF10264 de 2. 2” ce controlează încheietura
braț ului robotic. Suplimentar sunt adăugate d ouă buto ane apăsate separate pentru controlul
cleștelui (închidere ș i deschidere) sau simultan pentru aprindere/stingere Led.
CUPRINS
Introducere ………………………….. ………………………….. ………………………….. ………………………….. …………………… 3
Capitolul 1. Comunicaț ii radio ………………………….. ………………………….. ………………………….. ……………….. 3
1.1. Noțiuni generale …………………………………………………………………………………………………………….. ………. 3
1.2. Scurt istoric al descoperirii comunicațiilor radio ………………………………………….. ……………………. . 4
1.3. Principiile comunicațiilor radio ……………………………………………………………….. …………………………… . 4
1.4. Aspecte generale ……………………………………………….. …………………………………. ………………………………… 4
1.5. Aspecte specifice Radio Emițătoarelor (RE) ………………………………………………………………………. …. 6
1.6. Schema bloc generală. R olul elementelor ………………………………………………………. ……………………… 7
1.7. Funționare …………………………………………………………………………………………………………….. ………………. . 9
Capitolul 2. Proiectare și i mplementare hardware ……………………… ……………………………………….. 10
2.1. Plă cile Arduino ………………………………………………………………………….. ………………….. …………………….. . 13
2.1.1. Placa Arduino UNO R3
2.1.2. Placa Arduino NANO V3
2.2. Modulul de comunicaț ie radio NRF24L01 …………………………………………….. …………………….. …….. 18
2.3. Senzorul flexibil Spectra Symbol ……………… …………………………………………………………………. ………. 25
2.4. Registrul de schimbare 74HC595N ………………………………………………………………………….. …………. 27
2.5. Modulul L293D …………………………………………………………………………………………………………… ………… 31
2.6. Motorul servo MG996R ………………………………………………………………………. …………….. ………………… 33
2.7. Modulul giroscopic MPU6050 …………………………………………………………………………… ………………… 34
Capitolul 3. Implementare softwar e …………………….. ………………………………………. ………………………… 37
3.1. Mediul de lucru A rduino IDE ……………………………………………………………………………………………. ….. 37
3.2. Programul Arduino ………………………………………………………………………… ……… ………….. 40
3.2.1. Programul cutiei de control al brațului
3.2.2. Programul părții de comandă și de transmisie al brațului
Capitolul 4 . Partea experimental ă – Testarea senzorilor și a modulelor ……………………………. 47
4.1. Modulul radio NRF24L01 ……………………………………………………………………. ……………………………….. 47
4.2. Modulul accelerometru și giroscop cu 3 axe MPU6050 …………………………………………… ……….. . 49
4.3. Senzorul flexibil Spectra Symbol 2.2 "……………………………………………… ……………… …… 51
Concluzii ………………………….. ………………………….. ………………………….. ………………………….. …………………….. 54
Bibliografie ………………………….. ………………………….. ………………………….. ………………………….. ………………… 55
Anexa 1 ………………………….. ………………………….. ………………………….. ………………………….. ……………………….. 56
LISTA FIGURILOR
Figura 1. Bra țul robotic Freddy II …………………………………………………………………………………………………..1
Figură 2. Braț robotic controlat de unde cerebrale ………….. ………………………………………………………..2
Fig. 1.1. S istem de R.C. punct la punct …………………………………………………………………………………………… 3
Fig. 1.2. Rețea comutată normală………………………………………………………………………………… ………………..5
Fig. 1.3. Intervalul (∆f) între două canale vecine………………………………………………………………… ………6
Fig. 1.4. Schema bloc a unei instalații de emisie – recepție…………………………………………………… …..7
Fig. 1.5. Un semnal radio cu amplitudine AM și FM…………………………………………………………………. …9
Fig. 2.1. Brațul robotic OWI………………………………………………………………………………. ………………………….11
Fig. 2.2. Banda de legături între L293D și motoare ……………………………………………………………….. . 12
Fig. 2.3. Pini micorprocesor ATmega328……………………………………………… …………………………………..14
Fig. 2.4. Pini Arduino UNO R3…………………………………………………………………………………… ………………….16
Fig. 2.5. Pini Arduino NANO V3………………………….. ………………………………………………………………………..17
Fig. 2.6. Design placa NRF24L01…………………………………………………………………………………. ………………18
Fig. 2.7. Citire/Scriere prin SPI…………………………………………………………………………………………………….19
Fig. 2.8. Model NRF24L01 2D…………………………………………………………………………………….. ………………..22
Fig. 2.9. Sincronizarea SDA -SCL bit……………………………………………………………………………………………..23
Fig. 2.10. Conexiunea I2C………………………………………………………… …………………………………………………….23
Fig. 2.11. Pachet I2C……………………………………………………………………………………………………………. ………….23
Fig. 2.12. Frecvența de transfe r și trimiterea informației simultană pe mai multe canale.24
Fig. 2.13. Conectare Arduino UNO/NANO cu modulul NRF24L01………………………………………..24
Fig. 2.14. Modificarea valorii rezistenței senzorului flexibil…………………….. …………………………..26
Fig. 2.15. Schema Fritzing a circuitului de test al senzorului flexibil…………………………………….27
Fig. 2.16. Schema Fritzing de interconectare a modulului 74HC595 cu modulele L293D și
Arduino UNO……. …………………………………………………………………………………………………………….. ………………30
Fig. 2.17. Scheme întrerupatoare…………………………………………………………………… ……………………………31
Fig. 2.18. Punte H realizată cu tranzistoare MOSFET complementare…………………………………32
Fig. 2.19. Punte -H cu tranzistoare bipolare și logica de comandă…………………………………………3 2
Fig. 2.20. Motorul servo MG995………………………………………………………………………………….. ………………33
Fig. 2.21. Tipuri de scheme de culori folosite la motoarele servo……………………………………. ……34
Fig. 2.22. Pinii modulului MPU6050………………………………………………………………………………. …………..35
Fig. 2.23. Schemă conectare Arduino UNO -MPU6050…………………………………………………. …………36
Fig. 2.24. Modelul realizat fizic……………………………………………………………………………….. ……………………36
Fig. 2.25. Rezultate afișate pe Serial Monitor……………………………………. ………………………………………36
Fig. 3.1. Organigrama comenzilor………………………………………………………………………………………………..37
Fig. 3.2. Ecranul de start Arduino IDE…………………………………………………………………………… ……………37
Fig. 3.3. Configurare Arduino IDE……………………………………………………………………………….. ………………39
Fig. 3.4. Exemple de programe din Arduino IDE………………………………………………. ………………………39
Fig.3.5. Opțiunile necesare includerii de librării………………………………………………………………… ……40
Fig. 4.1. Schema conectare………………………………………………………… ………………………………………………….47
Fig. 4.2. Ansamblul final………………………………………………………………………………………. ………………………..49
Fig. 4.3. Afișare pe Serial Monitor a mesajului transmis………………………………………………………….49
Fig. 4.4. Schema Fritzing a circuitului de test al modulului accelerometru și giroscop
MPU6050……………………………………………………………….. ………………………………………………………………………..50
Fig. 4.5. Modelul realizat fizic………………………………………………………………………………… …………………….51
Fig. 4.6. Rezulta te serial monitor……………………………………………………………………………………………… …51
Fig. 4.7. Îndoirea senzorului flexibil…………………………………………………………………………… ………………51
Fig. 4.8. Proiectarea în Fritzing a circuitului…………………………………………………………………… …………52
Fig. 4.9. Modelul realizat fizic……………………………………………………… ……………………………………………….53
Introducere
1 INTRODUCERE
Pe măsură ce inteligența artificială continuă să avanseze, la fel se întâmplă și cu
frica oamenilor de a fi înlocuiți de computere. Probabil te -ai gândit măcar o dată ”Munca
mea poate fi înlocuită de roboți?”.
Frica aceasta a apărut în rândul muncitorilor din fabrici odată cu Revoluția
Industrială, și continuă să se extindă în rândul angajaților pe măsură ce tot mai multe
joburi dispar, sarcinile oamenilor fiind preluate de roboți.
Deși dispariția unor joburi este inevitabilă, multe inovații din zona inteligenței
artificiale vor fi complementare sarcinilor efectuate de oameni, ajutându -ne să fim mai
productivi. În același timp, există câteva abilități care rămân de neînlocuit și pe care le
poți folosi pentru a -ți asigura viitorul în carieră.
Creativitatea și abilitățile artistice si sociale:
În prezent, este aproape imposibil pentru un computer să reproducă creativitate.
Deși un computer poate realiza o imagine sau o piesă muzicală, folosind o arhivă imensă
de date, aceasta abilitate nu poate fi numită creati vitate în adevăratul sens al cuvântului.
Empatie:
Orice job care presupune multă interacțiune umană și empatie nu are șanse să fie
înlocuit de sisteme automatizate în viitorul apropiat. Deși există inteligență artificială
care le permite computerelor să a sigure câteva interacțiuni simple, ca răspunsul la
întrebări frecvente către suport clienți, e puțin probabil ca joburi le care presupun
interacțiune umană și empatie să fie automatizate. Spre exemplu, oricât de mult ar avansa
din punct de vedere tehnic apa ratele medicale, rolul unui medic în tratarea unui pacient
este de neînlocuit, la fel cum copiii au nevoie de interacțiunea cu educatorii și profesori,
chiar dacă vor apărea tot mai multe aplicații interactive. [1]
De la crearea primului robot în anul 19 49 și până în prez ent, industria robotizării
este î ntr-o cont inuă dezvoltare. Primul robot industrial din lume, numit Unimate,a fost
creat pentru o linie de asambla re a companiei General Motors î n anul 1961. Sluja acestuia
era de a transporta piesele turn ate d e pe linia de asamblare astfel încât să poată fi sudate
pe caros erii auto. Acesta a fost prima î ntruchipare a unui robot modern folosit pentru a
efectua jobur i care anterior ar fi fost slujb a oamenilor, un subiect care este dezbătut și în
ziua de astă zi.
În anii ’60 -’70 cercetătorii universităț ii din Edinburgh din Scoția dezvolta primul
braț robotic, numit Freddy II, ce conținea cleș ti adaptivi, o cameră foto și o tehnologie de
recunoaș tere a imaginii. Acesta reușește să creeze din blocuri de lemn o barcă ș i un model
de mașină , procesul durâ nd aproximativ 16 ore. Acesta este expus în prezent la muzeul
național al Scoț iei. [2]
Figura 3. Bra țul robotic Freddy II
Introducere
2 În prezent o echipă de la Universitatea Carnegie Mellon au dezvolt at o tehnologie
care controlează un braț robotic folosind unde cerebrale . Acea stă nouă tehnologie este o
îmbunătăț ire a vechii varian te ce folosea chirurgie craniană utilizând o interfață creier –
computer dezvoltată pe baza unor algoritimi de învățare pentru a intercepta ș i analiza
mai bine semnalele cerebrale.
Figura 4. Braț robotic c ontrolat de unde
cerebrale
Capitolul 1. Comunicații radio
3 CAPITOLUL 1. COMUNICAȚ II RADIO
1.1. Noțiuni generale
O comunicație este o transmitere de date și informații , deci de natură tehnică,
implicând o conexiune între două sau mai multe puncte distincte. În mas s-media de
exemplu există numeroase tipuri de comunicații: prin ziare , postere, TV, radio sau și
prin Internet .
Radio a fost la origine o metodă de transmitere a sunetelor prin unde radio, care
prin natura lor sunt unde electromagnetice. Tot "radio" se mai numește și aparatul
receptor corespunzător. Azi se transmit prin radio (unde radio) o largă gamă de semnale
diferite, inclusiv imagini mișcătoare (televiziune) și fluxuri enorme de date.
Comunicaț iile radi o (CR) , în sens larg, cuprind ansamblul de mijloace tehnice
nece sare pentru a transmite informația cu o fidelitate și o fiabilitate cât mai bună posibil ă,
între două puncte oarecare, situate la o distanță oarecare, folosind propagarea undelor
electromagnet ice.
Atunci câ nd un numă r de u tilizatori beneficiază de același serviciu radio,
ansamblul legă turilor fizice dintre ei formează o rețea de comunicaț ii radio .
În prezent, cele mai multe sisteme sunt organizate în rețele de comunicații radio,
adică într -un complex în care legă tura se poate realiza î ntre diverse puncte. De remarcat
că într -o măsură tot mai mare, rețeaua de comunicații radio este integrată, formând o
secțiune a unei r ețele mai complexe care include și secțiuni în care comunicațiile se
realizează prin cabluri (metalice sau optice).
Această definiț ie globală necesită unele comentarii:
1) Comunicațiile radio reprezintă o tehnică care vine să amplifice și să prelungească
posibilitățile de a satisface dorința de comunicare inerentă omului. Principalele mijloac e
tehnice utilizate de comunicaț iile radio sunt bazate pe principii electromagnetice.
2) Spre deose bire de alte servicii, comunicațiile ra dio utilizează numai informaț ia de
transmis propriu -zisă fără suportul sau material (hâ rtie, bandă magnetică , CD , etc). [3]
Cele mai simple sisteme de RC asigură legături radio între două puncte fixe:
Figura 5.1. Sistem de R.C. punct la punct
1.2. Scurt i storic al descoperirii comunicaț iilor radio
De foarte multă vreme omul a fost nevoit să transmită informații la distanțe mari.
În antichitate semnalele cu ajutorul focului constituiau singura cale de comunicare
la mari distanțe; așa s -a aflat de exemplu despre căderea Troiei sau a Ierusalimului.
Capitolul 1. Comunicații radio
4 Una din cele mai fascinante aplicații a energiei electrice constă în generarea
undelor invizibile de energie, și anume a undelor electromagnetice. Descoperire a
accidentală de către Hans Christian Oersted (1777 – 1851) a electromagnetismului a făcut
ca în lumea științifică să se nască curiozitatea de a se găsi legătura dint re electricitate și
magnetism. [4]
Existența undelor radio a fost făcută cunoscută public ului larg în special de către
Guglielmo Marconi , un inventator italian care activa în Anglia. Fizicianul croat din
America Nikola Tesla a contribuit în mod esențial, pe lângă alți câțiva inventatori, la
crearea primului aparat radio. El a construit un sist em care putea transmite și primi
semnale radio de la o distanță de aproape 3 km. În 1895 a trimis un semnal radio pentru
prima dată; în 1907 el a recepționat prima dată un semnal radio din Canada, și anume
semnul "x" din Codul Morse .
Odată cu aceasta a în ceput să se dezvolte telegrafia fără fir și folosirea codului
Morse, care au fost foarte importante mai ales pentru comunicarea între nave în cazul
unor dezastre pe mare. Primul care a transmis un mesaj vocal prin undele radio a fost
Reginald Fessenden în 1900. Nikola Tesla a inceput in 1900 construcția primei stații de
emisie de radio, dar din lipsă de fonduri a abandonat ideea. Totuși el este considerat
inventatorul ideii de stații radio cu emisiuni.
În prez ent, domeniul undelor radio de înaltă frecvență (high frequency – HF),
cunoscute ș i sub denumi rea de unde scurte, înregistrează o creștere importantă, datorită
unor noi tehnologii. [5]
1.3. Principiile comunicaț iilor radio
Semnalele radio se transmit de la antena de emisie, ca unde care se pro pagă prin
spaț iu cu viteza luminii.
Frecvenț a radio este exp rimată în hertzi (cicli pe secundă ), kilohertzi (mii de
hertzi) sau megahertzi (milioane de hertzi).
Comunicațiile radio pe distanțe lungi, se fac pe frecvențe î nalte (HF) de la 1,6 la 30
MHz. Po zițiile diferite î n cadrul acestei benzi, sunt alocate servi ciilor radio specifice, în
baza unor acorduri internaț ionale.
Modulaț ia este procesul prin care, faza, amplitudinea sau frecvenț a unui s emnal
de emisie, este modificată pentru a exprima niște info rmaț ii.
Undele radi o HF se pot propaga ca unde spaț iale ce se refractă din ionosfera
pământului, permițând comunicațiile pe distanț e lungi. [6]
1.4. Aspecte generale
Domeniul frecvență și/sau domeniul timp se împart în benzi înguste, funcție de
tipul de semnal modulat; aceste benzi de frecvență/timp împreună cu echipamentele care
le deservesc exclusiv și cu mediul de transmisiune constituie canalele radio.
După modul în care se transmite informația rețelele RC (radiocomunicaț ii) se pot
clasifica în rețele de:
Capitolul 1. Comunicații radio
5 – difuzare
– colectare
– bilaterale
– multilaterale .
Rețele utilizate de ser viciile de CR se pot clasifica ș i ele:
1. După modul cum circulă informaț ia:
– rețele de difuzare – când informația este transmisă unilateral de la o sursă spre mai
mulț i destinatari;
– rețele de colectare – când informaț iile provenind de la mai multe surse sunt transmise
spre acelaș i destinatar.
2. După modul c ât este men ținută legătura î ntre parteneri:
– rețele stabile – la care legă turile sunt permanente;
– rețele comutate – la care legă turile sunt realizate la cerere.
Rețelele comutate cele mai răspândite în aplicații sunt sub forma, așa
zisă, norma lă (obișnuită ), la care mijloacele de transmisie și comunicație sunt puse î n
comun la dispozitia unui mare numar de utilizatori care au acces la aceasta retea prin
intermediul unui echipament de transmisie individual (fig.1.2).
Figura 1.2. Rețea comutată normală
Prin unde r adio este desemnat un subdomeniu al undelor electrom agnetice
(UEM):
1. unde hertziene
2. unde infraroșii
3. unde optice
4. unde ultraviolete
5. unde x
6. unde cosmice.
Domeniul undelor r adio este împărțit pe subgame funcție de frecvență sau funcție
de lungimea de undă:
λ=c
φ
• Exemple de subgame: 4 – (3 kHz -30 kHz) VLF – miriametrice
5 – (30 kHz -300 kHz) LF – kilometrice
6 – (300 kHz -3000 kHz) HF – decametrice
7 – (3 -30) Mhz VHF – metrice
Capitolul 1. Comunicații radio
6 În vederea transmiterii, mesajul mo dulează o frecvență purtătoare. Semnalul
modulat ocupă o bandă de frecvență. Deci, pentru o legătură de comunicație se alocă nu
o frecvență ci o bandă de frecv ențe care depinde de tipul și de parametrii semnalului
modulat. Funcție de banda ocupată se stabilește și intervalul (∆f) între două canale vecine
(figura 1.3. ). [3]
Figura 1.3. Intervalul (∆f) între două canale vecine
Parametrii caracteristici sistemelor de R.C.
A) Frecvență:
• fa – alocată – centrul benzii alocate
• fr – referință – o frecvență cu o poziție bine determinată față de fa
• fe – emisiunii – centrul benzii ocupate
• fc – caracteristică – o frecvență u șor de ide ntificat în spectrul semnalului emis;
• δf – toleranța de frecvență (Hz,ppm).
B) Benzi de frecvență:
• alocată
• necesară
• ocupată.
1.5. Aspecte specifice Radio Emițătoarelor (RE )
Caracteristici
Radio emițătorul are un rol decisiv în calitatea radiolegăturii .
Distanța la care se poate stabili o legătură de calitate este funcție de puterea emisă
(Pe) și de sensibilita tea Radio Receptorului (S r):
d=f (Pe,Sr)
Un echipament de radio emisie va fi caracterizat prin:
• gama de frecvență în care poate funcționa (sau frecvența de lucru);
• puterea emisă (la intrarea cablului care alimentează antena = feeder) respectiv
puterea aparent radiată (care depinde și de cara cteristica de directivitate a
antenei sau a sistemului de antene utilizate).
• randament
• stabilitate frecvență
• nivelul radiații nedorite (neesențiale)
• siguranța în funcționare.
Clasificarea Echipamentelor de RadioEmisie :
1. după tipul semnalului modulat:
• MA
• MF
Capitolul 1. Comunicații radio
7 • BLU
• impulsuri
2. după nivelul puterii emise:
• foarte mică (<1W)
• mică (<100W)
• medie (100W -3KW)
• mare (3KW -100KW)
• foarte mare (>100KW)
3. după destinație:
• radiodifuziune
• radioteleviziune
• telegrafie
• radio telefonie
• telecomandă
• radiolocație
4. după gama de frecvență: de exemplu emițătoare de RD se pot împărți în:
• emițătoare pentru UL (putere foarte mare);
• emițătoare UM ( putere foarte mare);
• emitătoare pentru UUS (putere medie);
5. după condițiile de exploatare:
• staționare
• mobile
• portabile
1.6. Schema bloc generală. Rolul elementelor
Sunt posibile două tipuri de instalații de emisie -recepție, și anume, cu o singură
antenă, respectiv cu antene separate pentru emisie și recepție. Schemele bloc ale acestora
sunt prezentate în figur a 1.4 .
Fig. 1.4 : Schema bloc a unei instalații de emisie – recepție a) cu o singură antenă b) cu canale de
emisie sau recepție separate
Capitolul 1. Comunicații radio
8 CA – comutat or de antenă; asigură separarea în timp a emisiei de recepție. Rezultă
că schema cu CA nu poate fi utilizată în sisteme cu emisie continuă.
Rolul elementelor:
1. Emițătorul are rolul de a emite radiații elecromagnetice cu parametrii impuși prin
construc ție, cei mai importanți fiind următorii:
– Tipul de radiație:
o Continuă:
• Nemodulată.
• Modulată în amplitudine, frecvență sau fază (MA, MF, MΦ ).
o În impuls:
• Cu frecvența de emisie constantă sau variabilă (mai rar);
• Cu frecvența de repetiție constantă sau variabilă (vobulare);
• Cu sau fără cod.
– Puterea:
o Instantanee (energie cu variație continuă): Pi = Pmedie ;
o În impuls (energie cu variație în impulsuri): Pmedie < Pimpuls .
– Legea de modulație, în cazul em isiei semnalelor modulate:
o În cazul emisiei continue, cele mai ztilizate sunt MA, MF;
o În cazul emisiei în impulsuri, cele mai utilizate sunt modulația în poziție și
modulația în cod.
– Numărul de canale:
o Cu un singur emițător;
o Multicanal:
▪ Cu separare spațială;
▪ Cu separare în timp (mai rar folosită), Cu separare în timp și spațială.
– Frecvența de emisie:
o Constantă (cu sau fără reacordare);
o Cu salturi de frecvență într -un anumit ecart.
2. Receptorul are rolul de a prelucra semnalul recepționat pentru a -l aduce la forma
necesară pentru afișare. Prelucrările efectuate pot fi următoarele:
– Amplificarea directă, prin intermediul Amplificatoarelor de Frecvență Foarte Înaltă
(AFFÎ), care însă sunt carcaterizate de o amplificare mică (lucrează pe frecvență mare,
deci au bandă de trecer e largă și amplificare mică);
– Selecția aproximativă a semnalului util dintre zgomote (preselector, c ircuite de intrare
acordate);
– Translația spre frecvențe mai joase pentru a putea fi ulterior puternic amplificate
(Sch imbătoare de Frecvență – SF);
– Amplificarea de bază, în medie frecvență (Amplificatorul de F recvență Intermediară –
AFI);
– Detecția (transpunerea în semnal video sau audio):
o De am plitudine, pentru semnale MA;
o De fază (raport), pentru semnale MΦ ;
– Selecția semnalului util:
Capitolul 1. Comunicații radio
9 o Înlăturarea bruiajului asincron;
o Selecția țintelor mobile (SȚM);
o Circuite corelatoare;
o Circuite de limitare (înlăturarea bruiajului mic);
– Pregătirea semn alului selectat pentru transmiterea la instalația de afișare (repetor
pentru adaptarea la linia de transmitere, digitizare, etc.).
3. Instalația de afișare trebuie să afișeze într -o formă dorită semnalul util pentru
operator. Afișarea poate fi:
– Analogic ă (de exemplu un punct luminos pe un tub catodic);
– Digitizată (de exemplu un simbol, de regulă asociat (și) cu alte date suplimentare).
4. Sursa de alimentare asigură energia necesară funcționării instalației de emisie –
rece pție. Aceasta poate cuprinde:
– Grup generator, care poate lipsi dacă e xistă alimentare de la rețea;
– Convertoare de frecvență ( de exemplu, 50Hz spre 400Hz);
– Redresoare;
– Stabilizatoare de tensiune (pentru tensiunile con tinue cu toleranțe mici);
– Transformatoare ridicătoare d e tensiune și redresoare de înaltă tensiune. [4]
1.7. Funcț ionare
Undele sonore sunt transformate de un microfon în impulsuri electrice. Acestea
sunt suprapuse pe o undă radio (undă purtatoare), generată de un oscilator. Unda radio
combinată (modulată), este difuzată de o antenă montată p e un stâlp de transmisie.
Unda radiodifuzată este detectată de un radioreceptor acordat pe frecvența undei
purtătoare. În receptor, impulsurile electrice ale undei sonore sunt separate de cele
purtătoare cu ajutorul unui demodulator , amplificate și transformate din nou în unde
sonore, de un difuzor . [7]
Figura 1.5. Un semnal radio cu amplitudine AM și FM
Capitolul 2. Proiectare și implementare hardware
10 CAPITOLUL 2. PROIECTARE ȘI IMPLEMENTARE HARDWAR E
În acest capitol se vor prezenta comp onentele care au fost folosite în crearea
proiectului împreună cu funcționarea ș i caracteristicile acestora.
Lucrare a este structurată în trei părți , prima parte fiind cea de comand ă (mănuș a),
a doua parte de transmisie , iar cea de a treia de recepți e și de control.
1. Pent ru a construi partea de comandă , avem nevoie de următoarele:
• Mănușă cusută Isotoner Smartouch Tech
• Senzor Spectra Symboflex 2.2 "
• Giroscop GY -521 6DOF MPU6050 cu 3 axe + modul Accelerometru
• 2X5 Prindere pentru cablu panglica
• 2X5 Mufe pentru cablul panglica
• Cablu panglica 10 fire .050 "
• 2 x 5mm LED – Verde și Galben
• 2 x butoane mici
• Rezistențe, fire, pistol cu lipici, pistol de lipit , etc.
2. Pentru partea de transmisie aveam nevoie de urmă toarele:
• Arduino Nano v3.0 ATmega328P -20AU
• Modul transmitere/recepț ie radio nRF24L01 + 2.4 GHz compatibil cu Arduino
• Carcasă pentru suport de baterie 9V cu comutator de pornire / oprire
• 2X5 Prindere pentru cablu panglica
• Baterie 9v
• Condensator 47uF (50v)
• Rezistențe, fire, pistol cu lipici, pistol de lipit, etc.
Cutia transmițător este în esență un Arduino Nano, mod ul wireless nRF24,
senzorul flexibil și 3 rezistoare: 2 rezistențe 10 kOhm pentru butoanele de comandă de
Capitolul 2. Proiectare și implementare hardware
11 pe mănușă și o rezistență de 20 kOhm pentru senzorul flexibil care controlează
încheietura mâinii.
3. Pentru partea de recepți e și control avem nevoi e de urmă toarele:
• Arduino Uno R3
• Shield DIY KIT pentru Arduino (sau similar) pentru prototip
• Modul transmitere/recepție radio N RF24L01 + 2.4 GHz compatibil cu Arduino
• 3 x Modul control motoare servo L293D cu 16 pini
• 1 x Registru de schimbare 74HC595 8 -Bit cu registre de ieșire
• Condensator 47uF (50v)
• Cutie pentru Arduino – pe Amazon.com
• Comutator pornit / oprit
• 2 x butoane de 13 mm (unul cu capac Roșu și unul Verde)
• 2 x 2X 7 Prindere pentru cablu panglica
• Cablu panglica 14 fire .050 "
• Baterie 9v
• Rezistențe, fire, pistol cu lipici, pistol de lipit, etc.
• Kit Braț robotic – OWI -535
Conexiuni le la plăcile Arduino au fost fă cute astfel:
A. Arduino NANO :
• 3.3V – 3.3V al modulului NRF24L01 (PIN 2)
• 5V –Alimentare modul giroscopic MPU6050, butoane, senzorul flexibil
• A0-Intrarea senzorului flexibil
• A1-comanda LED -ului galben
• A4-modul giroscopic MPU6050 (SDA)
• A5- modul giroscopic MPU6050 (SCL)
• D02 -modul NRF24L01 (IRQ -PIN 8)
• D03 -intrare a butonului de deschidere a cleș telui
• D04 -intrar ea butonului de inchidere a cleș telui
• D09 -modul NRF24L01 (SPI -CSN –PIN4)
• D10 -modul NRF24L01 (SPI -CS -PIN3)
• D11 -modul NRF24L01 (SP I MOSI -PIN6)
• D12 -modul NRF24L01 (SPI MISO -PIN7)
• D13 -modul NRF24L01 (SPI SCK -PIN5)
• Vin- 9V
Figura 2.6. Brațul robotic OWI
Capitolul 2. Proiectare și implementare hardware
12 • GND –GND
B. Arduino UNO :
• 3.3V – 3.3V modul NRF24L01 (pin 2)
• 5V – 5V
• Vin – 9V
• GND – GND
• a0 – LEDul ghiarei braț ului (+)
• a1 – Registru de schimbare (SPI SS -PIN 12)
• a2 – Intrarea butonului roș u
• a3 – Intrarea butonului verde
• a4 – modulul L293D –direcți a bazei dreapta (PIN 15)
• a5 – comanda LED
• d02 – modul NRF24L01 (IRQ -PIN 8)
• d03 – modul L293D – pornire motor baza braț ului (PIN 1sau 9)
• d04 –modul L293D – direcț ia bazei la stanga (PIN 10)
• d05 – modul L293D – pornire motor umar (PWM , PIN 1 sau 9)
• d06 – modul L293D – pornire motor cot (PWM , PIN1 sau 9)
• d07 – modul NRF24L01 (SPI CSN -PIN 4)
• d08 – modul NRF24L01 (SPI CS -PIN 3)
• d09 – modul L293D -pornire motor încheietură (PWM, PIN 1 sau 9)
• d10 – modul L293D -pornire motor cleș te (PWM,PIN 1 SAU 9)
• d11 – modul NRF24L01 (SPI MOSI -PIN 6) si PIN 14 al registrului de schimbare
• d12 – modul NRF24L01 ( SPI MISO -PIN 7)
• d13 – modul NRF24L01 (SPI SCK -PIN 5 ) si PIN 11 al registrului de schimbare
Conexiunile î ntre registrul de schimbare 74HC595 ș i modulele L293D:
• 74HC595 (PIN QA -15) – modulul L293D (PIN 2) #1
• 74HC595 (PIN QB -1) – modulul L293D (PIN 7) #1
• 74HC595 (PIN QC -2) – modulul L293D (PIN 10) #1
• 74HC595 (PIN QD-3) – modulul L293D (PIN 15) #1
• 74HC595 (PIN QE -4) – modulul L293D (PIN 2) #2
Figure 2.2. Banda de legături între L293D și motoare
Capitolul 2. Proiectare și implementare hardware
13 • 74HC595 (PIN QF -5) – modulul L293D (PIN 7) #2
• 74HC595 (PIN QG -6) – modulul L293D (PIN 10) #2
• 74HC595 (PIN QH -7) – modulul L293D (pin 15) #2 [8]
2.1. Plă cile Arduino
Arduino este o companie open -source care produce atât plăcuțe de dezvoltare
bazate pe microcontrolere , cât și partea de software destinată funcționării și programării
acestora. Pe lângă acestea include și o comunitate uriașă care se ocupă cu creația și
distribuirea de proiecte care au ca scop crearea de dispozitive care pot sesiza și controla
diverse activități sau procese în lumea reală.Aceste plăci pun la dispoziția utilizatorului
pini I/O, digitali și analogici, care pot fi interfațați cu o gamă largă de plăcuțe numite
scuturi (shield -uri) și/sau cu alte circuite. Plăcile au interfețe de comunicații seriale,
inclusiv USB pe unele modele, pentru a încărca programe din calculatorele personale .
Pentru programarea microcontrolerelor, Arduino vine cu un mediu de dezvoltare
integrat (IDE) bazat pe proiectul Processing , care include suport pentru limbaje de
programare ca C și C++ .
Primul Arduino a fost lansat în 2005, având ca țintă asigurarea unei soluții ieftine
și simple pentru începători și profesioniști spre a crea dispozitive capabile să
interacționeze cu mediul, folosind senzori și sisteme de acționare..
O plăcuță Arduino este compusă dintr -un microcontroler Atmel AVR de 8 -, 16- sau
32-biți ce au componente complementare care facilitează programarea și încorporarea în
alte circuite. Un aspect important la Arduino este că acesta dispune de conectori standard,
care permit utilizatorului să conecteze p lăcuța cu procesorul la diferite module
interschimbabile numite shield -uri. Unele shield -uri comunică cu Arduino direct prin
pinii digitali sau analogici, dar altele sunt adresabile individual prin magistrala serială I²C
permițând utilizarea mai multor module în paralel. Multe plăcuțe includ un regulator
liniar de 5 V și un oscilator cu cuarț de 16 MHz (sau un rezonator ceramic în unele
variante), deși anumite plăcuțe, cum ar fi LilyPad, funcți onează la 8 MHz și nu necesită
regulator, datorită restricțiilor de formă. Un microcontroler instalat pe Arduino vine
preprogramat cu un bootloader care simplifică încărcarea programelor pe memoria flash
a cipului, în comparație cu alte dispozitive care necesită programatoare externe. Acest
aspect face Arduino o soluție simplă, permițând programarea de pe orice computer
ordinar. Î n prezent, bootloader -ul optiboot este bootloader -ul implicit instalat pe Arduino
UNO . [9]
2.1.1 Placa Arduino UNO R3
A. Descriere
Arduino UNO este o placă de dezvoltare bazată pe microcontrolerul ATmega328.
Ea are 14 intrări digitale/pini de ieș ire (din care 6 pot fi utilizate ca ieșiri PWM), 6 intră ri
analogice, un oscillator cu quartz de 16 Mhz, o conexiune USB, o mufă de alimentare, o
mufă ICSP ș i un buton de resetare.
Capitolul 2. Proiectare și implementare hardware
14 Arduino UNO este diferit față de plă cile precedente, în sensul că nu foloseș te driver
FTDI USB -la serial. În schimb, acesta are î ncorporate microcontrolerul ATmega 8U2,
programat ca un convertor USB -la serial. [10]
B. Specificaț ii tehnice
Tabel 2.1. Tabel specificaț ii tehnice -Placa Arduino UNO R3
Microcontroler ATmega328
Voltajul de operare 5V
Voltajul de ieș ire 7-12V
Pini digitali I/O 14 ( din care 6 pot fi folosiț i ca PWM)
Pini analogici de intrare 6
Curent DC pentru pinii de I/O 40mA
Curent DC pentru pinul de 3.3V 50mV
Memoria 32KB din care 0.5 KB utilizaț i de bootloader
SRAM 2KB
EEPROM 1KB
Frecvență ceas 16MHz
C. Descrierea pinilor
Începâ nd de sus, există 14 pini digitali de intrare/ieș ire (I/O sau input/output).
Aceștia operează la o tensiune de 5 volți și pot fi controlați cu una din funcțiile pinMode(),
digitalWrite() și digitalRead().
Figura 2.3. Pini micorprocesor ATmega328
Capitolul 2. Proiectare și implementare hardware
15 Fiecare pin poate primii sau trimite o intensitate de maxim 40 mA și au o rezistență
internă între 20 -50 kOhmi ( default deconectată). În afară de semnalul standard I/O, unii
dintre pini mai au și alte funcții specializate.
• 0 (serial) RX – pin serial, utilizat în special pentru recepția (intrare – Rx) datelor
seriale asincrone ( asynchronous serial communication ).
Protocolul serial asincron este o metodă foarte răspândită în electronică pentru a
trimite și recepționa date între dispozitive. Acest protocol este implementat în dispozitiv
num it UART (Universal Asynchronous Receiver/Transmitter)
• 1 (serial) TX – pin serial, utilizat pentru trimiterea datelor asincrone (ieșire – Tx).
TTL vine de la transistor -transistor logic.
• 2 (External Interrupts) întrerupere externă. Acest pin poate fi configurat pentru a
declanșa o întrerupere la o valoare mică, un front crescător sau descrescător, s au
o schimbare în valoare.
• 3 (External Interrupts + PWM) întrerupere externă. Identic cu pinul 2.
Suplimentar, toți pinii marcați cu semnul ~ pot fi folosiți și pentru PWM (pulse
with modulation )
• 4 (I/O) pin standar d intrare/iesire
• 5 (PWM ) poate furniza control de ieșire pe 8 -bit pentru controlul PWM.
• 6 (PWM )
• 7 (I/O) pin standard intrare/ieșire
• 8 (I/O) pin standard intrare/ieșire
• 9 (PWM )
• 10 ( PWM + SPI) – suportă comunicare prin interfața serială ( Serial Peripheral
Interface ).
SPI-ul are patru semnale logice specifice iar acest pin se foloseste pentru SS – Slave
Select (active low; output din master). Pinii SPI pot fi controlați folosind libraria SPI.
• 11 ( PWM + SPI) – suportă SPI, iar acest pin se folosește pentru MOSI /SIMO –
Master Output, Slave Input (output din master)
• 12 (SPI) – suportă SPI, iar acest pin se foloseșt e pentru MISO /SOMI – Master Input,
Slave Output (output din slave)
• 13 (LED + SPI) – suportă SPI, iar acest pin se folosește pentru SCK /SCLK – Ceas
serial (output din master).
De asemenea, pe placă este încorporat un LED care este conectat la acest pin. Când
pinul este setat pe valoarea HIGH este pornit, când are valoarea LOW este oprit.
• 14 ( GND ) – împământare. Aici se pune negativul.
• 15 ( AREF ) – Analog REFference pin – este utilizat pentru tensiunea de referință
pentru intrările analogice. Se poate con trola folosind funcția analogReference() .
• 16 ( SDA ) – comunicare I2S
• 17 ( SCL) – comunicare I2S
Capitolul 2. Proiectare și implementare hardware
16
În partea de jos există o serie de 6 pini pentru semnal analogic, numerotaț i de la
A0 la A5. Fiecare din ei poate furniza o rezoluție de 10 biți (adică maxim 1024 de valori
diferite). În mod implicit se măsoară de la 0 la 5 volți, deși este posibil să se schimbe limit a
superioară a intervalului lor folosind pinul 15 AREF și funcția analogReference() . De
asemenea, și aici anumiți pini au funcții suplimentare descrise mai jos:
1. A0 standard analog pin
2. A1 standa rd analog pin
3. A2 standard analog pin
4. A3 standard analog pin
5. A4 ( SDA) suportă comunicarea prin 2 fire ( I2C (I-two-C) sau TWI (Two wire
interface)). Acest pin este folosit pentru SDA (Serial Data) la TWI.
6. A5 ( SCL) identic cu pinul 4, doar că acest pin este folosit pentru SCL (Serial Clock) la
TWI. Pentru controlul TWI se poate folosi librăria Wire .
Lângă pinii analogici arătați mai există o secțiune de pini notată POWER .
Acestia sunt ( începând de lângă pinul analog A0) :
• Pin 1-Vin – intrarea pentru tensiune din sursă externă (input Voltage)
• Pin 2-GND – negativul pentru tensiune din sursă externă (gr ound Voltage)
• Pin 3-GND – negativ. Se folosește pentru piesele și componentele montate la
arduino ca și masă/împământare/negativ.
• Pin 4-5V – ieșire pentru piesele și componentele montate la arduino. Scoate fix 5V
dacă placa este alimentată cu tensiune core ctă (între 7 și 12 v)
• Pin 5 -3,3V – ieșire pentru piesele și senzorii care se alimentează la această
tensiune. Tensiunea de ieșire este 3.3 volți și maxim 50 mA.
• Pin 6 -RESET – se poate seta acest pin pe LOW pentru a reseta controlerul de la
Arduino. Este d e obicei folosit de shield -urile care au un buton de reset și care
anulează de obicei butonul de reset de pe placa Arduino.
Figura 7.4. Pini Arduino UNO R3
Capitolul 2. Proiectare și implementare hardware
17 • Pin 7 -5VREF – este folosit de unele shield -uri ca referință pentru a se comuta
automat la tensiunea furnizată de placa arduino (5 v olți sau 3.3 volți)
(Input/Output Refference Voltage)
• Pin 8- pin neconectat, este rezervat pentru utilizări ulterioare (la reviziile
următoare ale plăcii probabil). [11]
2.1.2 Placa Arduino NANO V3
A. Descriere
Placa de dezvoltare este echipată cu acel ași micro -controller performant,
ATmega328p, de pe Arduino Uno. Avantajul acesteia îl reprezintă dimensiunile foarte
reduse, putând fi integrată în diverse proiecte în care spațiul componentelor este limitat.
Programarea dispozitivului se realizează prin intermediul unui cablu USB, nefiind
nevoie de un programator s pecial deoarece este instalat si un bootloader. [12]
B. Specificaț ii tehnice
Tabel 2.2. Tabel specificaț ii tehnice -Placa Arduino NANO V3
Tensiune de aliment are suportată de limitator 7V-12V
Tensiune de alimentare 5V
Pini I/O 14
Pini ADC 8 (din cei 14 de I/O)
Pini PWM 6 (din cei 14 de I/O)
Memoria flash 32 KB/16KB
Comunicaț ie TWI,SPI,UART
Curent pini I/O 40mA
Frecvența de funcț ionare 16Mhz
Dimensiuni 45×18 mm
Figura 2.5. Pini Arduino NANO V3
Capitolul 2. Proiectare și implementare hardware
18 2.2. Modulul de comunicaț ie radio NRF24L01
A. Descriere
• Tensiune de alimentare: 1.9 – 3.6V;
• Consum curent de 11.3mA la emisie cu o putere de 0 dBm;
• Consum curent de 13.5mA la recepția datelor cu 2 Mbps;
• Consum curent de 26uA în modul standby;
• Consum curent de 900nA în modul power down;
• Viteza de 250kbps, 1Mbps sau 2Mbps;
• Frecvență de funcționare de 2.4 GHz;
• Există pini toleranți la 5V;
• Interfață de comunicație SPI;
• Poate trimite date în câmp deschis până la 80m.
Modul wireless bazat pe circuitul integrat nRF24L01 care operează în banda ISM
standard de 2.4 GHz, capabil de viteze de până la 2 Mbps. Acest modul dispune de intrări
care tolerează tensiuni de până la 5 V, fiind ușor de interfațat cu plăci de dezvoltare
populare precum Arduino.
Modulul se alimentează la tensiuni de 3.3 V și comunică prin interfața SPI. Poate
trimite date în spațiu liber până la o distanță de 80 m. Modulul este foarte popular, fiind
folosit deseori în ca drul proiectelor dezvoltate la nivel hobby, dar și în aplicații
industriale.
Modulul este ideal pentru construirea de periferice wireless, telecomenzi fără fir,
aplicații de automatizări pentru casa inteligentă, RFID activ, aplicații VOIP și jucării
wirel ess.
Acest modul funcționează, inițial, cu putere maximă de emisie. În acest mod, nu
este suficientă alimentarea din plăcuța Arduino. Pentru a transmite datele la distanță
maximă este nevoie de o sursă externă de tensiune.
Transceiverul nRF24L01 folosește canale cu o lățime de bandă de 1 MHz, deci,
poate transmite pe 125 de can ale diferite (de la 0 la 124). [13]
B. Detalii tehnice:
1. Interfațarea prin SPI
Acest integrat foloseste protocolul de comunicație SPI(serial peripheral interface).
SPI este o interfața sincronă care poate funcționa la mare viteză, în modul full duplex.
Denumirea a fost data de catre Motorola. Aici, modul master/slave înseamnă, că
Figura 2.6. Design placa NRF24L01
Capitolul 2. Proiectare și implementare hardware
19 dispozitivul (circuitul) digital master inițiază cuvântul de date. Mai multe dispozitive
(circuite) digitale slave sunt permise cu slave select individual , adică cu selectare
individuală.
• SCLK – Ceas serial (output din master) – SCK
• MOSI /SIMO – Master Output, Slave In put (output din master)
• MISO/SOMI – Master In put, Slave Output (output din slave)
• SS – Slave Select (active low; output din master) – CSN
În cazul nostru modulul va funcționa în mod Slave, iar modulul de comandă v a fi
Master. Se va seta o viteză de comunicație de 1 Mb deș i sistemul poate funcționa și la 2Mb.
Pentru a putea comunica prin 24L01 tr ebuie ca pinul CSN să fie coborâ t în 0 pentru
a semnala modulu lui că se doreș te trimiterea unei cereri. Pe toată perioada în care CSN
este în 0 modulul are activă comunicaț ia SPI. De asemenea pinul CE trebuie să fie setat
pentru a scoate cipul din starea de standby.
Din cele patru moduri de transmitere a informaț iei prin protocolul SPI , NRF 24L01
foloseș te modul "0" (CPHA=0, CPOL=0). Din acest motiv modulul SPI din iteriorul uC
trebuie setat î n acest mod. (8)
Pentru a citii sau scrie date în regiș trii interni ai transcieverului se folosesc o serie
de comenzi prezentate în urmă torul tabel [14]:
Tabelul 2 .3. Comenzi citire/scriere
Comandă Codul comenzii Octeții de date Explicatie
R_REGISTER 000A AAAA 1-5 octeți, cel mai
nesemnificativ
primul Comandă de citire regiștrii stare,
AAAAA reprezintă adresa
registrului
FLUSH_TX 1110 0001 0 Curatare buffere transmisie
Figura 2.7. Citire/Scriere prin SPI
Capitolul 2. Proiectare și implementare hardware
20 W_REGISTER 001A AAAA 1-5 octeți, cel mai
nesemnificativ
primul Comandă de scriere regiștrii stare,
AAAAA reprezintă adresa
registrului. Activ doar în power
down sau standby.
R_RX_PAYLOAD 0110 0001 1-32 octeți, cel
mai
nesemnificativ
primul Comandă citire buffere
receptionate 1 -32 octeți, se începe
totdeauna cu octetul 0. Bufferele
sunt curatate când transmisia
catre
microcontroller -ul s-a incheiat.
W_TX_PAYLOAD 1010 0000 1-32 octeți, cel
mai
nesemnificativ
primul Comandă scriere în buffere
transmisie(1 -32 octeți), se
începe totdeauna cu octetul 0
FLUSH_RX 1110 0010 0 Curatare buffere receptie. Nu
trebuie apelata în modul receptie
(RX)
REUSE_TX_PL 1110 0011 0 Refolosire ultimul pachet. Se
foloseste același pachet până când
se apeleaza comandă
W_TX_PAYLOAD sau FLUSH_TX.
Funcția nu trebuie
activata/dezactivata în timpul
unei transmisii.
ACTIVATE 0101 0000 1 Aceasta comandă de scriere,
urmată de comandă 0x73
activeaza urmatoarele 3
funcționalitati. Fiecare mesaj
ACTIVATE il neaga pe cel
anterior. în cazul în care
funcționalitatile nu sunt active,
orice operatie asupra lor nu are
nici un efect.
http://acse.pub.ro/wp -content/uploads/2013/07/Disertatie_Udrea_Mircea_CASTR.pdf R_RX_PL_WID 0110 0000 Citieste dimensiunea primului
buffer de receptie.
W_ACK_PAYLOAD 1010 1PPP 1-32 octeți, cel
mai
nesemnificativ
primul Scrie datele care vor fi trimise
impreuna cu pachetul de tip ACK.
Activ doar în modul RX.
PPP reprezintă numărul canalului
pe care se va trimite acest pachet.
W_TX_PAYLOAD_
NO_ACK 1011 0000 1-32 octeți, cel
mai
nesemnificativ
primul Specifica transmițătorului să
dezactiveze funcția de primiere
mesaj de ACK.
Activ doar în modul TX.
NOP 1111 1111 0 Nici o comandă.
Capitolul 2. Proiectare și implementare hardware
21 • R_REGISTER se utilizează pentru a citii datele din interiorul unui SFR al
transcieverului. Modul de utili zare este următorul: î n locul caracterelor "A" se
introduce adresa pe care dorim să o citim. Aceată valoare se trans mite prin SPI
transcieverului. În acest moment NRF -ul știe că trebuie să citească o anumită
adresă . Pentru a "scoate" valoarea acesteia se m ai transmite un număr de bytes
egali cu lăț imea registrului car e trebuie citit. De exemplu, dacă dorim să citim un
registru care are lățimea de 1 byte ș i este localizat la adresa 01h algoritmul este
urmă torul:
1. CSN se face LOW;
2. Se trimite prin SPI instrucț iunea R_REGISTER care este de forma: 0b00000001;
3. Deși nu ne interesează este nevoie să citim ceea ce ne trimite NRF -ul.
4. Se trimite 1 byte oarecare ( de obicei NOP) iar ceea ce p rimim î napoi este chiar
valo area adresei care ne interesează .
• W_REGISTER se utili zează pentru a scrie o anumită valoare î ntr-un registru intern
al NRF -ului. Modul de utilizare este următorul: î n locul caracterelor "A" se
introduce adresa pe care dorim să o citim. Aceata valoare se trans mite prin SPI
transcieverului. Î n acest moment NRF -ul știe că trebuie să scrie la o anumită
adresă . Pentru a "scrie" valoarea a cesteia se mai transmite un număr de bytes egali
cu lăț imea registrului care trebuie citit. De ex emplu , dacă dorim să citim un
registru care are lățimea de 1 byte ș i este localizat la adresa 03h algoritmul este
urmă torul:
1. CSN se face LOW;
2. Se trimite prin SPI instrucț iunea W_REGISTER care este de forma :0b00100011;
3. Deși nu ne interesează citim ceea ce ne trimite în această fază NRF -ul;
4. Trimitem pe SPI 1 byte care va fi scris la adresa 03h;
5. Citim din nou ceea ce primim.
Înainte de a explica R_RX_PAYLOAD ș i W_TX_PAYLOAD ar trebui discutat
conceptul de "payload". Payload -ul nu este altceva decât denumirea dată de pr oducator
pentru datele primite ș i transmise.
Atât pe partea de transmi se (TX) cât și pe cea de recepție (RX) există câ te un
registru de tip FIFO (firs t in first out) structurat pe câte trei nivele. Lăț imea acestor nivel e
poate fi de la 1 la 32 bytes, în funcție de cum se setează payload -ul. Să luăm de exemplu
RX FIFO și să considerăm că în modul de comunicare î ntre doua transceivere de tip
NRF24L01 datele au fost setate să aibă o lăț ime de 5 bytes .
Emiță torul (TX) tri mte primul payload , acesta este primit de către receptor (RX) și
stocat î n primul nivel al RX FIFO al acest uia. În acest moment mai sunt libere încă două
nive le. Receptorul poate fi setat să citească primul payload sau mai poate aștepta până RX
FIFO se ump le (încă două payload -uri) și de abia după aceea să citească succesiv datele
primite.
• R_RX_PAYLOAD se util izază pentru a citii datele primite. După cum am văzut atunci
când transcieverul este in modul RX pinul CE este setat HIGH. După ce am primit
maximum 3 payload -uri (RX FIFO este plin) și minim 1, CE se setază LOW și se
trece la executarea urmă torului algoritm:
1. Se trimite prin SPI 0b01100001;
Capitolul 2. Proiectare și implementare hardware
22 2. Deși nu ne interesează citim ce ne trimite NRF -ul;
3. Se trimite 1 byte oarecare prin SPI NRF -ului iar ceea ce citim î napoi este de fapt byte –
ul zero al payload -ului. Se continuă trimiterea și citirea de bytes până câ nd a fost atinsă
lățimea la care a fost setat payload -ul.
• W_TX_PAYLOAD se utilizează pentru a scrie datele în TX FIFO, adică datele care
vor fi trans mise. Î n modul TX pin ul CE este setat LOW. Se execută urmă torul
algoritm:
1. Se trimite prin SPI 0b10100000;
2. Deși nu ne interesează citim ceea ce ne trimite NRF -ul;
3. Se încarcă nivelele sau , dacă se doreș te, doar primul nivel al TX FIFO cu un numar de
bytes e gal cu lăț imea payload -ului. Acest lucru se face trimițând succesiv prin SPI
numărul dorit de bytes având grijă să citim în acelaș i timp ceea ce ne trimite
tranceiver -ul.
4. După ce au fost încărcate datele CE se setează HIGH pentru o periodă de minim 10 µS.
• FLUSH_TX si F LUSH_RX sunt folosite pentru a șterge datele existente în RX ș i TX
FIFO.
• REUSE_TX_PL se utilizează pentru a transmite în mod constant aceleași date
încărcate î n TX FIFO.
• NOP după cum îi zice și numele nu execută nimic și este folosit pentru a citii starea
regiș trilor, de exemplu registrul STATUS. [15]
Aplicaț ii:
• Controlul aplicaț iilor wireless
• Mesh Networks
• RF Remote Controllers
• Connected devices
Figura 2 .8. Model NRF24L01 2D
2. Protocolul I2C
În cazul UC -urilor Atmel, protocolul I2C este denumit TWI ( two wire interface).
Această interfață este folosită în cazul nostru pentru comunicația cu EEPROM -ul 24LC128.
Pentru comunicația cu acesta, vom considera următoarele proprietăți:
• Doar doi pini folosiți ;
• Operarea se face atât ca transm ițător și receptor ;
• Viteza maximă de comunicație 400kHz ;
• Circuit de filtrare a zgomotului pe linii, zgomote mai mici de 50ƞs.
Capitolul 2. Proiectare și implementare hardware
23 Cei doi pini folosiți sunt SCL (serial clock) și SDA (serial data line). Ambele linii sunt
conectate la VCC prin două rezistențe d e pull-up. Tensiunea de alimentare a liniilor este
de 3,3V sau 5V.
Fiecare bit transmis prin interfață este acompaniat de semnalul de ceas. Pentru
fiecare citire, linia de date trebuie să ajungă într -o stare stabilă înainte să fie citită. Singura
excepție apare atunci când se generează semanale de start și stop. În imaginea următoare
este prezentată zona de citi re corectă, respecitv incorectă.
Interfața I2C este o interfață pe care pot fi conectate până la 128 de echipamente
cu adrese diferite. Comunicația este inițiată de Master prin trimiterea semnalului de Start
și este terminată tot de Master prin semnalul de Stop. Între Start și Stop, lini a se consideră
ocupată și nici un alt echipament nu poate transmite. Totuși, în acest interval se poate
trimite încă o comandă de Start (repeated start) care sugerează că același Master dorește
să transmită informații. Semnalul de Start sau Stop este gen erat prin tranziția linei SDA
atunci când linia SCL este în 1.
Pentru comunicare prin interfață trebuie trimis un pachet cu adresa device -ului pe
care dorim să îl accesăm. Acest pachet are 9 biti, 7 sunt biți de adresă, un bit de
Citire/Scriere (1: Citire, 0: Scriere) și un bit de ACK. Bitul de ACK nu este trimis explicit de
Master, dar Slave -ul cu adresa cerută trebuie să pună linia SDA pe 0 dacă este pregătit de
comunicație sau să o lase în 1 dacă nu este disponibil. Practic al n ouălea bit este bitul de
ACK. În cazul în care se trimite NAK, Masterul trimite START sau STOP.
Adresa 0000 000 este adresa de broadcast, la această adresă toate echipamentele
ascultând mesajul.
Figura 2.9. Sincronizarea SDA -SCL bit
Figura 2.10. Conexiunea I2C
Figura 2.11. Pachet I2C
Capitolul 2. Proiectare și implementare hardware
24 C. Comunicaț ia cu Arduino
Modulul poate folosi 125 de canal e diferite, ceea ce oferă posibilitatea de a avea o
rețea de 125 modemuri independente de lucru într -un singur loc. Fiecare canal poate avea
până la 6 adrese sau fiecare unitate poate comunica cu până la 6 alte unități în a celași
timp.
NRF24L01 Principiile de lucru ale canalelor și adreselor :
D. Componente și conectare
Componente:
• 2xNRF24l01 ;
• Arduino Uno ;
• Arduino Nano ;
• Cabluri, butoane, Led-uri.
Tabel 2.4. Conexiuni
NRF24L01 Arduino UNO/NANO
Vcc 3.3V
Gnd Gnd
Csn 7
Ce 8
Mosi 11
Misa 12
Sck 13
Figura 2.13. Conectare Arduino UNO/NANO cu modulul NRF24L01
Figure 2.12. Frec vența de transfer și trimiterea informației simultană pe mai multe canale
Capitolul 2. Proiectare și implementare hardware
25 2.3. Senzorul flexibil Spectra Symbol
A. Descriere:
Sensibilitatea unei lovituri în orice produs este ușoară c u ajutorul unui senzor Flex
Resistive Flex de la Spectra Symbol. Fabricat cu cele mai bune materiale, acest produs este
esențial în orice fabrică și instalație de robotică. Senzorii flexibili Spectr a Symbol sunt
disponibili în următoarele lungimi active: 2.18 inch și 3.75 inch.
Caracteristici:
• Rezistență ridicată la temperaturi extreme
• Fiabil și consistent
• Poate fi montat pe suprafețe fixe și flexibile
• Nenumărate rapoarte de îndoire și posibilități de rezistență
• Pot fi proiectate personalizate pentru a se potrivi cu specificațiile clienților
Domenii de utilizare:
1. Robotică – controlul mișcării articulațiilor sau plasării este ușor cu senzori i
flexibili.
De asemenea, se pot utiliza aceste produse ca întrerupătoare pentru barele de
protecție pentru detectarea eficientă a pereților.
2. Bio-metri – Producătorii de echipamente sportive folosesc senzori flexibili pentru
a indica plasarea sau mișcarea.
3. Mănuși de jocuri virtuale de r ealitate – senzorii sunt componente importante
folosite în fabricarea mănușilor de realitate virtuală.
Lanterna Nintendo Power este un bun exemplu.
4. Alte aplicații – senzorii flexori sunt folosiț i în diferite produse tehnologice, cum ar
fi comenzile auto ș i industriale, perifericele computerelor, joystick -urile și
dispozitivele de măsură. Acestea sunt prezente și în produsele de fitness, în
instrumente muzicale și în sistemele de asistență tehnologică ale vehiculelor
moderne. [16]
B. Specificaț ii mecanice:
• Ciclul de viață: > 1 milion;
• înălțime: 0,43 mm (0,017 ");
• Domeniul de temperatură: -35°C până la + 80°C;
Specificatii electrice:
• Rezistența la încovoiere: 10K ohmi ± 30%;
• Rezistența la încovoiere: minim de 2 ori mai mare decât rezistența plană la
îndoirea de 180°;
• Putere nominală: 0,5 W continuu; Vârf de 1 Watt;
Capitolul 2. Proiectare și implementare hardware
26 Tamponul de impedanță din circuitul [Basic Flex Sensor Circuit] de mai sus este
un amplificator operațional cu o singură față, utilizat cu acești senzori deoarece curentul
redus al op -amp reduce errer datorită impedanței sursei senzorului flex ca separator de
tensiune. Sugestii de a mperi op sunt LM358 sau LM324.
• Tampon reglabil – un potențiometru poate fi adăugat la circuit pentru a regla
intervalul de sensibilitate.
• Comutator de prag variabil de deturnare – se utilizează un amplificator op și se
emite fie înaltă, fie înaltă, în funcție de tensiunea intrării inversoare. În acest fel,
puteți utiliza senzorul flex ca un comutator fără a trece printr -un microcontroler.
• Rezistența la con vertorul de tensiune – utilizează senzorul ca intrare a unei
rezistenț e la convertorul de tensiune utilizând un op -amp de alimentare dublă. O
tensiune de referință negativă va da rezultate pozitive. Ar trebui să fie utilizat în
situațiile în care doriți o ieșire la un nivel scăzut de încovoiere.
Figura 2.14. Modificarea valorii rezistenței senzorului flexibil
Capitolul 2. Proiectare și implementare hardware
27 B. Comunicaț ia cu Arduino
Folosind aceeași matrice LED ca și înainte și schimbâ nd Photo Resistor pe ntru un
senzor Flex (sau Bend) și o ușoară modificare a codului, acum pot avea un show de lumină
care poate fi controlat prin "Bending".
Mi-am folosit degetul pentru a îndoi senzorul , dar aș fi putut să -l atașez la o plantă,
un copac sau altceva care se îndoaie. Înclinarea modifică rezistența și, prin urmare,
valoarea INPUT la pinul analogic 0.
Componente necesare:
• Arduino UNO
• 10 x LED -uri roșii
• Resistoare de 9 x 330 Ohm pentru LED -uri
• Rezistor 1 x 10K Ohm pentru senzorul de flex.
• 1 x senzor flexibil Symbo Flex
• Fire și un breadboard pentru a le conecta împreună
2.4. Registrul de schimare 74HC595N
A. Descriere:
Acest produs reprezintă un circuit integrat care conține un registru de schimbare
(șiftare) cu ajutorul căruia puteți transforma informațiile transferate prin interfața serială
în informațiile interfeței paral ele.
De exemplu, îl putem folosi în proiectele în care dorim să controlăm un număr
mare de LED -uri, neavând acces la un număr mic de p ini pe microcontrolerul Arduino .
[17]
74HC595 reprezintă un registru de schimbare pe 8 biți și un zăvor de tip D pe 8
biți cu ieșiri paralele cu trei stări. Registrul de schimbare acceptă date seriale și oferă o
ieșire în serie. Registrul de schimbare oferă, de asemenea , date paralele cu zăvorul pe 8
biți. Registr ul de schimbare și zăvorul au intrări de ceas independente. Acest dispozitiv
are, de asemenea, o resetare asincronă pentru registrul de schimbare.
Figura 2.15. Schema Fritzing a circuitului de test al senzorului flexibil
Capitolul 2. Proiectare și implementare hardware
28 HC595 interfață direct cu portul de date seriale SPI pe MPU -uri CMOS și MCU -uri.
Caracteristici :
• Capacitate unitate de ieșire: 15 sarcini LSTTL ;
• Ieșiri direct Interfață pentru CMOS, NMOS și TTL ;
• Interval de tensiune de operare: 2,0 până la 6,0 V ;
• Curent de intrare scăzut: 1,0 µA ;
• Imunitate cu zgomot ridicat caracteristic dispozitivelor CMOS ;
• Performanță ESD: HBM> 2000 V; Model de mașină> 200 V ;
• Complexitatea cipurilor: 328 FET -uri sau 82 porți echivalente . [18]
Aplicabilitate:
• Conversie de date din serial în paralel ;
• Captureaza și menține datele pentru perioade prelungite de timp ;
• Permite flux uri simple de biți seriali de la un microcontroler la controlul multor linii
periferice necesare ;
• Gamă largă de produse precum:
o Perifericele computerului
o Electrocasnice
o Control industrial
Descrierea pinilor :
Numă r pin Nume pin Funcți e
1 Q1 Ieșire paralela de date 1
2 Q2 Ieșire paralela de date 2
3 Q3 Ieșire paralela de date 3
4 Q4 Ieșire paralela de date 4
5 Q5 Ieșire paralela de date 5
6 Q6 Ieșire paralela de date 6
7 Q7 Ieșire paralela de date 7
8 GND Masa
9 Q7S Ieșire seriala de date
10 MR Master Reset Input
11 SHCP Intrarea de ceas a registrului de
schimbare
12 STCP Intrarea de ceas a registrului de stocare
13 OE Activare intrare/ieș ire
14 DS Intrate seriala de date
15 Q0 Ieșire paralela de date 0
16 Vcc Alimentare
Capitolul 2. Proiectare și implementare hardware
29 INTRĂRI
A (Pin 14)
• Intrare seriala de date. Datele de pe acest pin sunt transferate în registrul de
schimbare seriala pe 8 biți.
INTRĂRI DE CONTROL
Schimb ceas (Pin 11)
• Intrare de ceas a registrului de schimbare. O tranziție ”low -to-high“ de pe această
intrare face ca datele de pe pinul de intrare serial să fie schimbate în registrul de
schimbare pe 8 biți.
Resetare (Pin 10)
• Intrare de resetare a înregistră rilor active joase, asincrone. Permite acestui pin să
reseteze singur porțiunea de înregistrare a acestui dispozitiv. Zăvorul pe 8 biți nu
este afectată .
Ceasul ză vorului (Pin 12)
• Stocare a intră rii ce asului zăvorului . O tranziție “low-to-high ” introduce această
informație pentru blocarea datelor.
Acti vare ieș ire (Pin 13)
• Activare ieșire joasă . Un nivel scăzut la această intrare permite prezentarea datelor
de la zăvoare la ieșiri.
O valoare maximă a acestei intrări forțează ieșirile (QA -QH) în starea de înaltă
impedanță. Ieșirea în serie nu este afecta tă de această unitate de control.
IEȘIRI
QA – QH (Pinii 15, 1, 2, 3, 4, 5, 6, 7)
• Ieșiri de blocare cu 3 stări, neinvertite.
SQH (Pin 9)
• Ieșire de date în serie neinversata. Aceasta este rezultatul celei de -a treia etape a
schimbului registrului pe 8 biți. [19]
Diagrama timpului
Capitolul 2. Proiectare și implementare hardware
30 B. Conectarea cu Arduino
În proiect avem de controlat 5 motoare, un LED, 2 butoane ș i un modul wireless cu
un singur modul Arduino Uno. Folosim registrul de schimbare pentru a “extinde” numă rul
de pini.
Întrucâ t NRF24 folosea deja interfața SPI, am decis să folosesc și SPI pentru
programarea registrului de schimburi (pentru viteză și pentru a salva pinii) în locul
funcției shiftout ().
Table 2.5. Conexiuni
Pini Arduino Pini 74HC595N
A1 Pin 12
D11 Pin 14
D13 Pin 11
Pini 74HC595N Pini L293D
QA(15) L293D #1 (2)
QB(1) L293D #1 (7)
QC(2) L293D #1 (10)
QD(3) L293D #1 (15)
QE(4) L293D #2 (2)
QF(5) L293D #2 (7)
QG(6) L293D #2 (10)
QH(7) L293D #2 (15)
Schema de conectare:
Figura 2.16. Schema Fritzing de interconectare a modulului 74HC595 cu modulele L293D și
Arduino UNO
Capitolul 2. Proiectare și implementare hardware
31 2.5. Modulul L293D
O punte H (eng. H Bridge) este un circuit electronic ce permite aplicarea unei
tensiuni pe o sarcină în orice sens. Aceste circuite sunt adesea folosite în robotică și alte
aplicații pentru a permite motoarelor de curent continuu să ruleze înainte și înapoi.
Punț ile H sunt disponibile ca circuite integrate sau pot fi construite din componente
discrete, tranzistoare bipolare sau MOS.
Puntea H are numele derivat de la modul obișnuit de desenare a circuitului.
Aceasta este singura cale de tip solid state de a coman da motorul în ambele direcții.
A. Mod de funționare:
Atunci când întrerupătoarele S1 și S4 (în conformitate cu figura 2.17 ) sunt închise
și S2 și S3 sunt deschise o tensiune pozitivă va fi aplicate la nivelul motorului. Prin
deschiderea întrerupătoarelor S1 și S4 și închiderea întrerupătoarelor S2 și S3, această
tensiune este inversat, astfel să permită funcționarea inversă a motorului.
Folosind nomenclatura de mai sus, întrerupătoarele S1 și S2 nu trebuie să fie
închise în același timp, deoarece acest l ucru ar provoca un scurt -circuit la sursa de
tensiune (Vin). Același lucru se aplică și întrerupătoarelor S3 și S4.
În practică întrerupatoarele S1, S2, S3, S4 sunt tranzistoare bipolare sau MOS -FET.
Figura 2.17. Scheme întrerupatoare
Capitolul 2. Proiectare și implementare hardware
32
Figura 2 .18. Punte H realizată cu tranzistoare MOSFET complementare
Descriere L29 3D pentru conectarea a 2 motoraș e DC :
L293D este cea mai uș oară cale pentru construirea unui driver pentru motoare
deoarece trebuie doar să lipim firele de la motoraș e la integrat, pini de control la
microcontroler, ș i pini de alimentare la baterie.
Pinul 16(Vcc1) se a limentează la o tensiune de 5V.
Figura 2 .19. Punte -H cu tranzistoare bipolare și logica de
comandă
Capitolul 2. Proiectare și implementare hardware
33 Pinul 8(Vcc2) se alim entează la o tensiune maximă de 24V, acesta este pinul de la
care motoarele primesc curent.
Pini 4, 5, 13, 12 sunt GND, deci îi conectăm pe toți 4 între ei și apoi îi conectăm la
minusul sursei de alimentare pentru Vcc1 și Vcc2.
Pinul 1(1,2EN) este pinul de ENABLE pentru primul motoraș și se conectează la
microcontroler sau la Vcc1, în funcție de programul pe care îl folosim pentru a controla
primul motoraș.
Pini 3, 6 (1Y,2Y) sunt pini care se conectează la un motoraș DC.
Pini 2,7(1A,2A) sunt p ini de control pentru un motoraș care s e conectează la
microcontroler.
Pinul 9 (3,4EN) este pinul de ENABLE pentru al doilea motoraș, care se conectează
la microcontroler sau la Vcc1, în funcție de programul pe care îl folosim î n controla rea
celui de al doilea m otoraș.
Pini 14, 11(4Y,3Y) sunt pini care se conecte ază la un al doilea motoraș DC.
Pini 15, 10 (4A,3A) sunt pini de control pentru cel de al doilea motoraș , care se
conectează la microcontroler.
Pinul 1 și pinul 9 (pinii de enable) sunt ca un fel de întrerupatoare; pinul 1 când
este străbă tut de un curent electric cu o tensiune de 5 V permite curentului electric să
ajungă la primul motor, cât timp nu este stră batut de un curent electric, acesta nu permite
mișcarea motorului deoarece nu mai permite c uren tului electric să ajungă la motor. Pinul
9 face acelaș i lucru n umai că pentru al doilea motor.
Pinul 2 ,pinul 7, pinul 15 ș i pinul 10 (1A,2A , 4A,3A) sunt pini de control a celor 2
motoare; dacă vrem ca ambele motoare să meargă într -o direcț ie, trebuie ca pinul 2 (1A)
și pinul 15 (4A) să aibă aceeaș i valoare . [20]
2.6. Motorul servo MG996R
A. Descriere
Spre deosebire de motoarele DC, care produc rotație continuă cât timp sunt
conectate la o sursă de alimentare, motoarele servo sunt folosite pentru a obține rotații
parțiale, stabilite ș i controlat e, pentru efectuarea unor operații cu amplitudine mică dar
cu precizie rid icată: acționare mecanism de î nchidere -deschidere, poziț ionare senzori,
efectuarea unor gesturi , etc.
Motoarele servo au 3 fire, iar culoarea acestora variază în funcție de producă tor. Culoarea
roșie desemnază de obicei Vcc (5V), î n timp ce GND este de obicei negru sau maro. Pe Figura 2.20. Motorul servo MG995
Capitolul 2. Proiectare și implementare hardware
34 lângă aceste două fire de alimentare, există un al treilea, firul de comandă , care este de
obicei galben, portocaliu sau alb.
Figura 2.21. Tipuri de scheme de culori folosite la motoarele servo
Motorul servo nu execută (de obicei) o rotație completă , ci va devia de la poziț ia
de echilibru cu un unghi controlat de tensiunea aplicată pinului de semnal. Folosind un
semnal PWM pe acest pin, vom avea c ontrol asupra unghiului de rotaț ie al motorului.
Cel mai simplu mod de a controla motoarele de tip servo este prin folosirea
bibliotecii Servo. Folosirea acestei bib lioteci permite controlarea a până la 48 de motoare
pe placa Arduino Mega. Dacă se foloses c mai mult de 12 motoare, bibliotec a va dezactiva
PWM pe pinii 11 și 12. La Arduino Uno, această bibliotecă va d ezactiva PWM pe pinii 9 ș i
10, indiferent de câ te motoare se folosesc. [21]
B. Caracteristici tehnice -motor ul servo TowerPro MG996R
Motorul servo MG996R vine cu niște îmbunătățiri esențiale față de modelul
MG995. Dispune de îmbunătățire a protecției împotriva șocurilor, a plăcii de bază și
circuitelor integrate cea ce îl face mai performant decât predecesorul său. Motorul vine
cu un fir lung de 30 cm, un conector de tip “S” cu 3 pini care se potrivește cu majoritatea
receptoarelor. Motorul se rotește de la 0 – 360 grade (continuu). Este perfect pentru
începători în realizarea proiectelor deoarece este mic, ușor și încape cu ușurință în
realizarea unui avion, mașini, etc.
Table 1.6. Modelul MG996R
• Poziționare exactă • Răspuns rapid
• Greutate 55gr • Tensiune de operare 4.8V -7.2V
• Viteza de operare 4.8V: 0.20sec/60 ° • Viteza de operare 6.6V:0.16sec/60 °
• Dimensiune:40.7 x 19.7 x 42.9mm • Lățimea benzii: 5 µs
• Rezistență la temperaturi cuprinse
între:0 °C-55°C • Unghiul de directivă: 0 -360 °
2.7. Modulul giroscopic MPU6050
A.Descriere modul
Giroscopul, î n termeni simpli, este un mic dispozitiv folosit la măsurarea și
menținerea orientației. Î n ziua de azi, aproape orice telefon mob il are un mic giroscop pe
care îl utilizează atunci câ nd s e schimbă poziț ia ecranului din modul Portrait î n
Landscape. Avioanele, elic opterele sau a paratele de zbor în general, utilizează
giroscoape ce le ajută la orientarea în spaț iu. [22]
Capitolul 2. Proiectare și implementare hardware
35 Modulul conține un circuit integrat MPU -6050 cu accelerometru, giroscop și
senzor de temperatură. Acesta comunică pe interfață I2C, având nevoie de doar 2
conexiuni. Fiecare dispozitiv ce folosește interfața I2C are propria adresă. MPU6050 poate
selecta una din două adrese disponibile, legând pinul AD0 la GND sau VCC. Această
conexiune este făcută de obicei pe placuța modulului.
Este util în proiectele ce au nevoie să detecteze mișcarea și intensitatea ei, cum ar
fi jocuri, stabilizar e de imagine, step counter, etc. [23]
B.Caracterizarea pinilor
Nr. Pin Nume pin Descriere
1 Vcc Pinul de alimentare:de la +3V la +5V (de obicei
este folosit la 5V
2 Ground Se conectează la împămâ ntarea echipamentului
3 Serial Clock
(SCL) Oferă semnalul de ceas pentru comunicaț ia I2C
4 Serial Data
(SDA) Folosit pentru transferarea datelor prin
comunicaț ia I2C
5 Serial Data
Auxiliar (XDA) Poate fi folosit î n conexi unea cu alte module
I2C(este obț ional)
6 Serial Clock
Auxiliar (XCL) Poate fi folosit î n conexi unea cu alte module
I2C(este obț ional)
7 AD0 Dacă se utilizează mai multe MPU6050 un
singur MCU, acest pin poate fi utilizat pentru a
varia adresa.
8 Interrupt(INT) Întrerupe pinul pentru a indica faptu l că datele
sunt disponibi le pentru citirea MCU
Figura 2.22. Pinii modulului MPU6050
Capitolul 2. Proiectare și implementare hardware
36 C. Comunicaț ia cu Arduino
Accelerometrul măsoară accelerația pe o direcție, în timp ce giroscopul măsoară
accelerația unghiulară pe o axă. Pinii analogici nu sunt setați pe INPUT, deoarece este
setarea lor implicită. Valorile citite de pinii analogici vor fi trimise către portul se rial.
Deschidem Serial Monitor, mutam senzorul și încercam să vedem cum se schimbă valorile.
Accelerometrele pot fi utilizate pentru proiecte distractive, de exemplu pentru a realiza
un controler de joc. [24]
Table 2.7. Conectare pin i
Arduino Uno MPU6050
3.3V -5V Vcc
GND GND
SCL A5
SDA A4
Figura 2.23. Schemă conectare Arduino UNO -MPU6050
Figura 2.24. Modelul realizat fizic Figura 2.25. Rezultate afiș ate pe Serial Monitor
Capitolul 3 . Implementare software
37 CAPITOLUL 3. IMPLEMENTARE SOFTWAR E
În organ igrama de mai sus sunt prezentați pașii și acțiunile pe care programul îi
urmează în funcție de acționările modulelor, a senzorului și a butoanelor după cum
urmeaza:
• Cleștele brațului robotic este controlat de butoanele aflate pe degetul mijlociu și
inelar.
• Încheietura brațului robotic este c ontrolată de un senzor flexibil 2. 2” SF10264.
• Păstrarea degetului drept opreșt e încheietura brațului robotic.
Cotul , umărul și baza brațulul robotic sunt controlate de modulul GY -521 Mpu -6050
astfel: – Înclinarea palmei în sus și în jos deplasează cotul în sus și în jos;
o Înclinarea palmei spre dreapta și spre stânga mișcă umărul în sus și în jos ;
o Înclinarea palmei spre dreapta și stâ nga deplasează baza în spre dreapta și spre
stânga
o Led-ul situat pe clește pornește/oprește prin apăsarea simultană a butoanelor
Toate programele create și implementate trebuie să respecte o anumită logică.
Orice program trebuie să conțină biblioteci necesare, un bloc de inițializare, unul de
setare și unul repetitiv. Programul principal conține o buclă repetitivă ce apelează pe
rând subrutine și execută diferite acțiuni în funcție de schimbările ce apar în variabilele
monitorizate. Pentru implementarea software am folosit programul Arduino IDE.
3.1. Mediul de lucru Arduino IDE
Pentru dezvoltarea programelor și pentru programarea platformelor Arduino se
utilizează mediul de program are Arduino IDE. Acesta se poate descărca de la adresa
https://www.arduino.cc/en/Main/Software și este distribuit cu titlu gratuit. Există
variante pentru cele mai uzuale sisteme de operare: Windows, Mac OS și Linux. O altă Figura 3.1. Organigrama comenzilor
Capitolul 3 . Implementare software
38 alternativă este crearea de programe utilizând platformele software care sunt online
https: //create.arduino.cc/ . Presupunând că sistemele de operare care sunt, uzual,
instalate pe calculatoarele din laborator sunt cele de tip Windows, în continuare se va
face referire la utilizarea acestora. După descărcarea și instalarea mediului de
programare Arduino IDE se rulează aplicația și se obține imaginea din figura 3.2:
Arhitectura unui program pentru Arduino
Programele scrise pentru platformele Arduino poartă denumirea de „sketch”.
Acestea sunt alcătuite din două funcții importante:
void setup (){
// instrucțiunile de aici se execută o singură dată, la pornire
// se utilizează pentru setări și inițializări
}void loop() {
// instrucțiunile de aici se execută în buclă, de la ultima instrucțiune se reia bucl a
// cu prima instrucțiune din această funcție, aici e programul principal
// se execută în mod repetat până la oprirea alimentării cu energie a sistemului
}
După cum au fost descrise pe scurt, prima funcție este utilizată pentru inițializarea
variabilel or, a comunicației seriale (de exemplu baud rate), pentru declararea pinilor ca
fiind de ieșire sau de intrare, diverse funcții pentru inițializarea unor senzori, etc. Această
funcție este executată la pornirea (imediat după alimentarea sau după reset) sis temului
de dezvoltare Arduino Uno, fiind rulată o singură dată. A doua funcție (loop();), este
funcția similară cu „main()” din limbajul de programare „C”, este rulată în buclă, adică la
sfârșitul execuției ultimei instrucțiuni din cadrul funcției este con tinuată cu execuția
primei instrucțiuni din această funcție, totul fiind un ciclu care se repetă continuu.
Instalare Arduino IDE
Instalarea mediului de programare Arduino IDE începe prin descărcarea
programului de la adresa https://www.arduino.cc/en/Main/Softwarea versiunii dorite.
Sunt disponibile si versiuni mai vechi precum si versiuni care necesită instalarea sau doar
dezarhivarea și rularea programului. Aceasta ultimă variantă se utilizează în s ituațiile în
care se utilizează sistemul de operare Windows la care nu se cunoaște sau nu se dorește
instalarea programului (sau utilizatorul nu are drepturile necesare instalării).
Figura 3 .2. Ecranul de start Arduino IDE
Capitolul 3 . Implementare software
39 Mediul de programare Arduino IDE poate fi instalat pe cele mai uzuale si steme de
operare: Windows, Linux, Mac OS. În continuare se va presupune instalarea sau utilizarea
lui folosind sistemul de operare Windows.
În momentul descărcării programului este posibilă și donarea unei sume modice,
necesare pentru finanțarea acestui p roiect, donația nu este o condiție obligatorie, se
poate descărca programul și fără acest act de caritate.
După instalare sau după prima rulare (în cazul variantei care nu necesită
instalare), programul va crea în folderul Documentsun folder Arduino unde va salva
bibliotecille de funcții care vor fi instalate ulterior precum și programele nou create vor
fi salvate acolo în mod implicit (dacă nu se specifică altă cale).
La rularea Arduino IDE va apărea ecranul de start din figura 3.3. După lansarea în
execuție a programului va fi necesară configura rea lui. De menționat că această
configurare, a portului de comunicație, va trebui repetată de fiecare dată când se schimbă
portul USB din calculator la care este conectată platforma Arduino, de f iecare dată când
se va utiliza alt sistem Arduino și la fiecare pornire a calculatorului.
Este necesar acest lucru deoarece, teoretic, la fiecare conectare a Arduino la
calculator, sistemul de operare va atribui acestei conexiuni virtuale seriale un nume,
acest nume poate să difere dacă se schimba sistemul sau dacă trece un anumit timp în
care Arduino nu a f ost conectat la calculator. [25]
Figura 3.3. Configurare Arduino IDE
Capitolul 3 . Implementare software
40 În figura de mai sus se observă meniul de configurare unde se pot face setările
menționate: Din meniul Board se alege platforma Arduino pentru care se realizează
programul sau placa ce va fi programată, iar în meniul Port se alege portul serial prin
intermediul cărei a se poate comunica cu platforma Arduino selectată.
După finalizarea configurărilor, se poate trece la etapa de scriere a programului
pentru microcontroller. În meniul File în secțiunea Examples se pot găsi exemple de
programe, fiind grupate pe categorii, ori oferite de către Arduino, ori programe exemple
apărute odată cu adăugarea librăriilor.
Adăugarea librăriilor se realizează doar o singură dată, acestea rămânând salvate
în folderul Arduino. Ele conțin funcții ce permit conectarea, accesul la date, comenzi sau
alte comenzi ce permit utilizarea noilor componente. Astfel, se realizează un acces la nivel
mai înalt la aceste componente, putându -le utiliza fără a cunoaște foarte detaliat modul
de comunicare sau de transmitere a datelor. [26]
Figura 3.4. Exemple de programe din Arduino IDE
Figura 3.5. Opțiunile necesare includerii de librării
Capitolul 3 . Implementare software
41 3.2. Programul Arduino
3.2.1. Programul cutiei de control al brațului
La începutul programului se adaugă l ibrăriile, în cazul nostru fiind cea a modului
radion NRF24L01, includerea protocolului de comunicații de date SPI și a directivei de
pini I/O.
Se definesc pinii, valorile de transmitere și retransmitere pentru comunicația
radio, valorile minime și maxime a modulației prin puls a fiecărui motor cât și a celor de
start, stop, stâ nga, dreapta.
Capitolul 3 . Implementare software
42 Aici se definesc pinii de intrare și de ieșire pentru f iecare funcție îndeplinită de
brațul robotic OWI:
• Aprindere LED
• Butoanele de START/STOP
• Pinul CE al modulului radio
• Controlul motoarelor prin PWM
“Task” reprezintă o funcție ce se regăseș te în libraria “TaskScheduler ”. Pentru a nu
avea probleme cu întâ rzieri prea mari datorate delay -ului, preferăm să acordăm atribuții
anumitor funcț ii pentru a ru la repetat pe tot parcursul rulă rii programului.
Pentru motoare – două abordări diferite :
1. Dacă motorul a fost oprit – începem execuția în direcția solicitată cu creșterea treptată
a vitezei .
Capitolul 3 . Implementare software
43 2. Dacă motorul se mișcă și i se cere să oprească – inițiem un impuls invers pentru a frâ na.
3. Dacă motorul se mișca într -o direcție și i se sol icită imediat inversarea, aplicăm
numărul 2, apoi numă rul 1.
Funcțiile se repetă pentru fiecare motor î n parte.
Viteza ideală a ratei de date a magistralei SPI trebuie să fie minim de două ori.
Dacă presupunem rat a de 2 Mbs și ceasul de 16 MHz și împărțindu -l la 4, rezultatul
este minimul dorit.
CLK Magistra la
8MHz 2MHZ
16MHz 4Mhz
20Mhz 5MHz
3.2.2. Programul părții de comandă ș i transmisie a l braț ului
La începutul programului declarăm librăriile folosite , în cazul nostru cele ale
modulul radio NRF24L02, incl uderea protocolului de comunicații de date SPI ș i a
directivei de pini I/O, libră ria modulului giroscopic MPU6050, librăria filtrului
impuls/ră spuns și a celui digital.
Capitolul 3 . Implementare software
44 Se defines c pinii, valorile minime și maxime a modulației prin puls a fiecă rui
motor, se definesc valorile de start, stop , stânga, dreapta, valorile perioadei de
transmitere, măsurare și reacț ie a modulului radio .
Se acordă câte un număr de pachete de biț i pentru fiecare motor folosit, Led-ul
brațului robotic dar și că tre PWM.
Capitolul 3 . Implementare software
45 Se observă din poză că se a pelează la librăria “TaskScheduler”, urmâ nd a da sa rcini
de rulare repetitive funcției de mă surare a valorii rezi stenț ei variabile i, a funcției de
transmitere a informațiilor și a întârzierii mă surate pe senzorul flexibil.
Se introduc variabilele de tip î ntreg și cele de tip “long” ale modulului
accelerometru ș i giroscop MPU5060 și ale senzorului flexibil, urmând să acorde fiecă rei
variabile de tip î ntreg o valoare de tip “long”.
Capitolul 3 . Implementare software
46 Se introduc condiț iile de filtrare:
• Dacă palma este orie ntată în sus (axa X ), atunci setează rotirea peste axa Z în
limitele motorului umărului braț ului robotic
• Dacă palma este orientată în jos (axa X), atunci setează rotire a peste axa Z în
limitele motorului bazei braț ului robotic
• Dacă palma este orientată înainte (axa X ), atunci setează rotirea pe axa Y cu limite
în X a motorului încheieturii braț ului robotic
• Dacă palma este orientată î napoi (axa X), atunci setează rotirea pe axa X cu limite
în Y a motorului cotului braț ului robotic.
Capitolul 4. Partea experimentală – Testarea senzorilor și a modulelor
47 CAPITOLUL 4 . PARTEA EXPERIMENTALĂ – TESTAREA SENZORIL OR ȘI A
MODULELOR
4.1. Modulul radio NRF24L01
Modulul radio NRF24L01 este un upgade al modulului tradițional NRF24 . Noua
versiune e ste cunoscută și sub numele de N RF24L01 + PA + LNA. Această versiune are un
amplificator puternic și un conector de antenă extern, unde ar trebui să fie posibile valori
de până la 1000 de metri. Unu l din module este comandat cu o placă Arduino Uno, iar
celalalt de o placa Arduino Nano.
Primul modul funcționează ca emițător și al doilea funcționează ca receptor, dar
fiecare modul poate trimite și primi, astfel încât sa fie posibila o transmisie în a mbele
direcții.
A. Componente necesare:
• Arduino UNO
• Arduino NANO
• 2x modul radio NRF24L01
B. Conectivitatea cu Arduino
Modulul utilizează interfața SPI pentru conectarea la Arduino. În plus, sunt
necesari încă doi pini (CSN și CE). Modulul nu necesită nicio sursă de alimentare
suplimentară, dar trebuie conectat la pinul de 3. 3 volți. Modulul nu se alimenteaza cu 5
volți, deoarece se poate deteriora.
NRF24L01 Arduino
NANO/UNO
Vcc 3.3V
GND GND
CSN 8
CE 9
MOSI 11
MISO 12
SICK 13
Figura 4.1 . Schema conectare
Capitolul 4. Partea experimentală – Testarea senzorilor și a modulelor
48 C. Codul de test
Expeditorul și receptorul au propriul lor software. Configurația și alocarea pinului
este aceeași pe ambele părți. Parametrul care se transmite poate fi trimis ca șir și va fi, de
asemenea, tipărit ca șir pe partea receptorului. Cu o extensie software, șirul poate fi
împărțit. Acest lucru simplifica schimbul mai multor parametri într -o singură transmisie.
Codul folosit este foarte simplificat și arată setările minime pentru un schimb de date.
Transmisie Recepț ie
#include <SPI.h>
#include <nRF24L01.h>
#include <RF24.h>
const byte rxAddr[6] = "00001";
int counter = 0;
RF24 radio(9, 8 );
void setup() {
while (!Serial);
Serial.begin(9600);
radio.begin();
radio.setPALevel(RF24_PA_MAX);
radio.setDataRate( RF24_250KBPS
);
radio.setRetries(15, 15);
radio.openWritingPipe(rxAddr);
radio.stopListening();
}
void loop() {
counter++;
String str = "Send Counter: ";
str += String(counter);
int str_len = str.length() + 1;
char char_array[str_len];
str.toCharArray(char_array,
str_len);
radio.write(&char_array,
sizeof(char_array));
Serial.print("Actual
Transmission: ");
Serial.println( char_array );
delay(250);
}
#include <SPI.h>
#include <nRF24L01.h>
#include <RF24.h>
RF24 radio(8, 9); const byte rxAddr[6]
= "00001String received_data;
void setup()
{
Serial.begin(9600);
Serial.println("NRF24 Receiver");
radio.begin();
radio.setPALevel (RF24_PA_LOW); //
Transmit Power (MAX,HIGH,LOW,MIN)
radio.setDataRate( RF24_250KBPS );
radio.openReadingPipe(0, rxAddr);
radio.startListening();
}
void loop()
{
if (radio.available())
{
char text[100] = {0}; //Buffer
radio.read(&text, sizeof(text));
received_data = String(text);
Serial.println(received_data);
delay(20);
}
}
Capitolul 4. Partea experimentală – Testarea senzorilor și a modulelor
49
4.2. Modul ul accelerometru și giroscop cu 3 a xe MPU6050
Senzorii precum MPU 6050 sunt folosiți în roboți cu autoechilibrare, smartphone –
uri și multe altele. Senzorii ne ajută să obținem poziția unui obiect atașat la senzor în
spațiul tridimensional. Aceste valori sunt de obicei în unghi pentru a ne aju ta să -i
determinăm poziția. Acestea sunt utilizate pentru a detecta orientarea smartphone -urilor
sau în dispozitivele purtabile precum Fitbit, care utilizează senzori pentru a urmări
mișcarea.
Un accelerometru funcționează pe principiul efectului piezoele ctric. Imaginați -vă
o cutie cuboidală cu o bilă mică în interiorul ei. Pereții acestei cutii sunt realizate cu
cristale piezoelectrice. Ori de câte ori înclinați cutia, mingea este forțată să se deplaseze
în direcția înclinării datorită gravitației. Perete le cu care se ciocnește mingea creează
curenți minori piezoelectrici. Există trei perechi de pereți opuși într -un cuboid. Fiecare
pereche corespunde unei axe din spațiul 3D: axele X, Y și Z. În funcție de curentul produs
de pereții piezoelectrici, putem de termina direcția de înclinare și amploarea acesteia.
În acest proiect vom testa și citi datele de pe opțiunea serial monitor a aplicaț ie
Arduino IDE.
A. Componente necesare
• Arduino Uno
• Modul accelerometru ș i giroscop cu 3 axe MPU6050
B. Conectivitatea cu Arduino
MPU 6050 comunică cu Arduino prin protocolul I2C. MPU 6050 este conectat la
Arduino așa cum se vede în tabelul de mai jos . Dacă modulul MPU 6050 are un pin de 5V,
îl putem conecta la pinul Arduino de 5V. Dacă nu, va trebui să -l conectați la pinul 3.3V. În
continuare, GND -ul Arduino -ului este conectat la GND -ul modulului MPU 6050. [27]
Arduino UNO MPU 6050
3.3V Vcc
GND GND
A5 SDA
A4 SCL
Figura 8.2. Ansamblul final
Figura 4.3. Afi șare pe Serial Monitor a
mesajului transmis
Capitolul 4. Partea experimentală – Testarea senzorilor și a modulelor
50 C. Codul de test
Accelerometrul măsoară accelerația pe o direcție, în timp ce giroscopul măsoară
accelerația unghiulară pe o axă. Pinii analogici nu sunt setați pe INPUT, deoarece este
setarea lor implicită. Valorile citite de pinii analogici vor fi trimise către portul serial.
Deschidem Serial Monitor, mut ăm senzorul și încercam să vedem cum se schimbă
valorile. Accelerometrele pot fi utilizate pentru proiecte distractive, de exemplu pentru a
realiza un controler de joc.
#include <Wire.h>
const int MPU=0x68;
int16_t AcX,AcY,AcZ,Tmp,GyX,GyY,GyZ;
void setup(){
Wire.begin();
Wire.beginTransmission (MPU);
Wire.write(0x6B);
Wire.write(0);
Wire.endTransmission (true);
Serial.begin(9600);
}
void loop(){
Wire.beginTransmission (MPU);
Wire.write(0x3B);
Wire.endTransmission (false);
Wire.requestFrom (MPU,12,true);
AcX=Wire.read()<<8|Wire.read();
AcY=Wire.read()<<8|Wire.read();
AcZ=Wire.read()<<8|Wire.read();
GyX=Wire.read()<<8|Wire.read();
GyY=Wire.read()<<8|Wire.read();
GyZ=Wire.read()<<8|Wire.read();
Serial.print("Accelerometer: " );
Serial.print("X = "); Serial.print(AcX);
Serial.print(" | Y = " ); Serial.print(AcY);
Serial.print(" | Z = " ); Serial.println(AcZ);
Serial.print("Gyroscope: " );
Serial.print("X = "); Serial.print(GyX);
Serial.print(" | Y = "); Serial.print(GyY);
Serial.print(" | Z = " ); Serial.println(GyZ);
Serial.println(" ");
delay(333);
}
Figura 4.4. Schema Fritzing a circuitului de test al modulului accelerometru și giroscop MPU6050
Capitolul 4. Partea experimentală – Testarea senzorilor și a modulelor
51
4.3. Senzorul flexibil Spectra Symbol 2.2”
Un senzor flexibil folosește carbonul de pe o bandă de plastic pentru a acționa ca
un rezistor variabil. Rezistența se schimbă prin flexarea componentei. Cu cat senzorul
este indoit mai mult cu atat rezistenta este mai mare.
În acest proiect vom controla o matrice de Led -uri folosind un sensor fl exibil
Spectra Symbol de 2.2”. [28]
A. Componente necesare
• Arduino UNO
• 10 x Led -uri rosii
• 9 x Rezistente 330Ω pentru Led -uri
• 1 x Rezistenta10KΩ pentru senzorul flexibil
• 1 x sensor flexibil Spectra Symbol 2.2”
• Bread board ș i cabluri
B. Conectivitatea cu Arduino
Arduino:
• Pinii digita li de la D4 la D12 sunt cunectaț i la pinii (+) ai Led -urilor
• A0 conectat la pi nul ( -) al senzorului flexibil și înseriat cu o rezistență de 10KΩ ce
este legată la GND
• 5V conectat la pinul (+) al senzorului flexibil
• D13 și GND legaț i la pinul (+), respective ( -) al pinului de control
Figura 4 .5. Modelul realizat fizic Figura 4 .6. Rezultate serial monitor
Figura 4 .7. Îndoirea senzorului flexibil
Capitolul 4. Partea experimentală – Testarea senzorilor și a modulelor
52 Led-urile:
• Pinii (+) conectati la pinii digitali ai Arduino -ului(D4 -D12)
• Pinii ( -) conectați la masa prin rezistenț ele de 330 Ω
C. Codul de test
Cod testare
int flexPin = 0;
void setup() {
for (int i=4; i<14; i++){
pinMode(i, OUTPUT);
}
}
void loop(){
for (int i=4; i<14; i++){
digitalWrite(i, LOW);
}
int flexReading = map(analogRead(flexPin), 130, 275, 4, 13);
int LEDnum = constrain(flexReading, 4, 13);
Figura 4 .8. Proiectarea î n Fritzing a circuitului
Capitolul 4. Partea experimentală – Testarea senzorilor și a modulelor
53
blink(LEDnum, 10,1);
}
void blink(int LEDPin, int onTime, int offTime){
digitalWrite(LEDPin, HIGH);
delay(onTime);
digitalWrite(LEDPin, LOW);
delay(offTime);
}
Figura 4 .9. Modelul realizat fizic
Concluzii
54 CONCLUZII
În lucrarea de față am realizat un sistem de control wireless al unui braț robotic.
Controlul wireless a fost implementat cu ajutorul a două module radio NRF24L01.
Platformele de dezvoltare au fost:
• Arduino UNO pentru modulul radio receptor
• Arduino NANO pentru modulul radio transmițător
Comenzile au fost date cu ajutorul unui senzor flexibil Spectral Symbol 2.2” pentru
mișcarea brațului din încheietură, a unui modul accelerometru și giroscop MPU6050
pentru deplasarea brațului la stânga, la dreapta, în sus și în jos și a unor butoane pentr u
comandarea cleștelui și a led -ului inclus.
Reprezentarea acestui proiect la o scală mai mare poate fi benefică oricărui profil
de activitate, în special al celor ce necesită dexteritatea în control a unui om. Adăugând
un alt mod de comunicare între cele două sisteme principale, a unor senzori calitativi mai
buni, a unor motoare cu acțiuni mai fine, lista profilelor de activitate s -ar mării,
incluzându -l și în activități medicale sau chimice de mare risc.
55 BIBLIOGRAFIE
[1] – https://www.techcafe.ro/noutati/top -5-abilitati -care -nu-pot-fi-inlocuite -de-
inteligenta -artificiala/
[2] – https://www.descopera.ro/stiinta/18178346 -primul -brat -robotic -poate -fi-
controlat -fara -ajutor -implant -cerebral
[3] – http://www.creeaza.com/tehnologie/comunicatii/PREZENTARE -GENERALA -A-
COMUNICA988.php
[4] – http://www.afahc.ro/ro/facultate/cursuri/ccg/ER/C01_Intro.pdf
[5] – http://www.cissb.ro/Revista_informaticii_2016_1/21.pdf
[6] – http://www.rasfoiesc.com/inginerie/comunicatii/Tehnologia -radio -si-
PRINCIPIIL67.php
[7] – https://ro.wikipedia.org/wiki/Radio
[8] – https://www.indiamart.com/proddetail/robotic -arm -edge -13168361333.html
[9] – https://ro.wikipedia.org/wiki/Arduino
[10] – https://vdocuments.mx/download/arduino -uno-specificatii -tehnice
[11] – http://roboromania.ro/2016/11/15/descrierea -pinilor -la-placa -arduino -uno-r3/
[12] – https://www.optimusdigital.ro/ro/compatibile -cu-arduino -nano/1686 -placa -de-
dezvoltare -compatibila -cu-arduino -nano -atmega328p -i-ch340.html
[13] – http://www.3dtronic.ro/?product=modul -transceiver -nrf24l01 -antena -pcb
[14] – http://hobbyelectro.blogspot. com/2013/12/cate -ceva -despre -transciever -ul-
nrf24l01.html
[15] – http://hobbyelectro.blogspot.com/2013/12/cate -ceva -despre -transciever -ul-
nrf24l01.html
[16] – https://www.spectrasymbol.com/product/flex -sensors/
[17] – https://filafill.com/en/home/ 141 -ic-shift -register -sn74hc595n -74hc595.html
[18] – https://www.onsemi.com/pub/Collateral/MC74HC595 -D.PDF
[19] – https://www.onsemi.com/pub/Collateral/MC74HC595 -D.PDF
[20] – http://electronicasiprogramare.blogspot.com/2009/12/descriere -l293d -pentru –
conectarea -2.html
[21] – http://users.utcluj.ro/~rdanescu/pmp -lab09.pdf
[22] – http://www.robofun.ro/forum
[23] – https://www.optimusdigital.ro/ro/senzori -senzori -inertiali/96 -modul -senzor –
triaxial -mpu -6050.html
[24] – https://create.arduino.cc/projecthub/Nicholas_N/how -to-use-the-accelerometer –
gyroscope -gy-521 -6dfc19
[25] – https://biblioteca.utcluj.ro/files/carti -online -cu-coperta/341 -7.pdf Cap3
[26] – https://biblioteca.utcluj.ro/files/carti -online -cu-coperta /341 -7.pdf Cap3
[27] – https://maker.pro/arduino/tutorial/how -to-interface -arduino -and-the-mpu –
6050 -sensor
[28] – https://arduinobasics.blogspot.com/2011/05/arduino -uno-flex-sensor -and-
leds.html?m=1&fbclid=IwAR0DdKzaPYp__YRhGv1xz5ZIRkNyTpfU Uk46W64qqbCjuu6d
hylrJxTWHLs
56 ANEXA 1
Codul părții de control
#include <DirectIO.h>
#define EI_ARDUINO_INTERRUPTED_PIN
#include <EnableInterrupt.h>
//#include <PinChangeInt.h>
#include <SPI.h>
#include "nRF24L01.h"
#include "RF24.h"
#define _TASK_SLEEP_ON_IDLE_RUN
#include <TaskScheduler.h>
//#define _DEBUG_
//#define _TEST_
#define CE_PIN 8
#define CSN_PIN 7
#define PWM_M1_MIN 140
#define PWM_M1_MAX 140
#define PWM_M2_MIN 100
#define PWM_M2_MAX 200
#define PWM_M3_MIN 100
#define PWM_M3_MAX 200
#define PWM_M4_MIN 100
#define PWM_M4_MAX 200
#define PWM_M5_MIN 100
#define PWM_M5_MAX 200
#define GO_PIN A3
#define STOP_PIN A2
Output<A0> pLed;
Output<8> pSS1;
Input< A2> pStopButton;
Input<A3> pGoButton;
Output<A4> pBaseRight;
Output<A5> pCommsLed;
AnalogOutput<3> pBasePwm=0;
Output<4> pBaseLeft;
AnalogOutput<5> pArmPwm=0;
AnalogOutput<6> pElbowPwm=0;
AnalogOutput<9> pWristPwm=0;
57 AnalogOutput<10> pClawPwm=0;
#define M_OFF 0b00
#define M_ON 0b11
#define M_RIGHT 0b01
#define M_LEFT 0b10
#define M_PWM_MIN 0
#define M_PWM_MAX 31
#define RADIO_DEFAULT_CHANNEL 56
struct packed_bits {
byte m1 : 2; // gripper
byte m2 : 2; // wrist
byte m3 : 2; // elbow
byte m4 : 2; // shoulder
byte m5 : 2; // base rotate
byte led : 2; // gripper LED
byte pwm2 : 5; // wrist
byte pwm3 : 5; // elbow
byte pwm4 : 5; // shoulder
byte pwm5 : 5; // base
} ctrlWord, cwRx, cwPrev, cwActive;
struct {
int m1;
int m2;
int m3;
int m4;
int m5;
} pwms;
#define RADIO_PERIOD 500
#ifndef _DEBUG_
#define RADIO_TIMEOUT 2000
#else
#define RADIO_TIMEOUT 10000
#endif
#define CTRL_PERIOD 1000
#define MCTRL_PERIOD 1000
#define MCTRL_REV_PER 60
//#define BUTTON_PERIOD 100
Scheduler runner;
void radioCallback();
void radioTimeoutCallback();
void armControlCallback();
void m1Sp eedControlRevStop();
void m2SpeedControlRevStop();
void m3SpeedControlRevStop();
void m4SpeedControlRevStop();
58 void m5SpeedControlRevStop();
void greenButtonCallback();
void redButtonCallback();
void stopMotors();
void controlMotors();
void halt();
bool cwEqual(struct packed_bits& a, struct packed_bits& b);
void csn(int mode);
Task tRadio (RADIO_PERIOD, TASK_FOREVER, &radioCallback);
Task tRadioTimeout (RADIO_TIMEOUT, TASK_FOREVER, &radioTimeoutCallback);
Task tArmControl (CTRL_PERIOD, TASK_FOREVER, &armControlCallback);
Task tM1Control (MCTRL_REV_PER, TASK_ONCE, &m1SpeedControlRevStop);
Task tM2Control (MCTRL_REV_PER, TASK_ONCE, &m2SpeedControlRevStop);
Task tM3Control (MCTRL_REV_PER, TASK_ONCE, &m3SpeedControlRevStop);
Task tM4Control (MCTRL_REV_PER , TASK_ONCE, &m4SpeedControlRevStop);
Task tM5Control (MCTRL_REV_PER, TASK_ONCE, &m5SpeedControlRevStop);
Task tGreenButton (TASK_IMMEDIATE, TASK_ONCE, &greenButtonCallback);
Task tRedButton (TASK_IMMEDIATE, TASK_ONCE, &redButtonCallback);
#ifdef _DEBUG_
void displayCallback();
Task tDisplay (1000, TASK_FOREVER, &displayCallback);
#endif
const uint64_t pipe = 0xE8E8F0F0E1LL;
volatile bool dsr;
RF24 radio(CE_PIN, CSN_PIN);
void radioCallback() {
#ifdef _DEBUG_
// Serial.print("radioCallback: dsr=");
// Serial.print(dsr);
// Serial.print(", radio.avail?=");
// Serial.print(radio.available());
// Serial.println();
#endif
pCommsLed = LOW;
if (dsr) {
noInterrupts();
ctrlWord = cwRx;
dsr = false;
interrupts();
tArm Control.enable();
}
}
void radioTimeoutCallback() {
#ifdef _DEBUG_
Serial.println("Radio timeout!");
#endif
stopMotors();
halt();
59 }
void armControlCallback() {
bool changed = false;
#ifdef _DEBUG_
// Serial.print("armControlCallback");
// Serial.println();
#endif
if ( !cwEqual(cwPrev, ctrlWord) ) {
if (cwPrev.led != ctrlWord.led) {
cwActive.led = ctrlWord.led;
changed = true;
}
if (cwPrev.m1 != ctrlWord.m1) {
if (ctrlWord.m1 == M_OFF) {
cwActive.m1 = ~cwPrev.m1; // reverse direction and stop
pwms.m1 = PWM_M1_MAX;
tM1Control.restartDelayed();
}
else {
cwActive.m1 = ctrlWord.m1;
pwms.m1 = PWM_M1_MIN;
}
changed = true;
}
if (cwPrev.m2 != ctrlWord.m2) {
if (ctrlWord.m2 == M_OFF) {
cwActive.m2 = ~cwPrev.m2; // reverse direction and stop
pwms.m2 = PWM_M2_MAX;
tM2Control.restartDelayed();
}
else {
cwActive.m2 = ctrlWord.m2; // reverse direction
pwms.m2 = map(ctrlWord.pwm2, M_PWM_MIN, M_PWM_MAX, PWM_M2_MIN, PWM_M2_MAX);
}
changed = t rue;
}
if (cwPrev.pwm2 != ctrlWord.pwm2) {
pwms.m2 = map(ctrlWord.pwm2, M_PWM_MIN, M_PWM_MAX, PWM_M2_MIN, PWM_M2_MAX);
changed = true;
}
if (cwPrev.m3 != ctrlWord.m3) {
if (ctrlWord.m3 == M_OFF) {
cwActive.m3 = ~cwPrev.m3;
pwms.m3 = PWM_M3_MAX;
60 tM3Control .restartDelayed();
}
else {
cwActive.m3 = ctrlWord.m3;
pwms.m3 = map(ctrlWord.pwm3, M_PWM_MIN, M_PWM_MAX, PWM_M3_MIN, PWM_M3_MAX);
}
changed = true;
}
if (cwPrev.pwm3 != ctrlWord.pwm3) {
pwms.m3 = map(ctrlWord.pwm3, M_PWM_MIN, M_PWM_MAX, PWM_M3_MIN, PWM_M3_MAX);
changed = true;
}
if (cwPrev.m4 != ctrlWord.m4) {
if (ctrlWord.m4 == M_OFF) {
cwActive.m4 = ~cwPrev.m4;
pwms.m4 = PWM_M4_MAX;
tM4Control.restartDelayed();
}
else {
cwActive.m4 = ctrlWord.m4;
pwms.m4 = map(ctrlWord.pwm4, M_PWM_MIN, M_PWM_MAX, PWM_M4_MIN, PWM_M4_MAX);
}
changed = true;
}
if (cwPrev.pwm4 != ctrlWord.pwm4) {
pwms.m4 = map(ctrlWord.pwm4, M_PWM_MIN, M_PWM_MAX, PWM_M4_MIN, PWM_M4_MAX);
changed = true;
}
if (cwPrev.m5 != ctrlWord.m5) {
if (ctrlWord.m5 == M_OFF) {
cwActive.m 5 = ~cwPrev.m5;
pwms.m5 = PWM_M5_MAX;
tM5Control.restartDelayed();
}
else {
cwActive.m5 = ctrlWord.m5;
pwms.m5 = map(ctrlWord.pwm5, M_PWM_MIN, M_PWM_MAX, PWM_M5_MIN, PWM_M5_MAX);
}
changed = true;
}
if (cwPrev.pwm5 != ctrlWord.pwm5) {
pwms.m5 = map(ctrlWord.pwm5, M_PWM_MIN, M_PWM_MAX, PWM_M5_MIN, PWM_M5_MAX);
changed = true;
}
cwPrev = ctrlWord;
if (changed) controlMotors();
}
}
void controlMotors() {
byte *p = (byte *) &cwActive;
if (cwActive.led == M_ON) pLed = HIGH;
else pLed = LOW;
61 if (cwActi ve.m1 == M_OFF) pwms.m1 = 0;
if (cwActive.m2 == M_OFF) pwms.m2 = 0;
if (cwActive.m3 == M_OFF) pwms.m3 = 0;
if (cwActive.m4 == M_OFF) pwms.m4 = 0;
if (cwActive.m5 == M_OFF) pwms.m5 = 0;
else {
pBaseLeft = (cwActive.m5 == M_LEFT);
pBaseRight = (cwActive.m5 = = M_RIGHT);
}
pClawPwm = pwms.m1;
pWristPwm = pwms.m2;
pElbowPwm = pwms.m3;
pArmPwm = pwms.m4;
pBasePwm = pwms.m5;
csn(LOW);
SPI.transfer(*p);
csn(HIGH);
}
void csn(int mode)
if (mode == LOW) {
SPI.setBitOrder(MSBFIRST);
SPI.setDataMode(SPI_MODE0);
SPI.setClockDivider(SPI_CLOCK_DIV4);
}
pSS1 = mode;
}
void m1SpeedControlRevStop() {
cwActive.m1 = M_OFF;
pwms.m1 = 0;
controlMotors();
}
void m2SpeedControlRevStop() {
cwActive.m2 = M_OFF;
pwms.m2 = 0;
controlMotors();
}
void m3SpeedControlRevStop() {
cwActive.m3 = M_OFF;
pwms.m3 = 0;
controlMotors();
}
void m4SpeedControlRevStop() {
cwActive.m4 = M_OFF;
pwms.m4 = 0;
controlMotors();
}
void m5SpeedControlRevStop() {
cwActive.m5 = M_OFF;
pwms.m5 = 0;
62 controlMotors();
}
//#define GO_PIN A3
//#define STOP_PIN A2
void initButtons() {
// int buttonPressed=PCintPort::arduinoPin;
int buttonPressed=arduinoInterruptedPin;
if (buttonPressed == GO_PIN) tGreenButton.restart();
if (buttonPressed == STOP_PIN) tRedButton.restart();
}
void redButtonCallback() {
#ifdef _DEBUG_
Serial.println("redButtonCallback");
#endif
halt();
}
void greenButtonCallback() {
#ifdef _DEBUG_
Serial.println("greenButtonCallback");
#endif
restart();
}
#ifdef _DEBUG_
void displayCallback() {
char ln[256];
byte *p;
p = (byte *) &ctrlWord;
sprintf(ln,
"led=%02d \tm1=%02d \tm2=%02d \tm3=%02d \tm4=%02d \tm5=%02d",ctrlWord.led,ctrlWord.m1,ctrlWord.
m2,ctrlWord.m3,ctrlWord.m4,ctrlWord.m5);
Serial.println(ln);
Serial.print(*p, HEX); p++; Serial.print(":"); Serial.println(*p, HEX);
}
#endif
void initPins() {
pSS1 = HIGH;
pinMode(2, INPUT);
pinMode(3, OUTPUT);
pinMode(5, OUTPUT);
pinMode(6, OUTPUT);
pinMode(9, OUTPUT);
pinMode(10, OUTPUT);
// pinMode(A4, OUTPUT);
}
void stopMotors() {
initCtrlWord();
63 cwRx = ctrlWord;
cwPrev = ctrlWord;
cwActive = ctrlWord;
pwms.m1 = 0;
pwms.m2 = 0;
pwms.m3 = 0;
pwms.m4 = 0;
pwms.m5 = 0;
controlMotors();
}
void initCtrlWord() {
ctrlWord.led = M_OFF;
ctrlWord.m1 = M_OFF;
ctrlWord.m2 = M_OFF;
ctrlWord.m3 = M_OFF;
ctrlWord.m4 = M_OFF;
ctrlWord.m5 = M_OFF;
ctrlWord.pwm2 = 0;
ctrlWord.pwm3 = 0;
ctrlWord.pwm4 = 0;
ctrlWord.pwm5 = 0;
}
void initRadio() {
// radio.setChannel(RADIO_DEFAULT_CHANNEL); // 0 -127
radio.setDataRate( RF24_250KBPS); // RF24_1MBPS = 0, RF24_2MBPS, RF24_250KBPS
// radio.setRetries(5,5);
radio.setPayloadSize( sizeof(ctrlWord) );
// radio.setAutoAck(true);
// radio.enableAckPayload();
radio.setCRCLength(RF24_CRC_8);
// RF24_CRC_DISABLED = 0, RF24_CRC_8, RF24_CRC_16
// radio.setPALevel(RF24_PA_HIGH);
// RF24_PA_MIN= -18dBm, RF24_PA_LOW= -12dBm, RF24_PA_MED= -6dBM, and
RF24_PA_HIGH=0dBm. * RF24_PA_MIN = 0,RF24_PA_LOW, RF24_PA_HIGH, RF24_PA_MAX,
RF24_PA_ERROR
// radio.testCarrier();
delay(10);
}
bool cwEqual(struct packed_bits& a, struct packed_bits& b) {
byte *aByte = (byte *) &a;
byte *bByte = (byte *) &b;
bool eq = true;
int sz = sizeof(a);
for (int i = 0; i < sz && eq; i++) {
eq = (*aByte++ == *bByte++);
}
64
return eq;
// return ( (a.led == b.led) && (a.m1 == b.m1) && (a.m2 == b.m2) && (a.m3 == b.m3) && (a.m4 == b.m4)
&& (a.m5 == b.m5) && (a.pwm2 == b.pwm2) && (a.pwm3 == b.pwm3) && (a.pwm4 == b.pwm4) &&
(a.pwm5 == b.pwm5) );
}
void restart() {
#ifdef _DEBUG_
Serial.println("restart");
#endif
runner.disableAll();
tRadio.enable();
tRadioTimeout.enableDelayed();
tArmControl.enable();
tRedButton.enable();
radio.startListening();
// PCintPort::detachInterrupt(GO_PIN);
// PCintPort::attachInterrupt(STOP_PIN, &initButtons, RISING);
disableInterrupt(GO_PIN);
enableInterrupt(STOP_PIN, &initButtons, RISING);
#ifdef _DEBUG_
runner.addTask(tDisplay);
tDisplay.enable();
#endif
}
void halt() {
#ifdef _DEBUG_
Serial.println("halt");
#endif
stopMotors();
runner.disableAll();
tGreenButton. enable();
radio.powerDown();
pCommsLed = LOW;
// PCintPort::detachInterrupt(STOP_PIN);
// PCintPort::attachInterrupt(GO_PIN, &initButtons, RISING);
disableInterrupt(STOP_PIN);
enableInterrupt(GO_PIN, &initButtons, RISING);
}
void setup() {
initPins();
65 SPI.begin();
stopMotors();
#ifdef _DEBUG_
Serial.begin(115200);
Serial.println("Robotic Arm Motor Controller Circuit test");
#endif
#ifndef _DEBUG_
power_adc_disable();
power_twi_disable();
power_usart0_disable();
#endif
radio.begin();
initRa dio();
radio.openReadingPipe(1, pipe);
dsr = false;
// attachInterrupt(0, check_radio, FALLING);
enableInterrupt(0, &check_radio, FALLING);
runner.init();
runner.addTask(tRadio);
runner.addTask(tRadioTimeout);
runner.addTask(tArmControl);
runner.addTask(tM1Control);
runner.addTask(tM2Control);
runner.addTask(tM3Control);
runner.addTask(tM4Control);
runner.addTask(tM5Control);
runner.addTask(tGreenButton);
runner.addTask(tRedButton);
halt();
}
void loop() {
runner.execute();
}
void check_rad io(void)
{
bool tx,fail,rx;
radio.whatHappened(tx,fail,rx);
if ( rx )
{
dsr = true;
radio.read( (byte*) &cwRx, sizeof(cwRx) );
pCommsLed = HIGH;
tRadioTimeout.delay();
tRadio.enable();
}
}
Codul părții de comandă și de transmisie
#include <nRF24L01.h>
#include <RF24.h>
#include <RF24_config.h>
66
#include <DirectIO.h>
#include <I2Cdev.h>
#include <Wire.h>
#include <MPU6050.h>
#include <AvgFilter.h>
#include <DhpFilter.h>
#include <SPI.h>
#define _TASK_SLEEP_ON_IDLE_RUN
#include <TaskScheduler.h>
//#define _DEBUG_
//#define _TEST_
#define CLOSE_CLAW_BUTTON 4
#define OPEN_CLAW_BUTTON 3
#define FLEX_SENSOR A0
#define LED A1
#define CE_PIN 8
#define CSN_PIN 7
Input<CLOSE_CLAW_BUTTON> pCloseClaw;
Input<OPEN_CLAW_BUTTON> pOpenClaw;
Output<LED> pLed;
AnalogInput<FLEX_SENSOR> pFlex;
#define M_OFF 0b00
#define M_ON 0b11
#define M_RIGHT 0b01
#define M_LEFT 0b10
#define M_PWM_MIN 0
#define M_PWM_MAX 32
//#define ACCON_TH 9000
//#define ACCOFF_TH 8000
//#define FLIP_TH ( -3000)
#define RADIO_DEFAULT_CHANNEL 56
struct packed_bits {
byte m1 : 2; // gripper
byte m2 : 2; // wrist
byte m3 : 2; // elbow
byte m4 : 2; // shoulder
byte m5 : 2; // base rotate
byte led : 2; // gripper LED
byte pwm2 : 5; // wrist
67 byte pwm3 : 5; // elbow
byte pwm4 : 5; // shoulder
byte pwm5 : 5; // base
} ctrlWord, cwTx, cwPrev;
#define MEASURE_PERIOD 50 // 20 times/sec
#define TRANSMIT_PERIOD 100 // 2 times/sec or on demand
#define TRAN_LED_PERIOD 200 // 5 times/sec
#define REACTION_DELAY 100 //
#define GYRO_TH 4000
#define LEVEL_TH 4000
#define VERT_TH 13400 // ~ (16383 – LEVEL_TH)
#define FLEX_OPN_ON 470
#define FLEX_OPN_OFF 430
#define FLEX_CLS_ON 410
#define FLEX_CLS_OFF 370
#define WRIST_MIN 6000
#define WRIST_MAX 14000
#define WRIST_OFF 3000 // for AZ
#define ELBOW_MIN 6000
#define EL BOW_MAX 14000
#define SHLDR_MIN 6000
#define SHLDR_MAX 14000
#define BASE_MIN 6000
#define BASE_MAX 14000
Scheduler runner;
void measureCallback();
void flexDelayCallback();
void transmitCallback();
bool cwEqual(struct packed_bits& a, s truct packed_bits& b);
Task tMeasure(MEASURE_PERIOD, -1, &measureCallback);
Task tFlexDelay(REACTION_DELAY, 1, &flexDelayCallback);
Task tTransmit(TRANSMIT_PERIOD, -1, &transmitCallback);
#ifdef _DEBUG_
void displayCallback();
Task tDisplay(500, -1, &displayCallback);
#endif
const uint64_t pipe = 0xE8E8F0F0E1LL; // Define the transmit pipe
volatile bool rts;
volatile bool radio_status;
68 MPU6050 ag;
RF24 radio(CE_PIN, CSN_PIN);
int b1, b2, flex, ax, ay, az, gx, gy, gz;
long axFd[3] , ayFd[3], azFd[3], flexFd[3];
avgFilter axF(3, axFd), ayF(3, ayFd), azF(3, azFd), flexF(3, flexFd);
dhpFilter gxF, gyF, gzF;
void measureCallback() {
bool changed = false;
cwPrev = ctrlWord;
ag.getMotion6(&ax, &ay, &az, &gx, &gy, &gz);
ax = axF.value(ax);
ay = ayF.value(ay);
az = azF.value(az);
gx = gxF.value(gx);
gy = gyF.value(gy);
// gz = gzF.value(gz);
b1 = pCloseClaw;
b2 = pOpenClaw;
if (b1) {
ctrlWord.led = M_O N;
}
if (b2) {
ctrlWord.led = M_OFF;
}
flex = flexF.value(pFlex);
if (flex > FLEX_OPN_ON || flex < FLEX_CLS_OFF) {
ctrlWord.m1 = M_OFF;
tFlexDelay.disable();
}
else {
if ( !tFlexDelay.isEnabled() ) tFlexDelay.restartDelayed( );
}
if ( abs(ay) < LEVEL_TH && abs(ax) >= WRIST_MIN && abs(ax) <= WRIST_MAX ) {
if (abs(gy) < GYRO_TH) {
ctrlWord.m2 = ax >0 ? M_RIGHT : M_LEFT;
ctrlWord.pwm2 = map (abs(ax), WRIST_MIN, WRIST_MAX, M_PWM_MIN, M_PWM_MAX);
}
}
else {
ctrlWord.m2 = M_OFF;
ctrlWord.pwm2 = 0;
}
69 if ( abs(ax) < LEVEL_TH && abs(ay) >= ELBOW_MIN && abs(ay) <= ELBOW_MAX ) {
if (abs(gx) < GYRO_TH ) {
ctrlWord.m3 = ay >0 ? M_RIGHT : M_LEFT;
ctrlWord.pwm3 = map (abs(ay), ELBOW_MIN, ELBOW_MAX, M_PWM_MIN, M_PWM_MAX);
}
}
else {
ctrlWord.m3 = M_OFF;
ctrlWord.pwm3 = 0;
}
if ( abs(az) < LEVEL_TH && ax > 0 && abs(ay) >= S HLDR_MIN && abs(ay) <= SHLDR_MAX ) {
ctrlWord.m4 = ay >0 ? M_RIGHT : M_LEFT;
ctrlWord.pwm4 = map (abs(ay), SHLDR_MIN, SHLDR_MAX, M_PWM_MIN, M_PWM_MAX);
}
else {
ctrlWord.m4 = M_OFF;
ctrlWord.pwm4 = 0;
}
if ( abs(az) < LEVEL_TH && ax < 0 && abs(ay) >= BASE_MIN && abs(ay) <= BASE_MAX ) {
ctrlWord.m5 = ay <0 ? M_LEFT : M_RIGHT;
ctrlWord.pwm5 = map (abs(ay), BASE_MIN, BASE_MAX, M_PWM_MIN, M_PWM_MAX);
}
else {
ctrlWord.m5 = M_OFF;
ctrlW ord.pwm5 = 0;
}
if ( !cwEqual(cwPrev, ctrlWord) ) tTransmit.enable();
}
void flexDelayCallback() {
flex = flexF.value(pFlex);
if (flex <= FLEX_OPN_ON && flex >= FLEX_OPN_OFF) {
ctrlWord.m1 = M_RIGHT;
tTransmit.enable();
}
if (flex <= FLEX_CLS_ON && flex >= FLEX_CLS_OFF) {
ctrlWord.m1 = M_LEFT;
tTransmit.enable();
}
tFlexDelay.disable();
}
void transmitCallback() {
if (!rts) return;
// noInterrupts();
cwTx = ctrlWord;
rts = false;
// interrupts();
70 if (radio_status) pLed = HIGH;
radio.startWrite( &cwTx, sizeof(cwTx) );
}
#ifdef _DEBUG_
void displayCallback() {
char ln[256];
byte *p;
p = (byte *) &ctrlWord;
sprintf(ln, "led=%02d \tm1=%02d \tm2=%02d \tm3=%02d \tm4=%02d \tm5=%02d \tflex=%04d" ,
ctrlWord.led, ctrlWord.m1, ctrlWord.m2, ctrlWord.m3, ctrlWord.m4, ctrlWord.m5, flex);
Serial.println(ln);
sprintf(ln, "pwm2=%02d \tpwm3=%02d \tpwm4=%02d \tpwm5=%02d", ctrlWord.pwm2, ctrlWord.pwm3,
ctrlWord.pwm4, ctrlWord.pwm5);
Serial.println(ln);
Serial.print(*p, HEX); p++; Serial.print(":"); Serial.println(*p, HEX);
}
#endif
void initCtrlWord() {
ctrlWord.led = M_OFF;
ctrlWord.m1 = M_OFF;
ctrlWord.m2 = M_OFF;
ctrlWord.m3 = M_OFF;
ctrlWord.m4 = M_OFF;
ctrlWord.m5 = M_OFF;
}
void initPins() {
// pinMode(CLOSE_CLAW_BUTTON, INPUT);
// pinMode(OPEN_CLAW_BUTTON, INPUT);
// pinMode(FLEX_SENSOR, INPUT);
// pinMode(LED, OUTPUT);
pinMode(10, OUTPUT); // SPI needs it?
}
void initRadio() {
// radio.setChannel(RADIO_DEFAULT_CHANNEL); // 0 -127
radio.setDataRate(RF24_250KBPS); // RF24_1MBPS = 0, RF24_2MBPS, RF24_250KBPS
// radio.setRetries(5,5);
radio.setPayloadSize( sizeof(ctrlWord) );
// radio.setAutoAck(true);
// radio.enableAckP ayload();
radio.setCRCLength(RF24_CRC_8); // RF24_CRC_DISABLED = 0, RF24_CRC_8, RF24_CRC_16
// radio.setPALevel(RF24_PA_HIGH); // RF24_PA_MIN= -18dBm, RF24_PA_LOW= -12dBm,
RF24_PA_MED= -6dBM, and RF24_PA_HIGH=0dBm. * RF24_PA_MIN = 0,RF24_PA_LOW,
RF24_PA_HIGH, RF24_PA_MAX, RF24_PA_ERROR
delay(10);
// radio.testCarrier();
}
71
void setup() {
initPins();
initCtrlWord();
Wire.begin();
#ifdef _DEBUG_
Serial.begin(115200);
Serial.println("Robotic Arm Glove Controller Circuit test");
#endif
#ifndef _DEBUG_
power_usart0_disable();
#endif
radio.begin();
initRadio();
ag.initi alize();
if (!ag.testConnection()) {
#ifdef _DEBUG_
Serial.println("Accelerometer is not responding");
#endif
while (1) {};
}
attachInterrupt(0, check_radio, FALLING);
rts = true;
runner.init();
runner.addTask(tMeasure);
// runner.addTask(tLedDelay);
// runner.addTask(tB1Delay);
// runner.addTask(tB2Delay);
runner.addTask(tFlexDelay);
runner.addTask(tTransmit);
#ifdef _DEBUG_
runner.addTask(tDisplay);
tDisplay.enable();
#endif
tMeasure.enable();
tTransmit.enable();
for (int i = 1; i < 6; i++) {
pLed = i & 1 ? HIGH : LOW;
delay(400);
}
radio.powerUp();
72
for (int i = 0; i < 12; i++) {
pLed = i & 1 ? HIGH : LOW;
delay(200);
}
radio.openWritingPipe(pipe);
}
void loop() {
runner.execute();
}
void check_radio(void)
{
bool tx, fail, rx;
radio.whatHappened(tx, fail, rx);
pLed = LOW;
radio_status = false;
if ( tx )
{
radio_status = true;
}
rts = true;
}
bool cwEqual(struct packed_bits& a, struct packed_bits& b) {
byte *aByte = (byte *) &a;
byte *bByte = (byte *) &b;
bool eq = true;
int sz = sizeof(a);
for (int i = 0; i < sz && eq; i++) {
eq = (*aByte++ == *bByte++);
}
return eq;
// return ( (a.led == b.led) && (a.m1 == b.m1) && (a.m2 == b.m2) && (a.m3 == b.m3) && (a.m4 ==
b.m4) && (a.m5 == b.m5) && (a.pwm2 == b.pwm2) && (a.pwm3 == b.pwm3) && (a.pwm4 == b.pwm4)
&& (a.pwm5 == b.pwm5) );
}
Copyright Notice
© Licențiada.org respectă drepturile de proprietate intelectuală și așteaptă ca toți utilizatorii să facă același lucru. Dacă consideri că un conținut de pe site încalcă drepturile tale de autor, te rugăm să trimiți o notificare DMCA.
Acest articol: Str. Științei Nr. 2, cod poștal 800146, Galați, România, tel/fax: +0236 4 70 905, e-mail: aciee@ugal.ro, web: www.aciee.ugal.ro Anexa 8 la… [630227] (ID: 630227)
Dacă considerați că acest conținut vă încalcă drepturile de autor, vă rugăm să depuneți o cerere pe pagina noastră Copyright Takedown.
