Monitorizarea și modificarea parametrilor de comandă ai unui robot folosind un dispozitiv bluetooth [302876]

[anonimizat], Electronică și Telecomunicații

Programul de studii de licență Electronică Aplicată

Conducător științific Absolvent: [anonimizat]. [anonimizat]

2016

LISTA ACRONIMELOR

A – [anonimizat]/ CA – [anonimizat] – Analog-to-digital converter/[anonimizat] – Arithmetic Logic Unit/ [anonimizat]/[anonimizat] – Central processing unit/ [anonimizat]-to-digital converter/[anonimizat] – Direct current/ CC – [anonimizat] – [anonimizat]/ [anonimizat]-Only Memory/ [anonimizat] – Ground / [anonimizat]-purpose input/[anonimizat] (chip)/[anonimizat] – [anonimizat] – Liquid-[anonimizat]-[anonimizat]/ [anonimizat]/[anonimizat]/ [anonimizat] – Non-[anonimizat]/ [anonimizat] – Pulse-Width Modulation/ [anonimizat]/ [anonimizat]/[anonimizat]-Only Memory/ [anonimizat]/ [anonimizat]/ [anonimizat]/ [anonimizat]/[anonimizat] – Universal Asynchronous Receiver/[anonimizat]/Magistrală Serială Universală

LISTA FIGURILOR

Fig. 2.1 Ecran LCD versiune LCM1602 IIC V1

Fig. 2.2 [anonimizat]. 2.3 Diagrama de timp I2C

Fig. 2.4 Modul Bluetooth HC-05

Fig. 2.5 Conectare pini modul Bluetooth

Fig. 2.6 Arduino UNO

Fig. 2.7 Tipuri de plăci Arduino

Fig. 2.8 Arduino Nano

Fig. 2.9 Arduino Nano descriere pini

Fig. 2.10 Motoare de CC cu excitație serie

Fig. 2.11 Motoare de CC cu excitație derivație

Fig. 2.12 Motoare de CC cu excitație separată

Fig. 2.13 Motoare de CC cu excitație mixtă

Fig. 2.14 Structura motorului de CC

Fig. 2.15 Pornirea motoarelor de CC

Fig. 2.16 Variația curenților la pornire

Fig. 2.17 Model de driver de motoare TB6612FNG

Fig. 2.18 Driver de motor TB6612FNG Dual 1A pini

Fig. 2.19 Driver de motor TB6612FNG Dual 1A

Fig 3.1 Microcontroler schemă

Fig. 3.2 Microcontroler Atmega32 și Atmega8

Fig. 3.3 Unitatea de memorie a microcontrolerului

Fig. 3.4 Conectarea memoriei și a unității centrale folosind bus-urile pentru a câștiga funcționalitate

Fig. 3.5 Unitate simplificată de procesare centrală cu trei regiștri

Fig. 3.6 Unitate de intrare-ieșire ce permite comunicarea cu exteriorul

Fig. 3.7 Comunicația serială

Fig. 3.8 Comunicația serială cu microcontroller

Fig. 3.9 Unitate timer

Fig. 3.10 Temporizator de intrare și ieșire

Fig. 3.11 Timer-ul Watchdog

Fig. 3.12 Bloc pentru convertirea unui semnal analogic într-o mărime digitală

Fig. 3.13 Schema bloc a microcontrolerului cu elementele lui de bază și conexiunile sale interne

Fig. 3.14 Microcontroler Atmega328

Fig. 4.1 Conectarea Arduino

Fig. 4.2 Amplasare Program KiCad EDA

Fig. 4.3 Circuitul realizat cu programul KiCad

Fig. 4.4 Grafice de performanță senzori infraroșu

Fig. 4.5 Modul de senzori infraroșu QTR-8A

Fig. 4.6 Schema electrică a modulului de senzori infraroșu

Fig. 4.7 Schemă bloc robot

LISTA TABELELOR

Tabel 2.1 Caracteristicile diferitelor plăci Arduino

Tabel 2.2 Tabel pini Arduino Nano

Introducere

Am ales acest proiect, Monitorizarea și modificarea parametrilor de comandă ai unui robot folosind un dispozitiv bluetooth pentru proiectul de diplomă deoarece înglobează elemente învățate în perioada de specializare la Electronică Aplicată. În același timp se află in strânsă legătura și cu următoarele materii studiate în cadrul facultății, cum ar fi, electronică și informatică, robotică, programare, microcontrolere, automatizări, semnale și sisteme.

În acest proiect am încercat să subliniez atât aspecte teoretice cât și practice ale unui robot autonom care poate avea mai multe roluri în viața de zi cu zi. În lumea reală, acest robot își găsește multe întrebuințări, cum ar fi în domeniul armatei sau domeniul mineritului, se poate folosi acest robot pentru accesarea unori locuri în care omul nu poate ajunge sau pentru parcurgerea unui drum. Spre exemplu, se poate monta și o cameră de luat vederi sau de supraveghere și cu ajutorul robotului se poate ajunge într-un timp relativ scurt și în deplină siguranță la persoanele aflate în locuri inaccesibile omului (clădiri afectate de explozii sau cutremure, surpări de teren), iar cu ajutorul unei camere montate pe robot se poate evalua corect situația și în siguranță pentru a se concepe un plan de salvare, evacuare a persoanelor aflate în primejdie. Alte situații în care au fost folosiți acești roboți mai este în domeniul medicinii, în spitale, atunci când se doreste transportarea de materiale medicale, medicamente, se pot folosi anumite trasee realizate din benzi pe care robotul să le urmărească automat și să transporte materialele medicale. Scopul principal în folosirea acestor roboți este de a avea un mediu de lucru cât mai sigur pentru oameni, iar creșterea productivității ar fi un plus.

În realizarea proiectului am folosit două motoare de la firma Pololu cu viteza de rotație în jurul a 1000 rotații pe minut, cuplul motor de 0.058 Nm alimentate de la un acumulator Litiu Polimer cu două celule înseriate totalizând o tensiune de alimentare de 7.4V. Acești parametri vor putea fi urmăriți prin intermediul unui ecran LCD conectat la robot și se vor afișa puterea consumată, modul de comandă on/off. Se va folosi o bandă cu 6 senzori infraroșu/de reflectivitate care vor ajuta robotul să urmarească traseul prestabilit, alcătuit din bandă izolieră.

Construirea roboților și dezvoltarea acestui domeniu al roboticii a devenit o preocupare majoră a cercetării actuale, este un subiect de actualitate și cu siguranță aproape toate universitățile vor deschide laboratoare desemnate cercetării în domeniu.

1. Elemente de bază robotică

Robotica este știința care se ocupă cu tehnologia, proiectarea și fabricarea roboților.

Robotica este știinta care se ocupă cu construirea de roboți. In zilele de astăzi există două tipuri de roboți din punct de vedere al treburilor pe care roboții trebuie să le execute, și anume: roboți autonomi și roboți teleghidați.

Roboții autonomi sunt roboții care odată porniți își execută sarcina pentru care au fost proiectați în funcție de un algoritm prestabilit de utilizator, în timpul funcționării neintervenind factorul uman.

Roboții teleghidați sunt roboții care pentru a își îndeplini sarcina au nevoie de un operator care să îi controleze pe tot parcursul execuției task-ului respective.

Pentru a construi un robot ai nevoie de cunoștiințe din 3 domenii diferite și anume: inginerie mecanică, inginerie electrică, cât și ingineria calculatoarelor.

Pentru a construi un robot trebuie să se urmeze 8 pași:

Aplicabilitatea robotului, ce sarcini ar trebui robotul respectiv să facă.

Gândirea design-ului robotului și a tipurilor de senzori necesari pentru a își îndeplini sarcina cu succes.

Proiectarea mecanică a robotului, ce fel de motoare o să folosească, cum să arate carcasa, unde să se pună toți senzorii necesari.

Construirea unei plăci de bază pentru a putea capta date de la senzori și a putea controla motoarele.

Asamblarea robotului.

Programarea robotului în funcție de sarcinile pe care le-am stabilit în primul pas că trebuie să le facă.

Testarea robotului.

Îmbunătățirea algoritmului sau a design-ului (întoarcerea la pasul 2).

Spre exemplu, pentru a construi un robot care să urmăreasca o linie neagră pe fundal alb (un robot de linefollower), avem nevoie de minim doi senzori care să detecteze linia și de două motoare pentru a mișca robotul. Pentru a face legătura între senzori și motoare avem nevoie de o placă de bază cu un processor pe ea astfel încat să putem comanda motoarele în funcție de comanda primită de la senzori.

Pentru a controla viteza și direcția motoarelor o să avem nevoie de un motor-driver pentru fiecare motor. În același timp, pentru a se mișca cum trebuie, robotul ar trebui să aibă plasați senzorii de linie în fața motoarelor, motoarele plasate în spate, iar placa de bază să fie așezată între senzori și motoare.

După ce s-a asamblat robotul și toate componentele sunt funcționale pe el, următorul pas este gândirea unui algoritm de urmărire a liniei. Spre exemplu, dacă robotul o să vadă linia cu senzorul din dreapta, acesta să vireze spre dreapta, iar daca vede cu senzorul din stânga, să vireze spre stânga.

După ce s-au implementat aceste lucruri, algoritmul va trebui testat pentru a merge pe orice tip de traseu ( cu obstacole, curbe strânse etc.), iar apoi trebuie să încercăm să il facem să meargă din ce în ce mai repede marindu-i viteza.

Pentru a calcula viteza maximă pe care o poate prinde robotul ne vom folosi de formula:

unde :

π (pi) = 3.14

r = raza roții

turație = turația motorului măsurată în rotații pe minut (rpm).

Acest robot îmbină elemente teoretice despre driverele de motoare, senzori de linie, microcontrolere, elemente electronice generale și elemente de programare.

Design-ul este compus dintr-o bază de plexiglas, baterie, motoare servo, roti, senzori de linie, modul bluetooth, ecran LCD pe care putem vizualiza de exemplu puterea consumată, modul de comandă etc.) și un microcontroler Arduino ATMega328P. Microcontrolerul primește semnalul de intrare de la modulul bluetooth în format șir prin comunicare serială atunci când ne aflăm pe modul de comandă manual. Aceste date sunt apoi trimise prin algoritmul nostru și calea găsită și direcția sunt calculate și controlate prin intermediul dispozitivului mobil.

Arduino Uno este o placă microcontroler, care se bazează pe Atmega328. Ea are 14 pini digitali de intrare / ieșire (dintre care 6 pot fi utilizați ca ieșiri PWM), 6 intrări analogice, un oscilator cristal de 16 MHz, o conexiune USB, o mufă de alimentare, și un buton de resetare.

Acesta conține tot ce este necesar pentru a sprijini un microcontroler; pur și simplu se conectează la un computer cu un cablu USB sau de alimentare cu un adaptor sau baterii AC-DC pentru a începe.

Specificațiile tehnice:

Atmega328 pe Arduino / GENUINO Uno vine preprogramat cu un bootloader care permite utlizatorului să încarce un cod nou. Acesta comunică folosind protocolul inițial STK500.

Placa Arduino / GENUINO Uno poate fi alimentată prin intermediul conexiunii USB sau cu o sursă de alimentare externă. Sursa de energie este selectată automat.

Atmega328 are 32 KB (cu 0,5 KB ocupate de bootloader). De asemenea, are 2 KB de SRAM

și 1 KB de EEPROM (care poate fi citit și scris cu biblioteca EEPROM).

2. Considerente teoretice

2.1 Display LCD

2.1.1 Afișajul LCD

Afișajul cu cristale lichide este un dispozitiv care este capabil să indice cifre, litere, imagini sau grafice constituit dintr-o matrice de celule lichide ce își schimbă culoarea sub acțiunea unui câmp electric sau a unui curent.

Cristalele lichide influențează direcția de propagare a luminii când sunt supuse unei tensiuni electrice. Acestea nu produc lumină, iar consumul de energie are o valoare relativ scăzută. Ecranul sau display-ul este comandat electronic cu ajutorul unui decodificator de caractere alfanumerice sau numerice, utilizat în mare parte la ceasurile care au un afișor LCD, adică un afișor digital, și nu au ace indicatoare. Se mai folosesc în semnalizări electronice sau se găsesc în componența electrocasnicelor.

În urma unor combinații chimice organice aflate în stare lichidă, rezultă cristalele lichide. Acestea sunt substanțe ce au proprietatea unui solid aflat în stare de agregare cristalină și a unui lichid convențional. Moleculele cristalelor lichide sunt compacte și prezintă diferite caracteristici cum sunt birefringența și refracția dublă. Dacă se utilizează o sursă de lumină polarizată, atunci se poate vedea clar, cu ajutorul microscopului, regiunile în care moleculele substanței au o textură diferită, adică sunt orientate pe direcții diferite.

Cristalele lichide pot fi liotropice, unde concentrația apei și influența temperaturii modifică structura moleculelor sau pot fi termotropice, unde există o fază de tranziție dată de fluctuațiile de temperatură. [4] [5]

Fig. 2.1 Ecran LCD versiune LCM1602 IIC V1 [6]

2.1.2 Protocolul I2C ( IIC )

I2C ( Inter-Integrated Circuit ) este o interfață serială a calculatorului multi-master, multi-slave inventată de către firma Philips Semiconductor ( acum redenumită NXP Semiconductors ). Acest protocol este deobicei utilizat pentru atașarea la viteză redusă a circuitelor integrate periferice la procesoare și microcontrolere pe distanțe scurte, pentru comunicare intra-board. Această interfață a fost concepută in anul 1982, însă, începând cu 10 octombrie 2006, firma NXP Semiconductors nu au mai cerut taxe de licență pentru a folosi protocolul I2C, în schimb taxele sunt necesare în continuare pentru a obține anumite adrese alocate de către NXP.

SMBus, definită în 1995 de către firma Intel, este un subset al lui I2C care definește utilizarea mai strictă a protocolului. Scopul SMBus-ului este acela de a promova robustețe si interoperabilitate, în consecință, sistemele moderne I2C includ anumite politici și reguli aplicate de SMBus, uneori, pentru a sprijini atat I2C cât si SMBus, e necesară doar o configurare minimă, fie prin comandarea sau utilizarea PIN-ului de ieșire.

I2C folosește doar două linii bidirecționale cu scurgere deschisă, linia serială de date (SDA) si linia serială de ceas (SCL) sunt ridicate în sus de către rezistori. Tensiunile tipice utilizate sunt de +5V sau +3.3V, deși sunt permise și sisteme cu alte valori ale tensiunii. Design-ul de referință I2C are un spațiu de adresă de 7 biți sau 10 biți ( în funție de dispozitivul utliziat). Vitezele comune ale interfeței I2C sunt in jurul a 100 kbit/s în modul standard și 10 kbit/s în modul de viteză redusă, iar în mod arbitrar sunt acceptate și frecvențele joase de ceas.

Revizii recente făcute asupra interfeței I2C arată că aceasta poate găzdui mai multe noduri și poate rula la viteze și mai mari (400 kbit/s modul rapid, 1Mbit/s modul rapid plus și chiar 3.4 Mbit/s modul de viteză ridicată), aceste viteze sunt utilizate pe o scară mai largă în sistemele embedded decât în sistemele de pe PC-uri, o altă caracterisitcă a I2C ar fi cei 16 biți de adresare. Numărul maxim de noduri este limitat de spațiul de adrese, precum și capacitatea totala a interfeței de 400pF, care limitează la distanțe practice de comunicare de doar cațiva metri. Impedanța relativ mare și imunitatea la zgomotul redus necesită un potențial de masă comun, care restricționează practic din nou comunicarea pe aceeași placă de PC sau pe un sistem mic de plăcuțe. De reținut faptul că ratele de biți sunt cotate pentru tranzacțiile dintre master și slave fără a interveni ceasul sau alte componente hardware. Cheltuielile generale ale protocolului includ o adresă slave și posibil o adresă de registru în interiorul dispozitivului slave precum biți ACK/NACK. Astfel, rata de transfer efectivă a datelor de utilizator este mai mică decât ratele de bit de vârf. De exemplu, în cazul în care fiecare interacțiune cu un slave permite ca 1 octet de date să fie transferat, rata de date va fi mai mică decât jumatate din rata de bit de vărf.

2.1.3 Design-ul I2C

Design-ul de referință menționat anterior este alcătuit dintr-o linie serială de ceas (SCL) și o linie serială de date (SDA) cu 7 biți de adresare. Magistrala are două roluri pentru noduri, master și slave :

Nodul master – nodul care generează ceasul și inițiaza comunicarea cu nodurile slave

Nodul slave – nodul care recepționeaza ceasul și raspunde atunci când este adresat de catre nodul master.

Această interfață I2C este o interfață multi-master ceea ce înseamnă că pot fi prezente oricâte noduri master. În schimb, rolurile între nodurile master și slave se pot schimba între mesaje ( după ce s-a transmis mesajul de stop). Pot exista 4 moduri posibile de funționare pentru un dispozitiv care folosește această interfață, cu toate că cele mai multe dispozitive folosesc un singur rol și cele două moduri ale sale :

Master transmite – nodul master transmite date către nodul slave

Master recepționează – nodul master primește date de la nodul slave

Slave transmite – nodul slave transmite date către nodul master

Slave recepționează – nodul slave primeste date de la nodul master

Schema de mai jos ilustrează transferul între un nod master (microcontroler) si 3 noduri slave (convertor digital-analogic, convertor analogic-digital si un microcontroler).

Fig. 2.2 Schemă de transfer Master-Slave

Nodul master este inițial în modul de transmisie master prin trimiterea unui bit de start, urmat de adresa pe 7 biți a nodului slave cu care dorește să comunice, iar în final este urmat de un singur bit reprezentat prin 1 sau 0. ( 1 pentru a scrie date, iar 0 pentru a citi date de la nodul slave). În cazul în care există un slave pe interfață, acesta va raspunde cu un bit ACK ( active low for acknowledged ) pentru acea adresă. Masterul continua apoi fie prin a transmite sau a recepționa modul de citire sau de scriere (în funcție de bitul trimis către slave), iar nodul slave își continua modul său complementar (de a recepționa sau de a transmite date). Adresei și biților de date le sunt transmise mai întâi biții cei mai semnificativi. Bitul de start este indicat printr-o tranziție ridicată intre SDA si SCL; bitul de stop este indicat de o tranziție ascendentă de la nivel scăzut la nivelul cel mai ridicat intre SDA si SCL, toate celelalte tranziții ale SDA au loc cu un nivel scăzut al SCL.

În cazul în care nodul master dorește să scrie nodului slave , îi va trimite repetat octeți iar nodul slave va trimite un bit ACK (în această situație, nodul master se află în modul “Master transmie” iar nodul slave se află în modul “Slave recepționează”)

În cazul în care nodul master dorește să citească date de la nodul slave, atunci va recepționa repetitiv un octet de la nodul slave, masterul transmite un bit ACK după fiecare octet primit de la slave, dar abia la ultimul octet recepționat(în această situație, nodul master se află în modul “Master transmite”, iar nodul slave se află în modul “Slave transmite”).

După acest algoritm, fie nodul master încheie cu un bit de stop, sau transmite un alt bit de start dacă dorește sa-și păstreze controlul asupra interfeței pentru un transfer. [7]

2.1.4 Diagrama de timp pentru I2C

1. Transferul de date este inițiat cu un bit de start (S) semnalizate prin SDA fiind trase în jos în timp ce SCL rămâne sus.

2. SDA stabilește primul nivel de date la nivel de bit în timp ce se ține SCL jos (în timpul culorii albastre).

3. Datele sunt eșantionate (primite) atunci când SCL se ridică (culoarea verde) pentru primul bit (B1)

4. Se repetă acest proces, apoi SDA tranziționează în timp ce SCL este jos, iar datele sunt citite în timp ce SCL se află pe poziția de sus (de la B2 la Bn).

5. Un bit de stop (P) este semnalat atunci când SDA este tras sus în timp ce SCL este deja sus. Pentru a se evita detecția falsă a marker-ului, SDA se schimbă pe frontul negativ al SCL și se eșantionează și se capturează semnalul pe frontul pozitiv al SCL.

Fig. 2.3 Diagrama de timp I2C [7]

2.2 Modul Bluetooth

2.2.1 Generalități

Modulul bluetooth este o tehnologie standard pentru transfer de date pe distanțe scurte prin intermediul undelor radio cu lungimi de undă scurte în banda de frecvență 2.4-2.485 GHz pentru o rețea wireless personală. Transferul de date se poate realiza între dispozitive fixe și mobile, precum și construirea de rețele personale, iar gama transferurilor de date este în jurul a aproximativ 10 metri. Acest standard a fost creat în anul 1994 de către Jaap Haartsen si Sven Mattisso, angajați ai companiei Ericsson făcând parte din divizia Mobile Platforms. Standardul se bazează pe tehnologia de transmisie cu salt în frecvență și spectru distribuit. Specificațiile platformei Bluetooth sunt formalizate de organizatia Bluetooth Special Interest Group fondată în 1998 de către mai multe companii : Ericsson, Intel, Nokia, IBM, Sony Ericsson, Toshiba, iar de-a lungul anilor au aderat în jur de alte 10000 de companii.

Bluetooth este capabil să creeze o cale prin care aparate precum laptopuri, calculatoare personale, telefoane mobile, console video si camere video pot face schimb de informații între ele printr-o frecvență radio sigură si de rază mică, ele pot comunica între ele doar atunci când se află în aceeași rază de acțiune. Se folosește un sistem de comunicații radio, așadar nu este nevoie ca dispozitivele sa fie aliniate față în față pentru a face transfer de date/informații, acestea putând fi așezate chiar în încăperi diferite dacă este destul de puternică transmisia, deobicei raza de acoperire variază intre 1 si 100 metri. În continuare sunt prezentate clasele de emisie definite prin tehnologia Bluetooth:

Clasa I

Putere maximă permisă (mW) : 100

Putere maximă permisa (dBm) : 20

Raza de acoperire (m) : 100

Clasa II

Putere maximă permisă (mW) : 2.5

Putere maximă permisă (dBm) :4

Raza de acoperire (m) : 10

Clasa III

Putere maximă permisă (mW) : 1

Putere maximă permisă (dBm) :0

Raza de acoperire (m) : 1

Modulul bluetooth previne interferențele care apar între dispozitivele care operează în banda de frecvența de 2.45 GHz împărțind banda în 79 de canale, fiecare canal având o lățime de 1 MHz și schimbă permanent canalele de aproximativ 1600 de ori pe secundă. Există mai multe versiuni de Bluetooth, cele din versiunea 1.1 si 1.2 furnizează viteze de transfer de date de 723 Kb/s, iar versiunea 2.0 folosește un modul EDR (Enhanced Data Rate) și reușește să atingă viteze de 2.1 Mb/s. Versiunea 2.0 are un consum de energie mai ridicat decât versiunile precedente, însă prezintă si o viteza de transfer a datelor de peste 3 ori mai mare, așadar rezultă o reducere a consumului de energie față de variantele mai vechi cu peste 50% :

Bluetooth 1.0 – producătorii au întâmpinat multe dificultăți în a face produsele funcționale deoarece au avut multe probleme

Bluetooth 1.1 – Au reuțit sa rezolve multe din erorile versiunii precedente, în plus, această versiune oferă suport pentru canale necriptate și conține un indicator al puterii semnalului de transmisie.

Bluetooth 1.2 – versiune compatibila cu Bluetooth 1.1, însă are viteză mai mare de descoperire și de conectare la alte dispozitive; viteza practică de transfer de date mărită.

Bluetooth 2.0 – compatibilă la nivel de comunicație cu toate versiunile anterioare, însă prezintă o mare îmbunătățire, introducerea modului EDR (Enhanced Data Rate), care permite viteze de până la 3 Mb/s, așadar viteza de transmisie este de 3 ori mai mare, consumul de energie mai mic, în plus și rata erorilor de transmisie este mai mică. [3]

Toate dispozitivele Bluetooth transmit la cererea altui dispozitiv seturile următoare de informații numele și clasa dispozitivului, lista de servicii și specificațiile tehnice. Fiecare dispozitiv Bluetooth este în stare să execute o căutare pentru a observa ce alte echipamente compatibile cu el există prin apropiere și orice dispozitiv poate fi configurat să răspundă la procesul de căutare executat de alt echipament. În plus, dacă un dispozitiv care dorește să se conecteze la un alt dispozitiv și cunoaște adresa exactă a acestuia, se poate conecta la el indiferent de setările de vizibilitate ale echipamentului accesat.

Fiecare dispozitiv Bluetooth are o adresă unică pe 48 de biți, adrese care nu sunt folosite totuși în mod direct de către utilizatori, se optează pentru utilizarea unor nume care pot fi definite. Aceste nume se afișează atunci când un dispozitiv Bluetooth le scanează pe cele din raza sa. Conectarea dispozitivelor Bluetooth se face prin intermediul unui proces pairing prin care se stabilește o conexiune între dispozitive pe baza unei parole. În plus, datele transmise prin Bluetooth pot fi criptate pentru a preventi interceptarea lor. Aceste module se bazează pe cip-ul bluetooth Cambridge Silicon Radio BC417 care are o frecvență de 2.4 GHz, acesta este un cip complex care utilizează o memorie flash externă de 9 Mbiți. [7]

2.2.2 Modul Bluetooth model HC-05

Acest modul bluetooth are dimensiunile foarte mici 12.7mm x 27mm care are un preț foarte bun. Modulul bluetooth HC-05 este un modul destul de capabil, acesta poate fi setat ca master sau slave, care în ciuda dimensiunii lui poate rula la o tensiune de 3.3V cu nivele de semnal de 3.3V. Acesta are două moduri de operare, modul de comandă unde putem trimite comenzi AT pentru modulul în sine si modul de date în cazul în care acesta transmite și recepționează date de la un alt modul Bluetooth. Modul implicit este modul de date, iar aceasta este configurația lui standard, în acest mod are următoarele specificații:

Rata de transfer : 9600 biți/secundă

Date : 8 biți

Biți de stop : 1

Paritate : nu

Parolă implicită : 1234

Rate de transfer suportate : 9600,19200,38400,57600,115200,230400,460800 biți/secundă

Conectare automata la ultimul dispozitiv la care a fost conectat

Permisă cuplarea cu alt dispozitiv pentru a se conecta în mod implicit

Asociere automată a codului unui pin : “0000” ca implicit

Reconectare automată în 30 de minute atunci când a fost deconectat ca urmare a depășirii distanței maxime de interconectare

Modulul Bluetooth HC-05 are în alcătuirea sa o antenă prin care transmite și recepționează semnal, o rețea cu ajutorul căreia se poate potrivi radio-frecvența, o memorie flash externă, un LED care afișeaza dacă este pornit sau nu, un regulator de tensiune intre 3.3V – 5V și modificarea nivelului.

Fig. 2.4 Modul Bluetooth HC-05

În unele cazuri, s-ar putea dori să se schimbe anumite valori de configurare ale modulului Bluetooth și există două modalități de a intra în modul de comandă, fie prin conectarea pinului high KEY înainte de alimenta modulul. Acest lucru va une modulul în modul de comandă unde rata de transfer va fi 38400 biți/secundă. Acest lucru este utilizat în mod obișnuit și este util atunci când nu se cunoaște valoarea ratei de transfer care trebuie sa fie setată. Pentru a schimba rata de transfer va trebui să alimentam modulul și să tragem pinul high KEY, acest fapt va introduce modul de comandă pentru a configura rata de transfer, util atunci când vrem sa trimitem comenzi unui microcontroler deoarece pinul KEY poate fi printr-unul din pinii microcontrolerului, dar va trebui sa cunoști rata de transfer configurată. [8]

Fig. 2.5 Conectare pini modul Bluetooth [9]

2.3 Arduino

2.3.1 Generalitati Arduino

In cadrul Institutului de Design Interactiv din Ivrea, Italia a luat naștere un proiect dedicat studenților, în anul 2005. Aceștia au utilizat un BASIC Stamp destul de scump la acea vreme, valoarea acestuia ajungand la aproximativ 100 de dolari. Unul dintre fondatori a fost Massimo Banzi, care a contribuit la un design de calibrare și a predat o teză despre hardware în cadrul institutului. Cercetatorii au incercat să dezvolte platforma de cablare, pentru a fi mai ieftină și mai usor de folosit. Unul dintre aceștia a fost David Cuartielles. Între timp prețul acestei platforme a ajuns la 30 de dolari și la o utilizare cât mai mare în rândul programatorilor. [10]

Arduino este un microcontroler compus dintr-o singură placă, ce face posibilă aplicarea unor medii interactive. Partea hardware constă într-o placă cu sursa deschisă, asemănătoare cu un microcontroler de 32 biți Atmel ARM sau 8 biți Atmel AVR. Cele mai recente modele au în componență 6 pini analogici de intrare, 14 pini digitali de intrare/iesire și o interfață USB ce face posibilă atasarea altor placi de extensie. Platforma Arduino a fost proiectată cu scopul de a crea dispozitive ce interacționează cu mediul lor, prin utilizarea de actuatori și senzori. Ca exemple în care e regasește platforma sunt: detectoarele de viteza, roboții sau termostatele. Mediul de dezvoltare este integrat și rulează pe orice tip de calculator personal, astfel încat permite utilizatorilor să scrie programe cu ajutorul limbajelor de programare C sau C++. în momentul de față, o placă Arduino are un preț de aproximativ 20 euro și poate fi achiziționată sub forma de kit-uri ce se pot asambla sau deja asamblate.

Arduino poate fi utilizat și pentru a crea o conexiune interactivă de sine stătătoare sau care poate fi conectată la software pe computer (de exemplu Macromedia Flash, Processing, Max / MSP, Pure date, Supercollider). Proiectul a fost lansat în 2005, în Italia, în Ivrea. Scopul lui a fost de a crea o platformă de prototipuri, simplă pentru studenți, care să permită dezvoltarea rapidă și să fie ușor de utilizat. Proiectul a fost un mare succes și mai târziu a început să se dezvolte alte versiuni mai noi, lui. ( sursa Justin Lahart, O abordare open-source pentru hardware. [11]

Proiectul Arduino a fost de la începuturile sale disponibil gratuit (open source) tuturor utilizatorilor care doresc să utilizeze și / sau să îl îmbunătățească. Documentarele, limba de referință și bibliotecile externe sunt apoi, de obicei, emise sub licența Creative Commons. Acest lucru face disponibil toate fișierele sursă și respectarea anumitor condiții de compatibilitate (fie prin limbajul Java, care este scris într-un mediu de dezvoltare (IDE) sau prin utilizarea unui USB -to- RS232 cip traductor, care oferă o linie de serie și care sunt de obicei drivere disponibile pe majoritatea platformelor).

Plăcile Arduino conțin o familie de microcontrolere pe 8 biți de AVR de la Atmel și o serie de alte circuite de sprijin. Lansarea oficială a Arduino s-a făcut de către compania italiană care produce și vinde Proiecte Inteligente, folosind chip-uri ATmega8, ATmega168, ATMEGA328, ATMega1280, ATmega2560 și SAM3X8E. Fiecare bord are o majoritate de pini I / O accesibili prin intermediul socketelor standardizate care conectează cu ușurință la alte circuite (Arduino Shield). Pe coperta se află câteva LED-uri, butonul pentru resetare, butonii conectori pentru ICSP programare, conector de alimentare și un circuit oscilator.

Versiunea de bază a Arduino, Arduino Uno oferă un total de 14 I/O PINI digitali și 6 pini analog. Șase pinii digitali pot fi de asemenea folosiți pentru controlare software PWM de ieșire.

Principalul microcontroler, care este programabil de utilizator, are deja un bootloader (codul după rulare are grijă de setările de bază ale microcontrolerului, cum ar fi interfața de configurare cronometru intern, USART, etc.) și a stabilit siguranțe necesare de octeți (cele cu nivel scăzut setau anumite proprietăți pe cip). Ca urmare, utilizatorul nu trebuie să își facă griji despre detaliile și programele scrise într-o limbă cum ar fi C / C ++.

Fig. 2.6 Arduino UNO [11]

Placa Arduino este compusă dintr-un microcontroler Atmel de 8 biti AVR în care componentele sunt complementare, pentru usurința incorporarii în circuite. Unitatea de bază este conectată la diferite module interschimbabile, numite scuturi. Acestea comunică cu placa în mod direct cu ajutorul unor ace sau printr-o magistrală serială I2C astfel încât aceste scuturi să fie folosite în paralel. Seria de cipuri folosită de Arduino este compusă din Atmega8, Atmega168, Atmega328, Atmega 1280 și Atmega 2560.

Majoritatea plăcilor au în componență un oscilator cu cristal de 16MHz (acesta poate fi inlocuit cu un rezonator ceramic) și un regulator liniar de 5V. Frecventa de rulare poate să fie mai mică, de 8MHz. Microcontrolerul Arduino este preprogramat, nefiind nevoie de o programare externă, iar această caracteristica duce la usurință în folosire chiar și pe un calculator obișnuit.

Plăcile sunt programate printr-o conexiune serială de tip RS232. există și plăci Arduino în serie, ce conțin un circuit ce permite conversia semnalelor la nivel TTL și la nivel RS232. Majoritatea plăcilor sunt programate prin USB, fiind implementate cu ajutorul cipurilor adaptorului, adica FT232 sau FTDI. Arduino Mini foloseste o placa detasabila a adaptorului USB, iar placile Arduino Nano au pini pe partea interioara a placii pentru conectarea facila la placile care nu sunt deja lipite. Compania care produce aceste plăci este SparkFun Electronics, iar hardware-ul Arduino este fabricat în Italia. Mai jos se regăsesc câteva tipuri de plăci Arduino:

Fig. 2.7 Tipuri de plăci Arduino

Există o gamă variată de plăci Arduino, fiecare având specificații diferite, mai jos sunt prezentate diferitele modele de plăci Arduino cu specificațiile lor:

Tabel 2.1 Caracteristicile diferitelor plăci Arduino [12]

2.3.2. Arduino Nano

Arduino Nano este o placă cu microcontroler de dimensiuni reduse ce se bazează pe microcontrolerul Atmega328 sau Atmega 128. Modelul Nano are mai mult sau mai puțin aceeași funcționalitate ca și precedentul său Arduino Duemilanove, dar într-un pachet diferit. Nano diferă de plăcile precedente, unde nu sunt utilizate FTDI, dar are în componență un microcontroler Atmega8U2, programat ca un convertor USB serial.

Arduino Nano poate fi alimentat cu o sursă externă sau printr-o conexiune Mini-B USB. O baterie sau un adaptor AC/DC poate produce puterea externă, acesta din urmă fiind conectat în mufa de alimentare printr-o priză de 2,1mm. Dacă se utilizează o tensiune ce depășește valoarea de 12V, atunci regulatorul de tensiune se poate defecta. [13, 14]

Pinii de alimentare ai plăcii sunt:

GND – sunt acele de la sol

IOREF – sunt pini de pe placă ce oferă o tensiune de referință ce influențează funcționarea microcontrolerului; dacă scutul este bine configurat, se poate determina tensiunea acestor pini

VIN – reprezintă tensiunea de intrare în placa Arduino când se utilizează o sursă externă de alimentare

5V – acest pin are rolul de a emite în mod regulat valoarea de 5V; placa se poate alimenta cu energie electrică de la conectorul USB sau de la mufa de alimentare DC

3v3 – reprezinta o sursă de 3,3V ce generează reglementarea de la bord

ATmega328 oferă o comunicare serială de tip UART TTL cu o putere de 5V, fiind disponibilă pe acele digitale RX și TX. Software-ul Arduino este compus dintr-un monitor de serie ce realizează trecerea datelor către placă. în momentul în care datele sunt transmise, cele două LED-ul RX și TX, vor clipi prin intermediul unui cip USB serial. Arduino Uno este proiectat astfel încât resetarea să fie facută de software în timp ce este conectat la calculator. Cu ajutorul unui condensator cu o capacitate de 100nF se realizează conectarea la linia de resetare ATmega328. Atunci când linia este pornită, are loc resetarea circuitului, astfel orice cod pe care dorim să îl incărcăm necesită o simplă apăsare a butonului de Upload, rezultând o încărcare de scurtă durată. În momentul în care placa este conectată la calculator, are loc resetarea de fiecare dată când este făcută o conexiune software prin USB.

Fig. 2.8 Arduino Nano [15]

Arduino Nano, la fel ca frățiorul său mai mare, Arduino Uno, are în componență o siguranță programabilă cu rol de protecție al porturilor USB la suprasarcină sau scurtcircuit, de aceea platforma nu afectează calculatorul. Siguranța poate să intrerupă automat conexiunea dacă se aplică pe USB mai mult de 500mA, atât timp cat parametrii nu sunt în limitele normale. Se poate folosi o carcasa pentru protecția plăcii deoarece este prevazută cu patru orificii pentru șuruburi. [13, 14]

Caracteristicile plăcii Arduino Nano sunt următoarele:

Microcontroler de tip ATmega328

Tensiunea de intrare este cuprinsă între 7V și 12V

Tensiunea de intrare limită este cuprinsă între 6V și 20V

Tensiunea de lucru este de 5V

Conține 6 pini analogici

Conține 14 pini digitali

Memoria SRAM este de 2kB

Memoria EEPROM este de 1kB

Viteza este de 16MHz

Intensitatea de ieșire este de 40mA

Intensitatea de ieșire pe 3.3V este de 50mA [15, 22]

Descrierea pinilor Arduino Nano

Fig. 2.9 Arduino Nano descriere pini [16]

Tabel 2.2 Tabel pini Arduino Nano

2.4 Motoare de CC

2.4.1 Construcție si clasificare

Motoarele de CC sunt formate dintr-un inductor sau stator care poartă bobinele de excitație și un rotor sau inductor având înfășurările legate la un colector cu perii și sunt alimentate de la o sursă de curent continuu.

După modul de alimentare a inductorului se deosebesc 4 tipuri de motoare de curent continuu:

cu excitație serie

Prezintă o caracteristică mecanică foarte elastică și neliniară :

Fig. 2.10 Motoare de CC cu excitație serie [17]

cu excitație derivație

Prezintă o carcateristică naturală rigidă și liniară :

Fig. 2.11 Motoare de CC cu excitație derivație [17]

cu excitație separată

Prezintă o caracteristică naturala rigidă, cu posibilități largi de reglare a turației

Fig. 2.12 Motoare de CC cu excitație separată [17]

cu excitație mixtă

Motorul dispune de două fluxuri de excitație: serie și paralel cu posibilități de reglare independentă.

Fig. 2.13 Motoare de CC cu excitație mixtă [17]

Cele două fluxuri pot să se adune sau să se scadă, astfel că față de caracteristica corespunzătoare a motorului cu excitație derivație, pot să apară următoarele cazuri:

dacă fluxurile celor două înfășurări se însumează algebric, rezultă caracteristica neliniară și cu o dependență pronunțată a turației motorului cu momentul (caracteristică elastică)

dacă fluxurile se scad, se obține o caracteristică rigidă sau chiar o caracteristică de tipul care este însă instabilă.

În acționarea instalațiilor industriale, cele mai răspândite sunt motoarele de curent continuu cu excitație derivație.

Fig. 2.14 Structura motorului de CC [18]

2.4.2 Mărimi nominale

Motoarele de curent continuu ca și toate receptoarele sunt dimensionate pentru un anumit regim de funcționare. Acesta se numește regimul nominal sau serviciul nominal și în cadrul lui motorul poate funcționa permanent fără ca părțile sale componente să se încălzească peste limita admisibilă.

Mărimile nominale pentru un motor de curent continuu sunt în general următoarele:

puterea nominală ( Pm în W, KW ) reprezintă puterea mecanică utilă la arborele motorului

tensiunea nominală ( Ue în V ) este tensiunea necesară a fi aplicată excitației.

curentul nominal ( I în A ) este curentul absorbit de la rețea corespunzător puterii și tensiunii nominale.

turația nominală este turația arborelui rotorului

randamentul motorului Rj reprezintă raportul :

Pn este puterea nominală/mecanică a motorului

Pa=Uxl este puterea electrică absorbită de la rețea

Randamentul este subunitar datorită pierderilor de energie din mașină; aceste pierderi sunt de natură electromagnetică și mecanică.

Pierderile electromagnetice sunt:

pierderi de cupru, care reprezintă pierderile din bobinajele de excitație și al indusului

pierderi in fier, care reprezintă pierderile ce se produc ăn pachetul de tole al rotorului

pierderile mecanice se datoresc forțelor de frecare din lagăre.

2.4.3 Pornirea motoarelor de curent continuu

Motoarele de curent continuu nu pornesc prin legare directă la rețea așa cum se arată în schema din figura de mai jos deoarece curentul de pornire ar fi de aproximativ 20-50 de ori mai mare decât curentul nominal. Pentru a se micșora acest curent până la de 2-2.5 ori, curentul nominal utilizează un reostat de pornire. Acesta se introduce în circuitul principal al motorului. Pe măsură ce turația motorului crește, curentul absorbit de la rețea scade. Reostatul de pornire este scos treptat din circuit și ajunge să fie scurtcircuitat când se atinge turația nominală a motorului.

Fig. 2.15 Pornirea motoarelor de CC [18]

Relația tensiunilor este:

Deoarece Rr este mică, la pornire apar curenți de pornire Irp mult mai mari decât curentul nominal :

Dacă rotorul este blocat, se obține curentul de pornire maxim maximorum

Curentul de pornire trebuie linitat la intervalul:

Curentul rotoric se stabilizează la valoarea nominală după scurgerea timpului de accelerare/pornire ta:

Fig. 2.16 Variația curenților la pornire [18]

2.4.4 Reglarea turației motorului de curent continuu și schimbarea sensului de rotație

Turația motorului de curent continuu se poate regla fie prin variația tensiunii, fie prin variația curentului de excitație. Curentul de excitație se poate varia utilizându-se un reostat. Se pot realiza variații ale turației față de turația nominală în raportul 1/3.

Schimbarea sensului de rotație al motorului se realizează prin inversarea legăturilor fie la stator (la excitație) fie la rotor. Dacă se inversează legăturile în ambele locuri nu se obține schimbarea sensului de rotație.

2.5 Driver de motoare

Un circuit de comandă a motorului este proiectat pentru a conduce o sarcină electromagnetică, cum ar fi un motor periat sau fără perii, motor pas cu pas sau un solenoid sau releu.

Driverul de motoare este un mic amplificator de curent. Principala lui funcție este de a lua un semnal slab de curent de control pe care apoi îl transformă într-un semnal de curent mai mare, care poate conduce un motor.

Driverul de motorare, de obicei, are nevoie de tensiuni și / sau curenți care depășesc ceea ce poate fi furnizat de către analog sau de procesarea semnalului digital. Driverul de motoare asigură interfața dintre circuitele de procesare a semnalului și motorul însuși. Aceasta este în esență “amplificator” pentru motor.

Driverul de motoare poate fi construit din componente discrete, complet integrat în interiorul unei IC, sau pot folosi componente discrete și integrate. Atunci când nivelurile de curent și de tensiune permite, integrarea întregului driver de motoare într-un singur IC oferă, în general, cel mai înalt nivel de funcționalitate și performanță la cea mai mică dimensiune fizică.

În plus, față de furnizarea de înaltă tensiune și unitate de mare intensitate, driverele de motoare, de asemenea, integrează controlul de circuite de mai multe ori, cum ar fi mașini de stat digitale pentru a opera motorul. Drivere integrate cu motor de la TI includ, de asemenea sisteme de protecție robuste, inclusiv scurtcircuitul, peste curent, peste temperatură și protecție pentru sub-tensiune pentru a preveni erori de sistem în caz de defecțiuni electrice sau mecanice.

Tipuri de drivere de motor :

Există mai multe tipuri diferite de drivere de motor. Cele mai comune tipuri de clasificare sunt cele de tensiune maximă de alimentare, curent maxim de ieșire, disipare de putere nominală, tensiune de încărcare, tipul de ambalare și numărul de ieșiri. Valorile pentru tensiune maximă de alimentare sunt de 36 V și 52 V. De asemenea, se găsesc drivere de motoare cu tensiune de alimentare de până la 450 V. Numărul de ieșiri poate fi între 1 și 12, dar cele mai multe drivere de motoare sunt cu 1, 2 sau 4 ieșiri.

Driverele de motor pot fi găsite într-o gamă largă de aplicații, inclusiv:

– Releu și solenoid de comutare

– Motor pas cu pas

– LED-uri și ecrane incandescente

– Aplicații auto

– Echipament audio-vizual

– Periferice pentru PC

– Sistem audio pentru mașini

– Sisteme de navigație auto

Fig. 2.17 Model de driver de motoare TB6612FNG [19]

Driverul de motoare ales de mine în realizarea robotului este modelul Driver TB6612FNG Dual 1A care are codul MCN-DRV-21 care este un driver de motor dual care are următoarele specificații :

– Tensiune de alimentare : VM=15V max, VCC=2.7-5.5V

– Curent =1.2A(medie) / 3.2A (peak)

– Protecție termică

Fig. 2.18 Driver de motor TB6612FNG Dual 1A pini [19]

Driverul de motor TB6612FNG poate controla două motoare de curent continuu în același timp, la un curent constant de 1.2A (peak-to-peak 3.2A). Două semnale de intrare (IN1 și IN2) pot fi utilizate pentru a controla motorul într-unul dintre cele patru moduri de funcționare. Cele doua ieșiri motoare (A și B) pot fi controlate separat, viteza fiecărui motor este controlată printr-un semnal de intrare PWM cu o frecvență de până la 100 kHz. Pin-ul STBY trebuie tras în sus în momentul în care vrem sa ținem motorul în poziția de repaus (stand-by).

Tensiunea de alimentare (VCC) poate fi în intervalul 2.7-5.5 VDC, în timp ce alimentarea motoarelor (VM) este limitată la o tensiune maximă de 15 VDC. Curentul de ieșire este evaluat până la 1.2A pe canal (sau până la 3.2A pentru un impuls scurt singur). Placa vine cu toate componentele instalate după cum se vede în figura de mai jos. Condensatorii de decuplare sunt incluși pe ambele linii de alimentare, iar pinii sunt aranjați astfel: pinii de intrare pe un lateral, iar pinii de ieșire pe cealaltă laterală.

Fig. 2.19 Driver de motor – Dual TB6612FNG (1A) [19]

3. Microcontroler

3.1 Caracteristici generale

Microcontrolere sunt omniprezente în viața de zi cu zi. Acestea sunt folosite ca mici computere, care fac totul.

Un microcontroler este un microcircuit care incorporează o unitate centrală (CPU) și o memorie împreună cu resurse care-i permit interacțiunea cu mediul exterior. Microcontrolere sunt proiectate pentru aplicații embedded, în contrast cu microprocesoare folosite în computere personale sau alte aplicații de uz general. [20]

Fig. 3.1 Microcontroler schemă [21]

Microcontrolerele sunt utilizate în produse și dispozitive de control automat, cum ar fi sistemele de motoare de automobile de control, dispozitivele medicale implantabile, telecomenzi, mașini de birou, aparate, scule electrice, jucării și alte sisteme integrate. Prin reducerea mărimii și a costului în comparație cu un design care folosește un microprocessor separat, memorie, și dispozitive de intrare / de ieșire, microcontroler-ul este economic. Unele microprocesoare pot folosi patru biți și funcționează la frecvențe mici de 4 kHz, pentru consum redus de energie (mW o singură cifră sau microwați). Ei vor avea, în general capacitatea de a reține funcționalitate în timpul de așteptare pentru un eveniment, cum ar fi un buton sau altă presă de întrerupere; consumul de energie în timpul de repaus (ceas CPU și cele mai multe periferice off) poate fi doar nanowatts, făcând multe dintre ele potrivite pentru aplicații de baterii de lungă durată. Alte microcontrolere pot servi roluri de performanță critice, în cazul în care ar putea avea nevoie pentru a acționa mai mult ca un procesor de semnal digital (DSP), cu viteze de ceas mai mari și consumul de energie. Tensiunea de alimentare standard pentru majoritatea microcontrolerelor este de Vcc= 5V (cu o anumită toleranță ).

Fig. 3.2 Microcontroler Atmega32 și Atmega8 [22]

Resursele integrate la nivelul microcircuitului trebuie să cuprindă următoarele elemente: o unitate centrală ( CPU ), o memorie locală tip RAM și eventual una de tip ROM/ PROM / EPROM, I/O – intrări / ieșiri numerice (paralele și seriale ) , timere (temporizatoare ) / numărătoare , un sistem de întreruperi.

3.2 Unități componente ale unui microcontroler

Un microcontroler este un singur circuit integrat, care cuprinde, de cele mai multe ori următoarele caracteristici:

– Unitate centrală de procesare – de la mici și simple, procesoare de 4 biți, procesoare complexe pe 32 sau 64 de biți:

– Memoria volatilă (RAM) pentru stocarea datelor.

– ROM, EPROM, EEPROM sau memorie Flash pentru programul și parametru de funcționare de depozitare

– intrări și de ieșiri de biți discrete, care să permită controlul sau detectarea stării logice a unui pachet pin individual

– serială de intrare / ieșire, cum ar fi porturile seriale

– alte comunicații, seriale, interfețe, cum ar fi I2C, Interfață Serial Periferică și Controller Area Network pentru sistemul de interconectare.

– periferice, cum ar fi cronometre, contoare, generatoare PWM, și supraveghere (whatchdog).

– generator de ceas – de multe ori un oscilator pentru un cristal de cuarț de sincronizare, rezonator sau de circuit RC.

– multe includ convertoare analog-digitale, unele includ convertoare digital-analogice.

– în circuite de programare și de sprijin pentru depanare.

Această integrare reduce drastic numărul de cip-uri, precum și valoarea de cabluri și placă de circuit, spațiu care ar fi necesar pentru a produce sisteme echivalente folosind cip-uri separate.

3.2.1 Unitatea de memorie

Este partea microcontrolerului care are funcția specifică de a salva/stoca datele.

Fig. 3.3 Unitatea de memorie a microcontrolerului

Pentru o anumită intrare se obține conținutul unei locații de memorie specifice. Memoria este compusă din toate locațiile de memorie, iar adresarea este selectarea unei locații de memorie. În afară de citirea dintr-o locație de memorie, memoria trebuie de asemenea să permită scrierea în ea. Aceasta se face prin asigurarea unei linii adiționale, numită linie de control care asigură atât citirea, cât și scrierea în memorie.

3.2.2 Bus-ul

Reprezintă un grup de 8, 16, sau mai multe fire. Este o magistrală (cale). Sunt două tipuri de bus-uri: bus de adresă și bus de date. Primul constă din atâtea linii cât este cantitatea de memorie ce se dorește a fi adresată, iar celălalt este atât de lat cât sunt datele. Primul servește la transmiterea adreselor de la CPU la memorie, iar cel de al doilea la conectarea tuturor blocurilor din interiorul microcontrolerului.

Fig. 3.4 Conectarea memoriei și a unității centrale folosind bus-urile pentru a câștiga funcționalitate

Figura se referă la adăugarea unui bloc care conține câteva locații de memorie al cărui capăt este conectat la bus-ul de date, iar celălalt are conexiune cu liniile de ieșire la microcontroler ce se pot vedea cu ochiul liber ca pini la componenta electronică.

3.2.3 Unitatea de procesare centrală (CPU)

Este partea care se adaugă, compusă din alte trei locații de memorie pentru un bloc specific ce va avea o capabilitate încorporată de înmulțire, împărțire, scădere și de mutarea conținutului unei locații de memorie dintr-o locație de memorie în alta. Locațiile ei de memorie sunt numite regiștri.

Regiștrii sunt locații de memorie care au ca rol principal de a ajuta prin executarea unor operații matematice variate sau a altor operații efectuate direct cu datele de procesare.

Fig. 3.5 CPU – Unitate simplificată de procesare centrală cu trei regiștri

3.2.4 Unitatea intrare-ieșire

Aceste locații pe care le-am descris în figura de mai sus sunt numite „porturi”. Sunt diferite tipuri de porturi: intrare, ieșire sau porturi pe două-căi. Când se lucrează cu porturi, mai întâi este necesar să se aleagă cu ce port urmează să se lucreze, ca apoi să se trimită date la el, sau să se ia date de la port.

Fig. 3.6 Unitate de intrare-ieșire ce permite comunicarea cu exteriorul

3.2.5 Comunicația serială

Să presupunem că lucrăm doar cu 3 linii, și că o linie este folosită pentru trimiterea de date, alta pentru recepție și a treia este folosită ca o linie de referință atât pentru partea de intrare cât și pentru partea de ieșire. Pentru ca aceasta să funcționeze, trebuie să stabilim regulile de schimb ale datelor. Aceste reguli sunt numite protocol. Să presupunem că avem următorul protocol: Unitatea logică „1” este setată pe linia de transmisie până ce începe transferul. Odată ce începe transferul, coborâm linia de transmisie la „0” logic pentru o perioadă de timp (pe care o vom desemna ca T), așa că partea receptoare va ști că sunt date de primit, așa că va activa mecanismul ei de recepție.

Fig. 3.7 Comunicația serială

Să ne întoarcem acum la partea de transmisie și să începem să punem zero-uri și unu-uri pe linia de transmisie în ordinea de la un bit a celei mai de jos valori la un bit a celei mai de sus valori. Să lăsăm ca fiecare bit să rămână pe linie pentru o perioadă de timp egală cu T, și la sfârșit, sau după al 8-lea bit, să aducem unitatea logică „1” înapoi pe linie ce va marca sfârșitul transmisiei unei date. Protocolul ce tocmai l-am descris este numit în literatura profesională NRZ (Non-Return to Zero).

3.2.6 Unitatea serială

Este folosită pentru a trimite date, dar numai prin 3 linii. Pentru că avem linii separate de recepție și de transmisie, este posibil să recepționăm și să transmitem date (informații) în același timp. Blocul așa numit full-duplex, ce permite acest mod de comunicare este numit blocul de comunicare serială. Spre deosebire de transmisia paralelă, datele sunt mutate aici bit cu bit, sau într-o serie de biți, de unde vine și numele de comunicație serială. După recepția de date trebuie să le citim din locația de transmisie și să le înmagazinăm/stocăm în memorie în mod opus transmiterii unde procesul este invers. Datele circulă din memorie prin bus către locația de trimitere, și de acolo către unitatea de recepție conform protocolului.

Fig. 3.8 Comunicația serială cu microcontroller Atmega [23]

3.2.7 Unitatea timer

Acum că avem comunicația serială, putem recepționa, trimite și procesa date.

Totuși, pentru noi ca să putem să îl folosim în industrie mai avem nevoie de câteva blocuri. Unul din acestea este blocul timer care este important pentru noi pentru că ne dă informația de timp, durată, protocol. Unitatea de bază a timer-ului este un contor liber (free-run) care este de fapt un registru a cărui valoare numerică crește cu unu la intervale egale, așa încât luându-i valoarea după intervalele T1 și T2 și pe baza diferenței lor să putem determina cât timp a trecut. Acesta este o parte foarte importantă a microcontrolerului al cărui control cere cea mai mare parte a timpului nostru.

Încă un lucru necesar este funcționarea fără defecte a microcontrolerului în timpul funcționării. Să presupunem ca urmare a unei anumite interferențe (ce adesea se întâmplă în industrie) microcontrolerul nostru se oprește din executarea programului, sau și mai rău, începe să funcționeze incorect.

Fig. 3.9 Unitate timer

Bineînțeles, când aceasta se întâmplă cu un calculator, îl resetăm pur și simplu și va continua să lucreze. Totuși, nu există buton de resetare pe care să-l apăsăm în cazul microcontrolerului care să rezolve astfel problema noastră.

Fig. 3.10 Temporizator de intrare și ieșire

3.2.8 Bloc watchdog

Acest bloc watchdog face parte din modulul de protecție al microcontrolerului, acesta este ca un ceas de gardă și se mai numește COP (Computer Operating Properly) care este folosit pentru a detecta erorile de program. Nu este obligatoriu ca orice microcontroler să folosească ceas de gardă, acesta este opțional. În cazul în care alegem să folosim ceasul de gardă, programul utilizator trebuie să reseteze periodic registrul COP; dacă nu are loc resetarea, unitatea centrală decide că a apărut o problemă în rularea programului și resetează sistemul pentru a preveni o desfășurare necontrolată a programului.

Așa cum am scris și mai sus, atunci când un calculator se blochează, printr-o singură apăsare a butonului reset a calculatorului totul se rezolvă, dar pentru microcontroler nu avem un buton de reset. Astfel, pentru a depăși acest obstacol, avem nevoie de a introduce încă un bloc numit watchdog-câinele de pază. Acest bloc este de fapt un alt contor liber (free-run) unde programul nostru trebuie să scrie un zero ori de câte ori se execute corect. În caz că programul se „înțepenește”, nu se va mai scrie zero, iar contorul se va reseta singur la atingerea valorii sale maxime. Aceasta va duce la rularea programului din nou, și corect de această dată pe toată durata. Acesta este un element important al fiecărui program ce trebuie să fie fiabil fără supravegherea omului.

Fig. 3.11 Timer-ul Watchdog [24]

3.2.9 Convertorul Analog-Digital.

Microcontroler-ul trebuie să furnizeze în timp real (previzibil, deși nu neapărat rapid), ca răspuns la evenimentele din sistemul încorporat care sunt controlate. Atunci când apar anumite evenimente,o întrerupere de sistem poate semnala microprocesorului să suspende procesarea secvenței de instrucțiuni și să înceapă o rutină de serviciu de întrerupere (ISR, sau “handler de întrerupere”). ISR va efectua orice prelucrare necesară în funcție de sursa de întrerupere, înainte de a reveni la secvența de instrucțiuni originale.

Pentru că semnalele periferice sunt substanțial diferite de cele pe care le poate înțelege microcontrolerul (zero și unu), ele trebuie convertite într-un mod care să fie înțeles de microcontroler. Această sarcină este îndeplinită de un bloc pentru conversia analog-digitală sau de un convertor AD. Acest bloc este responsabil pentru convertirea unei informații despre o anumită valoare analogică într-un număr binar și pentru a o urmări pe tot parcursul la un bloc CPU așa că blocul CPU să o poată procesa.

Fig. 3.12 Bloc pentru convertirea unui semnal analogic într-o mărime digitală

Astfel microcontrolerul este terminat, și tot ce mai rămâne de făcut este de a-l pune într-o componentă electronică unde va accesa blocurile interioare prin pinii exteriori.

Fig. 3.13 Schema bloc a microcontrolerului cu elementele lui de bază și conexiunile sale interne

3.3 Microcontroler Atmega328

Microcontrolerul folosit de mine în realizarea lucrării de licență este modelul Atmega328 de la firma Atmel care este un microcontroler de înaltă performanță pe 8 biți AVR RISC care combină 32KB ISP memorie flash cu capacități de citire în timp ce scrie, 1KB EEPROM, 2KB SRAM, 23 de linii I/O de uz general, 32 de register de uz general, 3 contoare/ temporizatori flexibile/flexibili care compară diferite moduri de lucru, întreruperi interne și externe, USART serial programabil, o interfață de 2 fire seriale orientate pe un octet/byte, port serial SPI, un convertor analog-digital cu 6 canale pe 10 biți ( 8 canale în TQFP și pachete QFN/MLF ), mai conține un temporizator programabil de supraveghere și 5 moduri software selectabile de economisire a energiei, acest microcontroler funcționeaza la tensiuni intre 1.8-5.5 V. Executând instrucțiuni puternice într-un singur ciclu de ceas, microcontrolerul se apropie de 1 MIPS pe MHz, echilibrând astfel consumul de energie și viteza de procesare.

Parametri importanți :

Parametru Valoare

Memorie Flash 32Kbytes

Număr pini 32

Frecvența maximă 20 MHz

CPU 8-bit AVR

Număr canale 16

Număr Pini I/O max 23

Întreruperi ext 24

Viteză USB necunoscută

Interfață USB nu

Principalele caracteristici ale acestui microcontroler sunt :

Din punct de vedere al arhitecturii utilizate:

131 de instrucțiuni

32×8 de registre de uz general

Din punct de vedere al memoriei:

32 de K Bytes de memorie de program Flash

1K Byte de memorie EEPROM( Electrically Erasable Programmable Read-Only Memory)

2 K Bytes de momeori SRAM( Static Random Acces Memory)

păstrarea datelor 20 de ani la 85 de grade celsius

blocare pentru securitatea software

Din punct de vedere al perifericelor din componență:

două timere/numărătoare pe 8 biți

un timer/numărător pe 16 biți

numărător cu oscilator separat

șase canale PWM (Pulse-width modulation)

8 canale de 10 biți ADC

mod diferențial cu posibilitate de a selecta câștigul la 1x ,10x sau 200x

două fire pentru interfața serială

comparator analog

Caracteristici speciale ale microcontroler-ului:

oscilator RC intern calibrat (RC-rezistor–capacitor)

surse de întrerupere interne și externe

are șase tipuri de stări de așteptare

Alte caracteristici:

funcționează la o tensiune între 1,8 și 5,5 volți

la o tensiune între 1,8-5,5 volți are o viteză de funcționare între 0-4 MHz

la viteza de 1 MHz , tensiunea de 1,8volți și temperatura de 25 de grade celsius acesta consumă o energie de 0.4 mA [26]

Fig. 3.14 Microcontroler Atmega328 [27]

Realizare practică

Scopul acestei lucrări este de a simula și monitoriza cele două moduri de funcționare ale robotului și anume modul autonom și automat de urmărire a liniei cu ajutorul senzorilor de linie programat astfel încât să respecte traseul indicat de mine prin plasarea unei linii din bandă izolieră, iar al doilea mod este reprezentat de partea când robotul nu mai urmărește linia așa cum a fost programat, se vor dezactiva senzorii de urmărire automată a liniei si algoritmul folosit se va transforma într-o aplicație și traseul robotului va putea fi comandat cu ajutorul unui dispozitiv mobil prin intermediul modulului Bluetooth.

Acest robot a fost realizat în două etape. În prima fază am realizat partea fizică și anume plăcuța pe care am montat toate elementele necesare realizării și funcționării corespunzătoare a robotului. În a doua parte am realizat partea de programare a robotului care are rolul de a realiza și respecta toate cerințele pe care i le transmit. Pe lângă acest robot, am realizat și un traseu folosit pentru modul de comandă automat și autonom de urmărire a liniei pentru a testa buna funcționare a proiectului. Acest teren constă într-un mic traseu cu curbe și obstacole pe care robotul trebuie să-l parcurgă, realizat din bandă izolieră, iar senzorii de linie trebuie să-l urmărească cu precizie indiferent de modul în care așez banda izolieră.

Fig. 4.1 Conectarea Arduino

4.1 Realizarea hardware

Pentru realizarea hardware a acestui proiect am utilizat programul KiCad EDA, un program cu ajutorul căruia am proiectat schema electrică și PCB-ul pe care am imprimat-o și am folosit-o în realizarea practică. Acest program este ușor de utilizat și foarte prietenos ca interfață ce combină două module cu scopul de a realiza proiectarea și realizarea schemelor electrice. Primul modul este cel de realizare a schmei electrice, acest mod pune la dispoziție o gamă variată de componente electronice cu ajutorul cărora putem desena schema electrică de care avem nevoie pentru orice proiect. Al doilea modul folosit de programul KiCad EDA este folosit pentru conectarea corectă si aranjarea completă a componentelor pentru a realiza schema cablajului ce urmează a fi scoasă la imprimantă șo lipită pe plăcuță. KiCad EDA este foarte ușor de utilizat, rapid și se găsește gratis pe internet. În momentul în care am terminat realizarea schemei prorpiu-zisă, programul generează un anumit tip de fișiere în care se arată exact cum se conectează toate componentele între ele, ce pini se utilizează și pe baza acestor fișiere se poate imprima circuitul electronic realizat în program.

Fiecare proces descris mai sus l-am urmat, în primul rând am desenat schema electrica cu ajutorul primului modul. În schema electrică am adăugat toate componentele electronice necesare pentru eralizarea robotului și le-am organizat în funcție de rolul pe care îl are fiecare dintre ele.. Schema electrică este alcătuită din senzorii infraroșu de reflectivitate utilizați pentru urmărirea traseului, două motoare de tip Pololu cu tensiunea de alimentare maxim 9V, viteza de rotatie de 1000 rotații/minut și cuplul motor de 0.058 Nm, alimentarea care constă intr-un acumulator Litiu Polimer cu două celule înseriate totalizând o tensiune de 7.4V, capacitatea fiind de 800mAh, driverul de motoare, microcontrolerul, ecran LCD și programatorul/seriala, fiecare conținând și restul de componente electronice necesare bunei funcționări a circuitului. În faza a doua a realizării hardware am folosit cel de-al doilea modul al programului și am realizat conectarea completă a tuturor elementelor de circuit , după care am generat fișierul de printat și am realizat schema electrica finală a circuitului și am dus-o la printat la o firmă specializată.

Fig. 4.2 Amplasare Program KiCad EDA

In figura de mai jos este prezentată versiunea precedentă a PCB-ului realizat in KiCad înainte de schema finală care a fost trimisă la printat:

Fig. 4.3 Circuitul realizat cu programul KiCad

4.1.1 Senzorii folosiți

Realizarea practică se bazează pe folosirea unor senzori infraroșu de reflectivitate așezați pe o bandă care să-i susțină. Acești senzori infraroșu de la firma Pololu, modelul QRE113GR sunt dispuși pe un modul de 8 senzori de tipul QTR-8A dintre care ne sunt necesari doar 6 senzori, ceea ce îl fac un foarte bun detector pentru un robot ca al meu, care pe modul automat și autonom trebuie să urmărească linia.

Fig. 4.4 Grafice de performanță senzori infraroșu [28]

Matricea de senzori de reflectivitate/infraroșu QTR-8A este concepută ca un senzor de linie, dar poate fi folosită în proximitate și ca senzor de uz general sau senzor de reflexie. Modulul este un suport convenabil pentru emițător și receptor (fototranzistor) care conține perechi de senzori așezați uniform la distanțe egale de 9.5 mm. Fiecare fototranzistor este conectat la un rezistor pull-up pentru a forma un divizor de tensiune care produce o tensiune de ieșire analogică intre 0V și tensiunea de intrare (deobicei 5V) ca o funcție de reflecția infraroșie, iar tensiunea de ieșire inferioară este un indiciu mai mare de reflexie. Realizările sunt toate independente, dar LED-urile sunt aranjate în perechi pentru a reduce la jumătate consumul de curent. Rezistențele de limitare ale curentului LED-urilor pentru funcționări la 5V sunt aranjate în două etape : acest lucru permite o simplă ocolire a unei etape, pentru a permite funcționarea la 3.3V. Un LED are aproximativ 20-25mA, ceea ce face consumul total de bord de doar 100mA, iar mai jos este prezentată diagrama schematică a modulului de senzori de reflectivitate/infraroșu QTR-8A:

Fig. 4.5 Modul de senzori infraroșu QTR-8A

Fig. 4.6 Schema electrică a modulului de senzori infraroșu [29]

După cum am spus mai sus, nouă ne sunt necesari doar 6 senzori din cei 8 posibili pe care am putea să-i folosim, iar senzorii sunt împărțiți astfel:

Doi senzori folosiți pentru a verifica dacă pe traseu apare o curba spre stânga

Doi senzori folosiți pentru a verifica în orice moment că robotul se află pe linia neagră

Doi senzori folosiți pentru a verifica dacă pe traseu urmează o curba spre dreapta.

În schimb, dacă senzorul din centru-dreapta

Fig. 4.7 Schemă bloc robot

4.1.2 Alimentare baterie

Pentru ca un circuit electric să funcționeze acesta trebuie să fie legat la o sursă de alimentare. În cazul proiectului meu sursa de alimentare este reprezentată de un acumulator Litiu Polimer cu două celule înseriate ce generează o tensiune de 7.4 V, iar capactitatea fiind de 800mAh . Este recomandat ca bateria să nu dezvolte o tensiune mai mică decât pragul de 7.4 V în momentul folosirii ei deoarece duce la o funcționare incorectă. Această tehnologie cu Litiu Polimer oferă o mare densitate a energiei, greutate mică și durată de exploatare convenabilă comparativ cu alte baterii.

Specificații:

Tensiunea: 7.4 V

Capacitate : 800mA

Rată descărcare : 25C

Curent maxim de încărcare : 4000mA

Curent de încărcare recomandat : 800-2400 mA

Curent maxim de descărcare : 16A

Masa : 50g

5. Perspective de dezvoltare

Pornind de la proiectul pe care l-am realizat, pe viitor există destul de multe îmbunătățiri ale proiectului. În primul rând, aceste dezvoltări necesită componente mai scumpe pentru a face robotul mai puternic și mai eficient. De exemplu, putem folosi motoare mai puternice și mai rapide, un microcontroler mai eficient, bineînțeles că schimbarea acestor componente vor face ca proiectul să fie mai costisitor, dar și mai eficient în același timp. În ceea ce privește performanța autonomiei bateriei, acest lucru se poate îmbunătăți prin folosirea unor acumulatori mai mari sau aș putea să realizez chiar eu sursa de alimentare sau ca să fie mai interesant, pot să folosesc energie solară atașând robotului niște module cu celule fotovoltaice de dimensiuni reduse, dar destul de puternice care să se potrivească pe robot și să-l alimenteze.

Printre principalele obiective de dezvoltare și cercetare în domeniul roboților se mai numără și dezvoltarea unor sisteme de manipulare performante și ușor de controlat și adaptabile unor misiuni cât mai variate, dezvoltarea unor sisteme multi-senzor capabile să ofere cât mai multă informație persoanei care utilizează robotul, dezvoltarea și implementarea unei camere de supraveghere performantă, a unui sistem de control și a unor interfețe de comandă performante care să ofere utilizatorului senzația de prezență reală la locul de operare al robotului rezultând astfel rezultate și informații cât mai corecte și precise.

6. Concluzii

În concluzie, în această lucrare am prezentat cele două moduri de funcționare ale robotului, modul autonom și automat de urmărire a liniei și modul în care se trece comutatorul pe poziția off și controlăm robotul prin bluetooth cu ajutorul unui dispozitiv mobil, precum și monitorizarea pe ecranul LCD a parametrilor importanti ai robotului ( puterea consumată, modul de comandă etc.). Robotul are capacitatea de a se deplasa pe orice suprafață de teren, acesta este capabil să urmărească linia bazându-se doar pe senzorii de reflectivitate montați în față și capacitatea acumulatorului pe modul automat-autonom, pe modul manual de comandă prin intermediul dispozitivului bluetooth, robotul se poate deplasa pe orice suprafață atata timp cât există conexiunea bluetooth și acumulatorul mai are capacitate.

Putem remarca următoarele avantaje pe care robotul le prezintă:

poate fi controlat oriunde exista conexiune bluetooth

nu se limitează la un moment de operare, acesta poate fi conectat direct la rețeaua de alimentare

componentele sunt de o complexitate medie

modulul bluetooth folosit are o rază de aproximativ 10 metri, puteam să folosesc și un modul mai puternic, dar astfel creștea costul.

Așadar, pot spune ca sunt mulțumit de modul în care am realizat acest proiect, atât prin realizarea teoretică, cât și prin realizarea practică, iar pe viitor doresc să aduc îmbunătățiri majore robotului în ceea ce privește partea de componente, voi folosi altele mai performante, iar alimentarea va fi pe bază de energie solară.

Bibliografie

[1] Rusu, I., Babaradă, F. Drăghici, Dispozitive electronice. Îndrumar de laborator, Editura Rosetti Educațional, București, 2011

[2] Muller V, Curs de mașini și acționări electrice, Editura Politehnica, București, 2005

[3] Radu Rădescu, Arhitectura sistemelor de calcul, Editura Politehnica Press, București 2009

[4] Afișaj cu cristale lichide https://ro.wikipedia.org/wiki/Afișaj_cu_cristale_lichide , accesat în martie 2016

[5] Cristal lichid, https://ro.wikipedia.org/wiki/Cristal_lichid , accesat în martie 2016

[6] LCD-Blue-I2C, https://arduino-info.wikispaces.com/LCD-Blue-I2C , accesat în martie 2016

[7] I²C , https://en.wikipedia.org/wiki/I%C2%B2C, accesat în martie 2016

[8] BlueTooth-HC05-Modules-How-To , https://arduino-info.wikispaces.com/BlueTooth-HC05-HC06-Modules-How-To, accesat in mai 2016

[9] HC-05 Bluetooth, https://developer.mbed.org/users/edodm85/notebook/HC-05-bluetooth/, accesat în mai 2016

[10] Arduino, https://ro.wikipedia.org/wiki/Arduino , accesat în iunie 2016

[11] Taking an Open-Source Approach to Hardware, http://www.wsj.com/articles/SB10001424052748703499404574559960271468066, accesat în iunie 2016

[12] Compare board specs, https://www.arduino.cc/en/Products/Compare, accesat în iunie 2016

[13] Arduino, https://ro.wikipedia.org/wiki/Arduino , accesat în iunie 2016

[14] Arduino Uno v3 , http://www.robofun.ro/arduino_uno_v3, accesat în iunie 2016

[15] Arduino Nano USB Microcontroller v3, http://www.robotshop.com/en/arduino-nan-v-3.html, accesat în iunie 2016

[16] Arduino Nano (V2.3), User Manual, https://www.arduino.cc/en/uploads/Main/ArduinoNanoManual23.pdf, accesat în iunie 2016

[17] http://www.scritub.com/ , accesat în iunie 2016

[18] https://www.scribd.com/ , accesat în iunie 2016

[19] Driver TB6612FNG Dual 1A , https://www.robofun.ro/mecanice/driver/driver_dc/driver-TB6612FNG, accesat în iunie 2016

[20] Microcontroller, https://wikipedia.org/wiki/Microcontroller, accesat în aprilie 2016

[21] Introduction to the world of microcontrollers, http://learn.mikroe.com/ebooks/piccprogramming/chapter/introduction-to-the-world-of-microcontrollers/, accesat în aprilie 2016

[22] Two Atmega microcontrollers, https://wikipedia.org/wiki/Microcontroller#/media/File:Microcontrollers_Atmega32_Atmega8.jpg, accesat în aprilie 2016

[23] Basics: Serial communication with AVR microcontrollers, http://www.evilmadscientist.com/2009/basics-serial-communication-with-avr-microcontrollers/, accesat în aprilie 2016

[24] Microcontrollere (MC), http://vega.unitbv.ro/~ogrutan/ti/cap10.pdf, accesat în aprilie 2016

[25] PICbook, http://www.mikroe.com/ro/product/books/PICbook/, accesat în aprilie 2016

[26] http://www.atmel.com/images/, accesat în aprilie 2016

[27] ATMEGA328, PINOUT, http://www.pighixxx.com/test/portfolio-items/328, accesat în aprilie 2016

[28] QRE1113GR SMT Reflective Object Sensor, https://www.pololu.com/file/0J117/QRE1113GR.pdf, accesat în iunie 2016

[29] QTR-8A Reflectance Sensor Array, https://www.pololu.com/product/960, accesat în iunie 2016

Anexe

Anexa 1 – Diagrama hardware

Schemă PCB

Schemă PCB imprimată

Anexa 2 – Codul Sursă

#include <Wire.h>

#include <LiquidCrystal_I2C.h>

#include <SoftwareSerial.h>

LiquidCrystal_I2C lcd(0x27, 2, 1, 0, 4, 5, 6, 7, 3, POSITIVE); // Se seteaza adresa I2C a LCD-ului

/* Motordriver */

#define M2A 6 // stanga, inainte

#define M2B 4 // stanga, inapoi

#define M2PWM 3

#define M1A 8 // dreapta, inainte

#define M1B 7 // dreapta, inapoi

#define M1PWM 9

/* Bluetooth */

#define tx 10

#define rx 11

SoftwareSerial bluetooth(tx , rx); //se creaza o interfata seriala pe pinii tx (10)/rx(11)

char BluetoothData; //se defineste global variabila care va stoca ce se primeste pe bluetooth

/* linefollower */

int s1; //se definesc senzorii, S1 – senzorul din extremitatea stanga

int s2;

int s3;

int s4;

int s5;

int s6; //S6 senzorul din extremitatea dreapta

int line;

int pos = 0;

//se definesc variabile pentru citirea senzorilor

int s1_c;

int s2_c;

int s3_c;

int s4_c;

int s5_c;

int s6_c;

//parametrii pid

int max_vel = 145; //viteza maxima data pe motoare cand robotul este pe linie

int turn_vel = 140; // viteza de rotire atunci cand pierde linia

int kp_val = 5 ; //variabila P din PID

int kd_val = 400; // variabila D din PID

int last_proportional = 0;

//se seteaza valori pentru a putea procesa senzorii

int pas0 = 50;

int pas1 = 100;

int pas2 = 200;

int pas3 = 300;

int pas4 = 400;

int pas5 = 500;

int pas6 = 600;

int pas7 = 700;

/* Functia de motoare */

void set_motors(int stanga, int dreapta)

{

if (stanga > 0) {

digitalWrite(M1A, HIGH);

digitalWrite(M1B, LOW);

analogWrite(M1PWM, stanga);

} else if (stanga <= 0) {

digitalWrite(M1A, LOW);

digitalWrite(M1B, HIGH);

analogWrite(M1PWM, -stanga);

}

if (dreapta > 0) {

digitalWrite(M2A, LOW);

digitalWrite(M2B, HIGH);

analogWrite(M2PWM, dreapta);

} else if (dreapta <= 0 ){

digitalWrite(M2A, HIGH);

digitalWrite(M2B, LOW);

analogWrite(M2PWM, -dreapta);

}

}

/* Functie pentru a citi senzorii si a ii procesa */

void read_sensors_black() {

//citirea senzorilor, s1 fiind senzorul pus pe pinul digital 2

s1 = digitalRead(2);

s2 = analogRead(A7);

s3 = analogRead(A3);

s4 = analogRead(A2);

s5 = analogRead(A1);

s6 = analogRead(A0); //S6 citirea senzorului pus pe pinul analog A0

//dat fiind faptul ca nu mai aveam pini liberi pe canalele de analog S1 il citim ca digital

if (s1 == 0 ) s1_c = 0; //daca S1 nu este pe linie atunci valoarea procesata a lui este 0

else if (s1 == 1) s1_c = 6; //daca S1 este pe linie atunci valoarea procesata este 6

if (s2 < pas0) s2_c = 0; //daca S2 nu este pe linie valoarea procesata este 0

else if ((s2 > pas0) && (s2 <= pas1)) s2_c = 1; //daca S2 este partial pe linie, valoarea citita pe analoc este in intervalul (50 – 100] atunci valoarea citita/procesata este 1

else if ((s2 > pas1) && (s2 <= pas2)) s2_c = 2; //daca valoarea citita pe s2 este in intervalul (100-200] atunci valoarea procesata este 2

else if ((s2 > pas2) && (s2 <= pas3)) s2_c = 3;

else if ((s2 > pas3) && (s2 <= pas4)) s2_c = 4;

else if ((s2 > pas4) && (s2 <= pas5)) s2_c = 5;

else if ((s2 > pas5) && (s2 <= pas6)) s2_c = 6;

else if ((s2 > pas6) && (s2 <= pas7)) s2_c = 7; //S2 este total pe linie valoarea procesata este 7

//tot asa pentru restul de senzori care sunt conectati pe ADC

//am folosit metoda asta pentru a procesa 8 cifre nu 1024. era inutil sa se proceseze atat de multe dat fiind faptul ca reflectivitatea difera f putin si oricum exista o mica eroare de citire

if (s3 < pas0) s3_c = 0;

else if ((s3 > pas0) && (s3 <= pas1)) s3_c = 1;

else if ((s3 > pas1) && (s3 <= pas2)) s3_c = 2;

else if ((s3 > pas2) && (s3 <= pas3)) s3_c = 3;

else if ((s3 > pas3) && (s3 <= pas4)) s3_c = 4;

else if ((s3 > pas4) && (s3 <= pas5)) s3_c = 5;

else if ((s3 > pas5) && (s3 <= pas6)) s3_c = 6;

else if ((s3 > pas6) && (s3 <= pas7)) s3_c = 7;

if (s4 < pas0) s4_c = 0;

else if ((s4 > pas0) && (s4 <= pas1)) s4_c = 1;

else if ((s4 > pas1) && (s4 <= pas2)) s4_c = 2;

else if ((s4 > pas2) && (s4 <= pas3)) s4_c = 3;

else if ((s4 > pas3) && (s4 <= pas4)) s4_c = 4;

else if ((s4 > pas4) && (s4 <= pas5)) s4_c = 5;

else if ((s4 > pas5) && (s4 <= pas6)) s4_c = 6;

else if ((s4 > pas6) && (s4 <= pas7)) s4_c = 7;

if (s5 < pas0) s5_c = 0;

else if ((s5 > pas0) && (s5 <= pas1)) s5_c = 1;

else if ((s5 > pas1) && (s5 <= pas2)) s5_c = 2;

else if ((s5 > pas2) && (s5 <= pas3)) s5_c = 3;

else if ((s5 > pas3) && (s5 <= pas4)) s5_c = 4;

else if ((s5 > pas4) && (s5 <= pas5)) s5_c = 5;

else if ((s5 > pas5) && (s5 <= pas6)) s5_c = 6;

else if ((s5 > pas6) && (s5 <= pas7)) s5_c = 7;

if (s6 < pas0) s6_c = 0;

else if ((s6 > pas0) && (s6 <= pas1)) s6_c = 1;

else if ((s6 > pas1) && (s6 <= pas2)) s6_c = 2;

else if ((s6 > pas2) && (s6 <= pas3)) s6_c = 3;

else if ((s6 > pas3) && (s6 <= pas4)) s6_c = 4;

else if ((s6 > pas4) && (s6 <= pas5)) s6_c = 5;

else if ((s6 > pas5) && (s6 <= pas6)) s6_c = 6;

else if ((s6 > pas6) && (s6 <= pas7)) s6_c = 7;

//am construit o variabila linie care in functie de situarea senzorilor pe linie ea sa ne dea o valoare in intervalul [0-50]

line = (s1_c * 1) + (s2_c * 2) + (s3_c * 3) + (s4_c * 4) + (s5_c * 5) + (s6_c * 6);

//am inmultit citirea senzorilor cu 1…6 pentru s1_c…s6_c pentru ca variabila noastra linie sa nu se repete daca senzorul din stanga vede si cel din dreapta nu vede

//scopul acestei variabile este sa ne poata da pozitia exacta pe linie in intervalul [0-50]

line = line * 10;

line = line / (s1_c + s2_c + s3_c + s4_c + s5_c + s6_c);

line = line – 10;

//daca linia nu se afla in dreptul senzorilor atunci variabila linie este egala cu -11

if (line > 0) { //daca senzorii sunt pe linie

if (s1_c + s2_c +s3_c < s4_c + s5_c +s6_c) pos = 2; //si daca valoarea procesata a senzorilor din stanga este mai mare decat cea a senzorilor din dreapta, spunem ca pos = 2, adica linia se afla in partea dreapta

else if (s1_c + s2_c +s3_c > s4_c + s5_c +s6_c) pos = 0; //daca valoarea procesata senzorilor din dreapta este mai mare decat cea a celor din dreapta spunem ca pos = 0, adica linia se afla in partea stanga a senzorilor

else { //altfel este posibil ca linia sa se afle fix in centru (caz f rar intalnit)

pos = 1;

}

//am folosit aceste 3 cazuri pentru ca atunci cand robotul pierde linia sa stim in ce parte ne rotim.

}

}

//functia de urmarit linia

void follow() {

read_sensors_black(); //citim senzorii, implicit aflam unde se afla linia fata de pozitionarea pe senzori

int proportional = line – 25; //variabila proportionala este -25 atunci cand linia se afla in extremitatea stanga, si 25 atunci cand se afla in extremitatea dreapta

int derivative = proportional – last_proportional; //derivata este ultima citire – citirea curenta

last_proportional = proportional; //ultima citire este = citirea curenta

long power_difference = (proportional * kp_val) + (derivative * kd_val); //PD algorithm, power_difference fiind diferenta dintre viteza data pe motorul stanga respectiv drept

if (line != -11) //daca robotul se afla pe linie

{

if (power_difference > max_vel) power_difference = max_vel; //daca viteza data pe motoare ar trebui sa fie mai mare decat viteza maxima acceptata de noi atunci viteza = viteza maxima acceptata

if (power_difference < -max_vel) power_difference = -max_vel; //si invers pt partea stanga

if (power_difference < 0) //daca linia se afla in partea stanga

{

set_motors(max_vel + power_difference, max_vel); //atunci motorul drept se invarte cu viteza maxima, iar cel stanga cu viteza maxima – viteza calculata folosind algoritmul PD

}

else //daca linia se afla in partea dreapta

{

set_motors(max_vel, max_vel – power_difference); //se face invers fata de cazul de mai sus

}

}

else if (line == -11) { //daca robotul nu se afla pe linie se verifica prin ce partea a pierdut linia

if (pos == 2) set_motors (turn_vel, -turn_vel); //daca a pierdut-o prin dreapta, atunci se roteste la dreapta

else if (pos == 0) set_motors (-turn_vel, turn_vel); //daca a pierdut-o prin stanga, atunci se roteste la stanga

else if (pos == 1)

set_motors (max_vel , max_vel); //altfel inseamna ca linia este intrerupta si mergem in fata, metoda folosita pt algoritmul de linefollower enhanced

}

}

/* programul de debug */

void debug() {

lcd.clear(); //stergem tot de pe LCD

read_sensors_black(); //citim senzorii

float bat = analogRead(A6); //voltajul de la baterie este valoarea citita pe pinul analog A6,

//la acest pin este atasat un divizor de tensiune a.i. sa se poata citi un voltaj de maxim 10 volti

float bat_proc = bat/102; //procesam valoarea ADC in Volti

lcd.setCursor(0, 0); //setam cursorul de scriere pe LCD la coloana 0 si randul 0

lcd.print("Vbat"); //scriem Vbat (prescurtare de la voltaj baterie, dat fiind numarul limitat de 16 coloane si 2 randuri)

lcd.setCursor(5, 0); //setam cursorul de la LCD la coloana 6 si si primul rand

lcd.print(bat_proc); // afisam valoarea procesata a ADC-ului pt a ne afisa voltajul bateriei

lcd.setCursor(10,0);

lcd.print("V"); //printam V de la volti

lcd.setCursor(0, 1); //setam cursorul pe primul rand si a2-a coloana

lcd.print("Sens"); //scriem Sens (abreviere de la senzori)

lcd.setCursor(5, 1);

lcd.print(s1_c); //afisam valoarea procesata in partea stanga a celui de al 2-lea rand a primului senzor, cel din stanga

lcd.setCursor(7, 1);

lcd.print(s2_c);

lcd.setCursor(9, 1);

lcd.print(s3_c);

lcd.setCursor(11, 1);

lcd.print(s4_c);

lcd.setCursor(13, 1);

lcd.print(s5_c);

lcd.setCursor(15, 1);

lcd.print(s6_c); //afisam valoarea procesata a senzorului din extremitatea dreapta a robotului

delay(10); //repetam totul la un interval de 10 milisecunde

}

/* program folosit pentru modul de a controla robotul autonom*/

int velocity = 100; //variabila folosita pentru a seta viteza robotului prin bluetooth

void RC_control() {

if (bluetooth.available()) { //daca s-a trimis un caracter prin bluetooth

char text = bluetooth.read(); //variabila text = citirea modulului bluetooth

//Change pin mode only if new BluetoothData is different from previous.

switch (text) {

case 'p': //daca variabila text este 0, atunci iesim dim programul de control prin bluetooth

set_motors(0, 0);

lcd.clear();

delay(50);

BluetoothData = 'p';

break;

case 'w': //daca variabila text = w atunci robotul merge in fata cu viteza stabilita de utilizator (initial 100)

set_motors(velocity , velocity);

break;

case 's': //daca variabila text = s atunci robotul merge in spate …

set_motors(-velocity, -velocity);

break;

case 'a':

set_motors(-velocity, velocity);

//sonar();

break;

case 'd':

set_motors(velocity, -velocity);

break;

case 'x':

set_motors(0, 0);

break;

case 'i':

if(velocity >= 255) velocity =255; //daca viteza este mai mare ca 255 atunci viteza = 255, deoarece daca crestem mai mult viteza = 256 inseamna de fapt PWM = 0

else //daca variabila text = i atunci crestem viteza cu 25

velocity += 25;

bluetooth.println(velocity); //afisam pe bluetooth viteza actuala

break;

case 'j': //daca apasam j scadeam viteza, folsim conditiile de la caracterul i, cu mentiunea ca daca viteza scade sub 50 valoarea PWM inseamna ca robotul se va misca prea incet, aproape deloc

if(velocity <= 50) velocity =50;

else

velocity -= 25;

bluetooth.println(velocity);

break;

}

}

}

void setup() /*–-( SETUP: RUNS ONCE )–-*/

{

Serial.begin(9600); // pornim comunicarea seriala pe pinii TX (pin 1) /RX (pin 0) pins

bluetooth.begin(9600); // pornim comunicarea seriala via bluetooth pe pinii TX (pin 10) /RX (pin 11) pins

//am ales sa am 2 comunicari seriale pentru a avea independenta intre bluetooth si cablu

lcd.begin(16, 2); // initializam displayul pentru 16 randuri 2 coloane

lcd.backlight(); // pornim backlightul la display

lcd.setCursor(0, 0); //setam cursorul la randul 0 coloana 0

lcd.print("Started"); //scriem "Started"

lcd.setCursor(0, 1);

lcd.print("Wait"); //pe urmatoarea coloana scriem "Wait"

delay(1000); //facem acest lucru timp de o secunda

lcd.clear(); //dupa asta stergem totul de pe modulul LCD

}

void loop() /*–-( LOOP: RUNS CONSTANTLY )–-*/

{

lcd.backlight(); //pornim lumina la display

/* Scriem o scurta lista cu comenzile pe care le poate da utilizatorul la inceput */

lcd.setCursor(0,0);

lcd.print("Select Program");

lcd.setCursor(0,1);

lcd.print("d-Dbg,f-Flw,r-RC");

while (bluetooth.available()) { //cat timp se primeste o comanda via Bluetooth

BluetoothData = bluetooth.read(); //BluetoothData este citirea modulului bluetooth

bluetooth.println(BluetoothData); //afisam prin bluetooth ce am trimis

while (BluetoothData == 'd') { //daca s-a apasat pe butonul "d"

lcd.clear(); //se sterge tot de pe display

debug(); //se intra in programul de debug construit mai sus

/* structura adaugata pentru a putea iesi din modul de debug prin trimiterea prin bluetooth a caracterului "p" */

if (bluetooth.available()) { //se verifica daca s-a trimis vreun caracter prin bluetooth

char text = bluetooth.read(); //daca da caracterul respectiv se va pune in variabila text

if (text == 'p') { //daca caracterul respectiv este "p"

lcd.clear(); //se sterge totul de pe display

BluetoothData = 'p'; //BluetoothData va fi "p" astfel incat se va iesi din programul de debug

}

}

}

while (BluetoothData == 'r') { //daca caracterul trimis prin bluetooth este "r"

lcd.clear();

lcd.setCursor(0, 0);

lcd.print("RC_control_mode");

RC_control(); //se intra in modul de control cu ajutorul butoanelor w,a,s,d,x . conditia de a iesi din acest mod este adaugata in functia RC_condrol.

}

while (BluetoothData == 'f') { //daca caracterul trimis prin bluetooth este "f"

lcd.clear();

lcd.setCursor(0, 0);

lcd.print("FOLLOW");

lcd.setBacklight(0); //se stinge displayul

follow(); //se intra in programul de urmarit linia

/* structura adaugata pentru a putea iesi din modul de debug prin trimiterea prin bluetooth a caracterului "p" */

if (bluetooth.available()) { //check for bluetooth

char text = bluetooth.read();

if (text == 'p') {

set_motors(0, 0);

lcd.print("STOPPED");

BluetoothData = 'p';

}

}

}

}

}

Anexa 3 – Robotul în imagini

Similar Posts