Sistem Automat de Bariere Pentru Monitorizarea Accesului In Parcare

Sistem automat de bariere pentru monitorizarea accesului în parcare

Introducere

Aparatele și sistemele controlate cu microprocesor au apărut și s-au perfecționat odată cu apariția pe piață a miroproesoarelor (1970 -1980) după care (în special după 1985) s-au răspândit foarte rapid, înlocuind aproape complet aparatele și sistemele de măsură și control numerice clasice (cu logică cablată),mai ales în controlul automat. Astfel soluțiile automate au ajuns să devină foarte comune în viața de zi cu zi.

În epoca actuală calculatoarele numai sunt doar niște unități izolate ce stau pe birou sau destinate exclusiv laboratoarelor științifice, dimpotrivă aplicațiile ce folosesc sisteme cu microprocesoare s-au extins foarte mult și se regăsesc în accesorii ce le folosim zilnic : telefoanele mobile, controlul automobilului sau electrocasnice din ce în ce mai complexe.

Datorită miniaturizării microprocesoarele de uz general multicip au fost realizate și în

variante monocip, purtând numele de microprocesoare înglobate astfel pot fi integrate în absolut

orice aplicație cu scopul de a înlocui sarcinile efectuate de om ușurând astfel viața și aducând

rezultate superioare.

Generalitati si notiuni teoretice de baza

Microcontrolerul

Un microcontroller este un tip de circuit care integrează un microprocesor și alte dispozitive periferice într-un singur chip punându-se accent pe un cost redus de producție și consum redus de energie electrică. Principala diferența dintre un microcontroller (μC) și un microprocesor (μP) o constituie faptul că un μC integrează memoria de program, memoria de date și alte interfețe de intrare-iesire sau periferice.

Din cauza integrării unui număr mare de periferice și a costului redus de producție,un μC operează la viteze reduse, frecvența sa de ceas fiind de obicei de zeci sau sute de MHz, cu un ordin de mărime mai mică decât cea a unui μP actual. Cu toate acestea, microcontrollerele se pretează la o gamă variată de aplicații fiind folosite atât în mediul industrial cât și în produse de larg consum, de la sisteme din industria aerospațială până la telefoane mobile, cuptoare cu microunde și jucării.

Un sistem embedded poate veni într-un “pachet” foarte diferit față de un calculator obișnuit. De exemplu, acesta poate să nu aibă un display sau o tastatură, intrările și ieșirile fiind simple comutatoare și led-uri. Un astfel de sistem poate avea cerințe minime de performanță sau capacitate de memorie și viteza de execuție. Un microcontroller dintr-un sistem embedded poate să facă o gamă variată de operații, de la controlul unor motoare electrice până la comunicația cu alte device-uri asemănătoare într-o rețea wireless.

Majoritatea μC nu au un bus extern de adrese sau date deoarece toate memoriile de date sunt interne. Acest lucru duce la integrarea acestora în capsule cu un număr mic de pini și reduse ca dimensiuni, ceea ce duce în schimb la micșorarea costurilor de producție.

Cele mai întâlnite structure din circuitul integrat al unui microcontroller sunt următoarele:

Unitatea centrală de procesare (μP core) cu o arhitectură care poate fi pe 8, 16, 32 sau 64 de biți.

Memorie de date volatilă (RAM) sau nevolatila pentru date său program (Flash sau EEPROM)

Porturi digitale de intrare-iesire

Interfețe seriale (RS232, SPI, I2C, CAN, RS485)

Timere, generatoare de PWM sau watchdog

Convertoare analog-digitale

Suport pentru programare și debugging (ISP)

Servomotorul

Servomotoarele sunt mașini electrice speciale de curent continuu, destinate să

convertească semnalul electric, de forma unei tensiuni amplificate venită de la un traductor,

într-o mișcare de rotație a unui arbore.

Din punct de vedere constructiv, servomotoarele cuprind aceleași elemente ca și mașinile

clasice de curent continuu, particularitățile constructive fiind dictate de gabaritele mici,

constantele de timp reduse, gama de viteza impusă etc.

Se disting următoarele tipuri constructive de servomotoare:

cu rotor cilindric cu crestături:

– cu rotor cilindric cu crestături;

– cu rotor disc (întrefier axial);

– cu rotor disc (întrefier axial);

cu rotor cilindric fără crestături:

În ceea ce privește tipul de excitație folosit, exista variantele:

cu excitație electromagnetică (separată, serie);

cu excitație cu magneți permanenți;

cu excitație hibridă (electromagnetică și cu magneți permanenți).

Servomotoarele cu excitație electromagnetică se construiesc, în general, pentru puteri

mari, dar, în ultimul timp, se utilizează, tot mai frecvent, magneții permanenți, datorită unor

avantaje: dimensiuni mai mici, randamente mai bune, probleme de răcire mai simple.

Servomotorul cu rotor cilindric cu crestaturi

Din punct de vedere constructiv se apropie mult de mașinile de curent continuu clasice.

Statorul, cilindric, constituie un jug înconjurat de carcasa, iar înspre interior cuprinde inductorul,

sub forma clasică a polilor de excitație care prezintă înfășurări, respectiv, a magneților

permanenți, iar, înunele cazuri, atât înfășurări cât și magneți permanenți.

Servomotoarele cu excitație electromagnetică se folosesc, în general, la puteri mari.

Circuitul magnetic se realizează din tole și prezintă, la puteri mari, înfășurări de compensație

precum și poli auxiliari. Îmbunătățirea continuă a caracteristicilor magneților permanenți a dus la

înlocuirea treptată a excitațiilor electromagnetice cu excitații cu magneți permanenți chiar și la

puteri mai mari.

Astfel, de-a lungul anilor s-au utilizat: magneți din Alnico, magneți din ferită,

magneți pe bază de pământuri – rare (SmCo5, Sm2Co17, NdFeB). Caracteristicile diferite ale

magneților permanenți au impus și adoptarea unor variante constructive deosebite.

Servomotoarele cu rotor cilindric au, în general, lungimea mult mai mare decât diametrul,

ceea ce face că, spre deosebire de motoarele clasice, să prezinte un moment de inerție mai mic.

Totodată, crestăturile sunt deschise pentru a reduce efectele comutației, iar numărul de spire pe

secția rotorica este redus la minimum (uneori chiar la valoarea w 1 s = ). În același timp,

crestăturile rotorice se înclina pe direcția generatoarei pentru a limita variațiile de reluctanta ale sistemului stator – rotor.

Vitezele de rotație – pentru care se construiesc – variază între 500[râd/s], la

servomotoarele mici cu o pereche de poli și 100[râd/s] la servomotoarele mari având 5 ÷ 6

perechi de poli. Vitezele maxime sunt limitate din considerente mecanice și de comutație.

Valorile tipice ale rezistenței rotorului și ale inductivităților se încadrează în domeniul (0,2 ÷

1,5)[W] și (0,7 ÷ 4)[mH], ceea ce conduce la constante de timp electrice, în general, sub 10 [ms],

mai mari, însa, decât la celelalte servomotoare de curent continuu.

Servomotorul cu rotor disc

Aceste servomotoare sunt realizate prin dispunerea unei înfășurări de tip ondulat pe un

disc de fibre de sticlă, disc care se rotește prin fața unor magneți permanenți plasați axial (figura

1.1).

Figura 1.1 – Servomotor cu rotor disc

Înfășurarea se execută prin stanțare din tabla de cupru (mai rar aluminiu) de 0,2[mm],

înfășurare care, apoi, este lipită cu o rășină epoxidică pe discul amintit. Părțile centrale și

exterioare se îndepărtează printr-o nouă stanțare, conductoarele de pe cele două fete fiind sudate

la capete prin scântei sau fascicol de electroni cu ajutorul unei mașini automate. Colectorul poate

fi constituit din însăși conductoarele plate ale indusului pe care aluneca periile mașinii.

Rezistentele și inductivitățile tipice ale acestor mașini sunt între (0,15 ÷ 1)[W], și

(25 ÷ 75)[mH], ceea ce duce la constante de timp electric sub 0,1[ms].

Deoarece rotorul mașinii nu conține materiale feromagnetice, el este mult mai ușor decât

cel al servomotoarelor cu rotor cilindric, dar acest avantaj nu este reflectat într-un moment de

inerție mai scăzut, deoarece raza lui de girație este mult mai mare (constantele electromecanice

au același ordin de mărime ca la varianta cu rotor cilindric, aproximativ 10[ms]). Există, însa,

alte avantaje:

lipsa înțepenirilor magnetice;

lipsa pierderilor prin histerezis;

lipsa saturației;

posibilitatea de a lucra cu densități mari de curent

randament ridicat (lipsa pierderilor din circuitul de excitație);

comutație mai bună (întrefier mărit).

Pe lângă aceste avantaje, exista o serie de dezavantaje legate de construcția lor particulară:

număr limitat de conductoare pe suprafața discului;

viteza relativ redusă (2000÷3000)[rot/min] (limitată din considerente mecanice și de

pierderile prin curenții turbionari induși în conductoarele plate ale mașinii);

tensiuni de lucru relativ reduse (30÷ 60)[V];

stabilitate la vibrații relativ scăzută;

necesitatea de a utiliza perii de forma lamelara din materiale prețioase

Geometria specială, greutatea lor redusă, fac aceste tipuri de servomotoare ideale pentru

aplicații de joasă putere, la mașini – unelte, la acționarea servovalvelor, în industria chimică și

industria ușoară.

Servomotoare cu rotor pahar

Denumite și motoare cu rotor gol, cos sau coajă și mai recent cu bobina mobilă, sunt

realizate prin dispunerea unei înfășurări de cupru sau aluminiu pe un pahar din fibre de sticlă sau

direct într-o rășină epoxidică (figura 1.2).

Figura 1.2 – Servomotor cu rotor pahar

Diametrul lor este între 30% și 50% din lungime, ceea ce face că, per global, să prezinte

un moment de inerție foarte scăzut, cam 10% din cel al servomotoarelor cilindrice sau cu rotor

disc.

Lipsa materialului feromagnetic din rotor elimina înțepenirile magnetice, pierderile prin

histerezis, fenomenele de saturație, mașina prezentând o construcție simplă și o constantă

electromecanica foarte redusă.

Colectoarele acestor servomotoare sunt realizate din lamele de cupru electrotehnic

presate pe butuci din materiale plastice, lamelele fiind izolate între ele cu mică sau rășini

polimerice.

Periile sunt susținute în portperii de construcție simplă, în formă de tub cu secțiune

interioară dreptunghiulară fixat într-o piesă din material electroizolant prins pe scut.

Servomotoarele cu rotor pahar se utilizează la antrenarea perifericelor calculatoarelor, în

aparatura profesională de redare și înregistrare a sunetelor etc.

Servomotoare cu rotor cilindric fara crestaturi

Prezența crestăturilor rotorice conduce la apariția unor oscilații ale cuplului între două

limite, întrucât, în timp, se modifica reluctanta circuitului magnetic stator – rotor, deci, fluxul

polar, atunci când o crestătură intra sub talpa polară față de cazul când un dinte intra sub talpa

polară.

Aceste oscilații ale cuplului duc la o rotire neuniformă a rotorului, fenomen supărător mai

ales la viteze mici, când se impun domenii largi de reglaj al vitezei, de exemplu 1:40000.

Înfășurările rotorice se plasează la exteriorul rotorului feromagnetic neted (în întrefierul

dintre stator și rotor), fiind înglobate în rășini epoxidice și consolidate cu fibră de sticlă. Aceasta

construcție prezintă un întrefier mărit, deci, în general, gabaritul crește față de mașinile cu rotor

crestat. Prezintă, în schimb, unele performante mai bune în regim tranzitoriu. Constantele de

timp sunt de (2÷4)[ms]. De obicei, se construiesc cu rapoarte mari între lungime și diametru.

Excitația este realizată cu magneți permanenți sau este electromagnetică. Puterile acestor mașini

sunt limitate la aproximativ 3[KW]

Controlul servomotoarelor

Comanda servomotoarelor este realizată prin folosirea canalelor PWM (Pulse-Width

Modulation) ale microcontrolerului ATmega8535.

PWM (Pulse Width Modulation) este o tehnică folosită pentru a varia în mod controlat

tensiunea dată unui dispozitiv electronic. Această metodă schimbă foarte rapid tensiunea

oferită dispozitivului respectiv din ON în OFF și invers. Perioada de timp corespunzătoare

valorii ON dintr-un ciclu ON-OFF se numește factor de umplere (duty cycle).

Figura 1.3 – Semnal PWM cu diferiți factori de umplere

Modularea folosește variația factorului de umplere a unei forme de undă dreptunghiulară

pentru a genera la ieșire o tensiune analogică. Considerând o formă de undă dreptunghiulară

f(t) cu o valoare minimă ymin și o valoare maximă ymax și factorul de umplere D (ca în figură

1.3) valoarea medie a formei de undă e dată de relația:

Multe circuite digitale pot genera semnale PWM. Majoritatea microcontrollerelor oferă

această facilitate, pe care o implementează folosind un numărător care este incrementat periodic

(conectat direct sau indirect la o unitate de ceas) și care este resetat la sfârșitul fiecărei perioade a

PWM-ului. Când valoarea numărătorului este mai mare decât valoarea de referință, ieșirea PWM

(output-ul) trece din starea HIGH în starea LOW (sau invers).

Controlul servomotarelor se realizează prin codificarea, în frecvența purtătoare între 30 și

60 Hz, a lățimii pulsului după cum este prezentat în figura 1.4.

• 1.5 ms – pozitia neutra

• 1 ms – pozitie maxim stanga (dreapta)

• 2 ms – pozitie maxim dreapta (stanga)

Figura 1.4 – Comanda servomotorului prin PWM

Prezentarea temei

Lucrarea urmărește implementarea și integrarea unui sistem automat de bariere pentru monitorizarea și facilitarea accesului într-o parcare parcare inteligenta. Accesul trebuie să se desfășurare în cel mai scurt timp posibil și în cele mai sigure condiții, motiv pentru care un algoritm de sigurata a fost dezvoltat pentru prevenirea daunelor materiale aduse de coborârea barierei.

Obiectivul acestei lucrări îl reprezintă așadar realizarea unui ansamblu format din două bariere, controlate cu ajutorul a două servomotoare, și integrarea acestuia într-un sistem care folosește senzori optici pentru detectarea și contorizarea autovehicolelor. Controlul celor două motoare se realizează prin intermediul unui semnal PWM generat de microcontroler .

Semnalizarea momentului în care accesul în parcare poate fi efectuat cât și disponibilitatea accesului în parcare se realizează prin intermediul unui semafor cu trei poziții (culoarea verde denotă faptul că accesul în parcare poate fi efectuat, culoarea galbenă semnalizează ridicarea sau coborârea barierei, iar culoarea roșie îngrădește accesul în incinta parcării ).

Prezentarea arhitecturii alese

Arhitectura aleasă se bazează pe două servomotoare cu 3 poli, alese datorită

capacității ridicate de control ( poziția rotorului este întotdeauna cunoscută și nu sunt necesare

sisteme complicate pentru determinarea acesteia ) cât și datorită fiabilității excelente data de

faptul că nu exista perii de contact la motor, deci durata de funcționare depinde de rulment.

Pentru controlul celor două servomotoare am ales placă de dezvoltare Arduino UNO alături de

extensia pentru controlul motorului L293D deoarece sistemul este foarte flexibil, mediul de

programare este simplu și ușor de învățat, iar un alt mare avantaj este dat de faptul că atât

placa de dezvoltare cât și mediul de programare sunt „open source”.

Figura 1.5 – Schema bloc a sistemului

Dezvoltarea sistemului

Un sistem cu calculator înglobat (embedded system) este un sistem pe bază de microprocesor construit pentru a controla anumite funcții particulare și care nu este construit pentru a fi programat de utilizatorul final, cum este la PC. Acesta este integrat ca parte a unui dispozitiv complet, de multe ori, inclusiv de hardware și părți mecanice. Prin contrast, un calculator de uz general, cum ar fi un computer personal (PC), este conceput pentru a fi flexibil și pentru a satisface o gamă largă de utilizatori.

Sistemul de control în cazul de față este alcătuit din ansamblul format de placă de dezvoltare Arduino Uno și extensia pentru controlul motoarelor Arduino Motor Driver L293D.

Pentru mișcarea celor două bariere prezente la intrarea și ieșirea din parcare am apelat la refolosirea a două servomotoare. Acestea sunt capabile să execute mișcări de rotație de precizie foarte ridicată (până la un grad), iar dimensiunea mică le recomanda folosirea în aplicații de sarcina redusă precum este și cazul de fată. Comanda motoarelor se face prin folosirea generatorului de semnla PWM mai precis pinul 9 și pinul 10 digital.

Platforma de dezvoltare Arduino UNO

Arduino UNO  este este o placă de dezvoltare bazată pe microcontrolerul ATmega328, ce permite dezvoltarea diferitelor aplicații de comandă și control în modul „open source”. Varianta UNO a plăcii consta într-o platformă de mici dimensiuni (6.8 cm / 5.3 cm) construită în jurul unui procesor de semnal, iar prin intermediul celor 14 intrări/ieșiri digitale și 6 intrări analogice are capacitatea de a prelua date din mediul înconjurător printr-o serie de senzori ce pot fi atașați și de a efectua acțiuni asupra mediului prin intermediul semnalelor luminoase, controlul motoarelor, servomotoare, și alte tipuri de dispozitive de ieșire.

Conexiunea la computer se realizează prin intermediul unui cablu USB, acesta asigurând totodată și alimentarea plăcii și a perifericelor, iar codul este scris într-un limbaj de programare foarte similar cu limbajul C++.

Figura 2.1 – Placa de dezvoltare Arduino UNO

Specificații tehnice ale plăcii de dezvoltare Arduino UNO

Tabelul 2.1 – Specificații tehnice Arduino UNO

Caracteristici generale

Microcontrollerul

Atmega328 este un microcontroller performant ce are la baza o arhitectura de tip RISC

(Reduced Instruction Set Computer – set redus de instructiuni). Capacitatea memoriei Flash este de 32 KB, EEPROM: 1 KB si SRAM: 2 KB. Microcontrollerul poate comunica cu mediul exterior prin intermediul a 28 de pini digitali de intrare/iesire, este echipat cu 3 timere, un sistem de intreruperi interne si externe, port de programare USART, convertor analog-digital si diverse interfete seriale (I2C, SPI, USART, PWM).

Tabelul 2.2 – Specificații tehnice Atmega328

Microcontrllerul ATmega328 (figura 2.2) este frecvent utilizat în proiecte și sisteme autonome datorită arhitecuturii simple, de consumului redus și a costului scăzut.

Figura 2.2 – Microcontroller Atmega328

Schema de configurare a pinilor microcontrllerul ATmega328 cât și funcția atribuită în cadrul plăcii de dezvoltare Arduino UNA este prezentată mai jos (figura 2.3).

Figura 2.3 – Schema de configurare a pinilor Atmega328

Configurația pinilor

Modelul UNO dispune de 6 intrări analogice capabile să măsoare valori cuprinse între 0 – 5 V, notate A0 – A5, fiecare dintre ele oferind rezoluție pe 10 biți. Sistemul gândit inițial necesita un număr insuficient de ieșiri digitale în dezvoltarea aplicației o parte din intrările analogice au fost configurate astfel încât să funcționeze precum un pin GPIO, doi dintre acești pini (A4 și A5) sunt rezervați pentru afișajul de tip LCD, alți doi (A1 și A2) pentru achiziționarea semnalului de la cei doi senzori optici, iar pinul analogic A0 este folosit pentri achiziționarea semnalului generat de senzorul pentru măsurarea temperaturii.

Fiecare dintre cei 14 pini digitali pot fi folosiți ca și pini de intrare sau pini de ieșire folosind funcțiile : pinMode(), digitalWrite(), digitalRead(). Tensiune de operare este de 5 V, fiecare pin poate primi sau trimite maximum 40 mA și au incluși rezistențe de PULL-UP intre 20-50 Kohmi .

Aplicația dezvoltată folosește 2 dintre cei 14 pini digitali ( pinii 9 și 10 ) pentru generarea semnalului PWM de comandă a celor două servomotoare ce determina închiderea și deschiderea celor două bariere. Pentru controlul semaforului folosit la semnalizarea momentului în care accesul în parcare poate fi efectuat cât și disponibilitatea accesului în parcare sunt folosiți pinii digitali 0, 1 și 2 configurați că pini de ieșire ( pinMode(pin number, OUTPUT);). În figură 2.4 este prezentată o schemă a configurație pinilor folosiți în aplicația de control al barierelor și semnalizare.

Figura 2.4 – Configurația pinilor folosiți

Capacitatea memoriei

Microcontrolerul Atmega328 regăsit pe placa Arduino UNO și prezentat mai sus dispune de o memorie Flash de capacitate 32 Kb ( din care 0,5 Kb sunt indisponibili datorită “bootloader-ului”), capacitate mai mult decât suficientă pentru aplicația dezvoltată care ocupa 2312 Kb.

Alimentarea

Placa de dezvoltare Arduino poate fi alimentata fie prin intermediul conexiunii USB sau de la sursă de alimentare externă. Sursa de alimentare este selectata automat.

Arduino poate funcționa folosind o sursă externă de 6 la 20 de volți, dar dacă valoarea tensiunii utilizate este mai mare de 12V, regulatorul de tensiune se poate supraîncălzi și deteriora placă. Pentru a evita acest efect negativ asupra sistemului dezvoltat am ales ca sursa de alimentare externă un adaptor AC-DC (12 V / 1,5 A) conectat la placă de alimentare prin inserarea unei mufe de 2.1 mm.

Programarea

Arduino Uno poate fi programat cu software-ul Arduino IDE care poate fi descărcat gratis de pe site-ul producătorului. MicrocontrolerulATmega328 de pe Arduino Uno vine cu un bootloader care vă permite să încărcați cod nou fără utilizarea unui programator de hardware extern. Acesta comunică folosind protocolul inițial STK500 .

Extensia pentru motor L293D

Extensia pentru controlul motorului Arduino Motor Shield ( figura 2.5) permite controlul a

două servomotoare prin intermediul semnalului PWM generat.

Figura 2.5 – Arduino Motor Shield L293D

Specificatiile tehnice ale extensiei Arduino Motor Shiled L293D sunt redate in tabelul de mai jos.

Tabelul 2.3 – Specificatiile tehnice ale extensiei Arduino Motor Shiled L293D

Arduino Motor Shield L293D permite comandă a două servomotoare prin doi dintre cei

14 pini digitali ( pinii 9 și 10 ) care sunt capabili să genereze semnale PWM.

Atașarea celor două servomotoare se face foarte simplu prin concetarea directă la cei trei

pini dedicați, dintre care doi dintre aceștia au funcție de alimentare, iar cel de al treilea pin are

funcție de control.

Schema de conectare a extensiei Motor Shield L293D la placă de dezvoltare Arduino

UNO este prezentată în figură 2.6.

Figura 2.6 – Schema de conectare a extensiei la placa de dezvoltare Arduino

Semaforul

Semnalizarea momentului în care accesul în parcare poate fi efectuat cât și disponibilitatea accesului în parcare se realizează prin intermediul unui semafor (figura 2.7) cu trei poziții (culoarea verde denotă faptul că accesul în parcare poate fi efectuat, culoarea galbenă semnalizează ridicarea si coborarea barierei de la intrare, iar culoarea roșie îngrădește accesul în incinta parcării ).

Figura 2.7 – Semafor cu 3 pozitii

Pentru crearea semaforului am folosit trei led-uri de culori diferite (roșu, galben și verde) care prezintă eficiență maximă când sunt alimentate cu un curent de 20 mĂ. Pentru alegerea celor 3 rezistente de limitare a curentului am ținut cont de tensiunea care alimentează cele 3 led-uri (Vf = 5 V), iar conform formulei de mai jos valoarea optimă a rezistenței este de 150 ohmi. Schema circuitului folosit la crearea semaforului este prezentată în figură 2.10.

R=(Vf-Vd)/Id , unde Id = 20mA, Vf = 5V, iar caderea de tensiune Vd = 2V.

R = (5 V -2 V)/20 mA = 150 Ω

Figura 2.8 – Schema electrica a semaforului

Pentru controlul semaforului folosit la semnalizarea momentului în care accesul în

parcare poate fi efectuat cât și disponibilitatea accesului în parcare sunt folosiți pinii digitali 0, 1 îs 2 (setați pe funcția de GPIO) configurați că pini de ieșire ( pinMode(pin number,

OUTPUT);). În figură 2.9 este prezentată o schemă a configurație pinilor folosiți în aplicația de

semnalizare.

Figura 2.9 – Configurația pinilor folosiți pentru controlul semaforului

Servomotoarele barierelor

Un servomecanism standard compact, robust, care oferă înalta rezistenta la vibrații și viață îndelungată este modelul S3003 produs de Futaba (figura 2.10). Acesta permite efectuarea mișcărilor de rotație între 0 și 180 de grade la înalta precizie.

Figura 2.10 – Servomotor Futaba S3003

Este unul dintre cele mai utilizate modele de servomotor și prezintă următoarele specificații prezentate în tabelul de mai jos.

Tabelul 2.4 – Specificațiile tehnice ale servomotorului Futaba S3003

Codul

Arduino IDE

Placa de dezvoltare Arduino UNO este insotita si de un soft propriu, ce se bazeaza pe “Wiring”, o platforma de calcul fizic similara, care se bazeaza pe mediul de programare de procesare multimedia si este foarte similar limbajului C++, cu ajutorul căruia se realizeaza programa dispozitivului. Softul de programare denumit Arduino IDE (Integrated Development Environment ) se poate descarca gratuit si dispune de o interfata foarte „prietenoasa” care contine urmatoarele ferestre pentru interactiunea cu utilizatorul.

Bara de comanda a aplicației : Verificare, Stop, Fișier Nou, Salvare, Uploadare, Monitorizare Seriala

Monitorizarea Seriala : Reprezintă o funcție foarte utila pentru a putea vedea toate datele ce sunt trimise sau primite, fiind un mod foarte bun de a verifica funcționabilitatea programului cat si eventualele erori apărute.

Butonul de Uploadare a codului : Se folosește pentru a încărca codul realizat pe microcontroler.

Fereastra de scriere : Asemănătoare altor moduri de programare fereastra de scriere oferă posibilitatea de a aranja codul după placul fiecăruia oferind un suport de identificare a comenzilor cunoscute.

Fereastra de verificare sau de informare : Afișează statusul comenzilor date, prezentarea eventualelor erori sau informații de legate de program

Figura 2.11 – Prezentarea software-lui Arduino IDE

Ca și aplicabilitate software-ul este suportat de toate sistemele de operare (Windows, Linux și Mac).

Mediul de programare conține numeroase librării(fișiere cu extensia „h”) care includ funcții predefinite, fapt ce ușurează foarte mult dezvoltarea aplicației. Acestea sunt disponibile pe site-ul oficial.

Prezentarea codului

Codul creeat are ca scop detectarea mașinilor, monitorizarea locurilor de parcare, ridicarea barierelor regaiste la intrarea și ieșirea din parcare cât și semnalizarea momentului când se poate efectu accesul în parcare.

Pentru a ușura cât mai mult ulterioare îmbunătățiri aduse codului acesta a fost structurat având la baza funcții dedicate fiecărei acțiuni. O parte din acestea ( cele folosite la ridicare/coborârea barierelor, semnalizare) vor fi prezentate în continuare.

Semnalizarea momentului cand accesul in prcare poate fi efectuat (semaforul)

Pentru controlul semaforului folosit la semnalizarea momentului în care accesul în

parcare poate fi efectuat cât și disponibilitatea accesului în parcare sunt folosiți pinii digitali 0,1

si 2. Inițializarea celor trei pini se face în interiorul funcție void_setuputilizând funcția

pinMode(numărul pinului, INPUT/OUTPUT).

void setup()

{

  pinMode(0,OUTPUT); // Semafor galben

  pinMode(1,OUTPUT); // Semafor rosu

  pinMode(2,OUTPUT); // Semafor verde

}

Aprinderea celor trei leduri se face prin apelarea funcție void_semafor, care

comanda prin digitalWrite(numărul pinului, LOW/HIGH), unde parametrul LOW are ca acțiune

stingerea ledului iar HIGH duce la aprinderea acestuia, aprinderea unui sigur led. Deoarece

semaforul poate avea o sigură poziție aprinsă la un moment dat la începutul funcției

void_semafor se execută stingerea celor 3 poziții. Stabilirea ledului asupra căruia se execută

acțiunea se realizează prin intermediul parametrului culoare, de tip int, iar în acest scop au fost

declarate 3 variabile globale ce sunt folosite ca parametru.

int rosu=1; // semafor rosu

int galben=2; // semafor galben

int verde=3; // semafor verde

Parametrul culoare este interogat în funcția switch care are 4 cazuri posibile (aprinde

ledul roșu, aprinde ledul galben, aprinde ledul verde sau default caz în care toate ledurile sunt

stinse). Așadar aprinderea unei anumite poziții a semaforului se face prin apelarea funcției

void_semafor cu parametrul roșu, galben sau verde. Apelarea se face în

interiorul funcției void_închide_bariera sau void_deschide_bariera după cum urmează

.

semafor (rosu/galben/verde);

Corpul funcției void_semafor este prezentat în continuare:

void semafor(int culoare) // aprinde/stinge semaforul regasit la intrarea in parcare

{

digitalWrite(A1,LOW); digitalWrite(A2,LOW); digitalWrite(A3,LOW); // stinge toate culorile

switch(culoare)

{

case 1: // rosu

digitalWrite(A1,HIGH); // aprinde semaforul rosu

break;

case 2: // galben

digitalWrite(A2,HIGH); // aprinde semaforul galben

break;

case 3: // verde

digitalWrite(A3,HIGH); // aprinde semaforul verde

break;

default:

digitalWrite(A1,LOW); digitalWrite(A2,LOW); digitalWrite(A3,LOW); // stinge toate culorile

break;

}

}

Controlul servomotoarelor ce actioneaza inchiderea/deschidere barierelor

Pentru mișcarea celor două bariere prezente la intrarea și ieșirea din parcare am apelat la refolosirea a două motoare pas cu pas bipolare regăsite în arhitectura unităților optice pentru citirea discurilor. Pentru controlul motoarelor este necesară includerea unei biblioteci special creeate în acest scop, AFMotor.h.

#include <Servo.h> // biblioteca ce contine functiile necesare comenzii servomotoarelor

Aceasta conține următoarele funcții:

servo.Attach(pin);

servo.Attach(pin,min,max);

Descriere: Atașează un motor de tip servo unui pin. De remarca faptul că librăria Servo suporta atașarea pentru doar două servomotoare pe pinii 9 și 10.

Parametrii:

servo – variabilă de tip servo (se declară la început Servo nume)

pin – numărul pinului la care este atașat motorul

min – lățimea pulsului, în microsecunde, corespunzătoare valorii minime (0 grade) unghiulare a servomotorului (544 valoare nominală)

max – lățimea pulsului, în microsecunde, corespunzătoare valorii maximă (180 grade) unghiulare a servomotorului (2400 valoare nominală)

servo.Detach(pin);

Descriere: Detașează un motor de tip servo de la pinul de control. După detaseara pinului acesta poate fi folosit în alte scopuri.

Parametrii:

servo – variabilă de tip servo (se declară la început Servo nume)

servo.Attached(pin);

Descriere: Verifica dacă servomotorul este atașat la pin.

Parametrii:

servo – variabilă de tip servo (se declară la început Servo nume)

servo.Write(angle);

Descriere: Trimite o valoare către servomotor, rezultând în mișcarea axului. Pentru servomotoarele standard variabilă „angle” corespunde poziției axului în grade, determinând mișcarea acestuia la valoarea dorită. În cazul servomotoarelor ce permit rotație continua variabilă angle desemnează viteza de rotație (0 viteză maximă într-o direcție, 90 staționare și 180 viteză maximă în direcția opusă).

Parametrii:

servo – variabilă de tip servo (se declară la început Servo nume)

angle – valoarea dorită a axului (de la 0 la 180)

servo.WriteMicroseconds(uȘ);

Descriere: Trimite o valoare către servomotor, rezultând în mișcarea axului. Pentru servomotoarele standard variabilă „uȘ” corespunde poziției axului în grade, determinând mișcarea acestuia la valoarea dorită( 1000 poziționează axul la 0 grade, 1500 poziționează axul la 90 de grade și 2000 pozitioneza axul la 180 de grade).

Parametrii:

servo – variabilă de tip servo (se declară la început Servo nume)

uȘ – valoarea dorită a axului (de la 0 la 2000)

servo.Read();

Descriere: Citește valoarea curentă a poziției axului.

Parametrii:

servo – variabilă de tip servo (se declară la început Servo nume)

Deoarece sistemul folosește două servomotoare acestea au fost declarate la începutul

aplciatiei iar viteza de rotație configurată în funcția void_setup. Deoarece aplicația

presupune coborârea în siguranță a barierei viteza de închidere este mai mică decât cea pentru

ridicarea barierei, iar după fiecare pas efectuat în timpul coborârii se verifică valoarea senzorului

optic. În cazul în care „tinta” reapare în raza senzorului mișcarea de coborâre este întreruptă,

bariera se deschide (la unghiul de 90 de grade), și se așteaptă atât timp cât senzorul detectează

„ținta”.

Ridicarea și coborârea barierelor se realizează prin apelarea funcțiilor

void_închide_barieră(intrare/ieșire) și void_deschide_barieră(intrare/ieșire). Parametrul

intrare/ieșire desemnează bariera asupra căreia se efectuează acțiunea și este definit prin

intermediul a doua variabile globale.

int intrare = 2; // variabila pentru memorarea barierei de intrare

int iesire = 1; // variabila pentru memorarea barierei de iesire

int bariera_intrare_deschisa = 0; // flag folosit pentru determinarea starii barierei de intrare

int bariera_iesire_deschisa = 0; // flag folosit pentru determinarea starii barierei de iesire

int pos; // variabila pentru memorarea pozitiei unghiulare a axului servomotorului

Servo motor_intrare; // declara variabila de tip servo pentru servomorul de la intrare in parcare

Servo motor_iesire; // declara variabila de tip servo pentru servomorul de la iesire din parcare

void setup()

{

motor_intrare.attach(10); // ataseaza motor intrare la pinul 10

motor_iesire.attach(9); // ataseaza motor iesire la pinul 9

}

void inchide_bariera(int bariera)

{

if(bariera == 2) // inchide bariera regasita la intrarea in parcare

{

semafor(galben); // semnalizeaza prin semaforul galben inchiderea barierei

// cod adaugat de Pintilie Andrei

// __________________________________________________________________________

lcd.clear(); // sterge afiseajul LCD

lcd.setCursor(0, 0); // muta pe linia 1 a LCD-ului

lcd.print("Se coboara bariera!"); // afiseaza mesaj pe prima linie a LCD-ului

lcd.setCursor(0, 2); // muta pe linia 2 a LCD-ului

lcd.print("Va rugam asteptati!"); // afiseaza mesaj pe linia 2 a LCD-ului

// __________________________________________________________________________

for(pos = 90; pos >= 10; pos -= 1) // actioneaza servomotorul regasit la intrare de la 90 de grade la 170 grade (pozitia orizontala a barierei)

{

// cod adaugat de Pintilie Andrei

// _________________________________________________________________________

S1=digitalRead(2); // citeste senzorul de intrare

// _________________________________________________________________________

if(S1==1) // daca tinta reapare in momentul coborarii

{

motor_intrare.write(90); // ridica bariera

delay(100); // asteapta 100 ms

pos =90; // pos are valoarea 90 (bariera ridicata)

}

else

{

motor_intrare.write(pos); // actioneaza servomotorul la pozitia indicata de variabila

'pos'

delay(150); // asteapta 150 ms pentru efectuara miscarii

if(pos == 10)

bariera_intrare_deschisa = 0; // daca coborarea barierei s-a terminat seteaza flag

}

}

if(L!=0) // in cazul in care parcarea este plina nu aprinde verde

semafor(verde);

}

if(bariera == 1) // inchide bariera regasita la iesirea din parcare

{

for(pos = 90; pos <= 170; pos += 2) // actioneaza servomotorul regasit la iesire de la 90 de grade la 170 grade (pozitia orizontala a barierei)

{

// cod adaugat de Pintilie Andrei

// _________________________________________________________________________

S2=digitalRead(13); // citeste senzorul de intrare

// _________________________________________________________________________

if(S2==1) // daca tinta reapare in momentul coborarii

{

motor_iesire.write(90); // ridica bariera

delay(100); // asteapta 100 ms

pos =90; // pos are valoarea 90 (bariera ridicata)

}

else

{

motor_iesire.write(pos); // actioneaza servomotorul la pozitia indicata de variabila

'pos'

delay(150); // asteapta 150 ms pentru efectuara miscarii

if(pos == 10)

bariera_iesire_deschisa = 0; // daca coborarea barierei s-a terminat seteaza flag

}

}

}

}

void deschide_bariera(int bariera)

{

if(bariera == 2) // deschide bariera regasita la intrarea in parcare

{

semafor(galben); // semnalizeaza prin semaforul galben deschiderea barierei

// cod adaugat de Pintilie Andrei

// __________________________________________________________________________

lcd.clear(); // sterge afiseajul LCD

lcd.setCursor(0, 0); // muta pe linia 1 a LCD-ului

lcd.print("Se ridica bariera!"); // afiseaza mesaj pe prima linie a LCD-ului

lcd.setCursor(0, 2); // muta pe linia 2 a LCD-ului

lcd.print("Va rugam asteptati!"); // afiseaza mesaj pe linia 2 a LCD-ului

// __________________________________________________________________________

for(pos = 10; pos <= 90; pos += 1) // actioneaza servomotorul regasit la intrare de la 10 de

grade la 90 grade (pozitia verticala a barierei)

{

motor_intrare.write(pos); // ridica bariera cu un gtrad

delay(50); // asteapta 50 ms

bariera_intrare_deschisa = 1; // seteaza flag pentru indicarea pozitiei barieriei

}

semafor(verde); // semnalizeaza prin semaforul verde finalizarea operatiuni pentru

deschiderea barierei de intrare

}

if(bariera == 1) // deschide bariera regasita la iesirea din parcare

{

for(pos = 170; pos >= 90; pos -= 1) // actioneaza servomotorul regasit la iesire de la 170

de grade la 90 grade (pozitia verticala a barierei)

{

motor_iesire.write(pos); // ridica bariera cu un grad

delay(50); // asteapta 50 ms

bariera_iesire_deschisa = 1; // seteaza flag pentru indicarea pozitiei barieriei

} }}

Functia main

void loop()

{

// cod adaugat de Pintilie Andrei

// __________________________________________________________________________

S1=digitalRead(2); // citeste senzorul regasit la intrarea in parcare

S2=digitalRead(13); // citeste senzorul regasit la iesire din parcare

// __________________________________________________________________________

// porneste sistemul cu bariera inchisa

if((motor_intrare.read() != 10 || motor_iesire .read() != 10) && flag_start ==1 ) // daca bariera de la intrare/iesire nu este "inchisa" (pozitie orizontala) si inca nu s-a realizat initalizarea pozitie

{

motor_intrare.write(10); // actioneaza servomotorul regasit la intrare la 10 de grade (pozitia

orizontala a barierei)

motor_iesire.write(170); // actioneaza servomotorul regasit la iesire la 170 de grade (pozitia

orizontala a barierei)

flag_start = 0; // marcheaza prin flag ca initializarea barierelor a fost realizata

}

if(L==0 && bariera_intrare_deschisa == 0 && flag_lcd) // daca nu mai sunt locuri disponibile si bariera de la intrare este inchisa si afisarea nu a fost facuta

{

semafor(rosu); // semnalizeaza prin semaforul rosu faptul ca nu sunt locuri disponibile

deschide_bariera(iesire); // deschide bariera regasita la intrarea in parcare

// cod adaugat de Pintilie Andrei

// _________________________________________________________________________

// afiseaza mesajul: "Parcare este plina!"

// "Va rugam asteptati eliberarea unui loc!"

lcd.clear(); // sterge afiseajul LCD

lcd.setCursor(0, 0); // muta pe linia 1 a LCD-ului

lcd.print("Parcarea este plina!"); // afiseaza mesaj pe prima linie a LCD-ului

lcd.setCursor(0, 2); // muta pe linia 2 a LCD-ului

lcd.print("Va rugam asteptati"); // afiseaza mesaj pe a doua linie a LCD-ului

lcd.setCursor(0, 3); // muta pe linia 3 a LCD-ului

lcd.print("eliberarea unui loc!"); // afiseaza mesaj pe a treia linie a LCD-ului

flag_lcd=0; // semnalizeaza prin flag efectuarea operatiunii de afisare a

mesajului "parcare plina"

// _________________________________________________________________________

}

else

if(flag_lcd ==0) // daca afisarea pentru “parcare plina” nu a fost facuta

semafor(verde); // semnalizeaza prin semaforul verde faptul ca sunt locuri disponibile

// intrare in parcare

if(S1==1 && bariera_intrare_deschisa==0 && L!=0) // daca o masina a fost detectata de

senzorul de intrare si bariera nu este

deschisa si exista locuri disponibile

{

deschide_bariera(intrare); // deschide bariera regasita la intrare

L=L-1; // decrementeaza numarul de locuri din parcare

bariera_intrare_deschisa = 1; // seteaza prin flag pozitia barierei de intrare

// cod adaugat de Pintilie Andrei

// ________________________________________________________________________

// afiseaza mesajul: "Bine ati venit!"

// "Locuri libere: numar locuri libere actualizat / 8"

lcd.clear(); // sterge afiseajul LCD

lcd.print("Bine ati venit !"); // afiseaza mesaj pe prima linie a LCD-ului

lcd.setCursor(0, 2); // muta pe linia 2 a LCD-ului

lcd.print("Locuri libere:"); lcd.print(L);lcd.print("/");lcd.print(8); // afiseaza numar de

locuri disponibile

//_________________________________________________________________________

}

if(S1==0 && bariera_intrare_deschisa==1) // daca masina nu mai este detectata de senzorul

de intrare si bariera este deschisa

{

delay(1000); // asteapta o secunda

inchide_bariera(intrare); // inchide bariera regasita la intrare

bariera_intrare_deschisa = 0; // seteaza prin flag pozitia barierei de intrare

}

// iesire in parcare

if(S2==1 && bariera_iesire_deschisa==0) // daca o masina a fost detectata de senzorul de

iesire si bariera nu este deschisa

{

deschide_bariera(iesire); // deschide bariera regasita la iesire

L=L+1; // incrementeaza numarul de locuri

bariera_iesire_deschisa = 1; // seteaza prin flag pozitia barierei de iesire

flag_lcd=1; // reseteaza flag efectuarea operatiunii de afisare a mesajului

"parcare plina"

// cod adaugat de Pintilie Andrei

// ________________________________________________________________________

// afiseaza mesajul: "Bine ati venit!"

// "Locuri libere: numar locuri libere actualizat / 8"

lcd.clear(); // sterge afiseajul LCD

lcd.print("Bine ati venit !"); // afiseaza mesaj pe prima linie a LCD-ului

lcd.setCursor(0, 2); // muta pe linia 2 a LCD-ului

lcd.print("Locuri libere:"); lcd.print(L);lcd.print("/");lcd.print(8); // afiseaza numar de

locuri disponibile

// _________________________________________________________________________

}

if(S2==0 && bariera_iesire_deschisa==1) // daca masina nu mai este detectata de senzorul de

iesire si bariera este deschisa

{

delay(1000); // asteapta o secunda

inchide_bariera(iesire); // inchide bariera regasita la iesire

bariera_iesire_deschisa = 0; // seteaza prin flag pozitia barierei de iesire

}

}

Simularea standului

Simularea standului se face in mediul Proteus ISIS

TBD

Prezentarea standului

Lucrarea urmărește implementarea și integrarea unui sistem automat de bariere pentru

monitorizarea și facilitarea accesului într-o parcare parcare inteligenta. Pentru detectarea

mașinilor și inițializarea procedurii de deschidere a barierelor se folosesc doi senzori optici

(figura 5.1) regăsiți la intrare și ieșire.

Figura 5.1 – Senzor optic

După detectarea unei mașini la intrarea sa ieșirea din parcare se inițializează procedura pentru deschiderea barierei (figura 5.2) prin acționarea servomotorului din poziția orizontală (10 grade pentru motorul regăsit la intrare și 170 pentru motorul regăsit la ieșire) spre poziția vertiala ( 90 de grade) concomitent cu semnalizarea a acestei operațiuni prin culoare galbenă ( doar pentru bariera de intrare în parcare) și afișarea mesajului „Se ridică barieră ! Vă rugăm așteptați !” pe display. După executarea secvenței pentru deschiderea barierei semaforul indica prin aprinderea poziției verde ( doar pentru bariera de intrare în parcare) faptul că accesul se poate efectua.

Figura 5.2 – Secvența pentru deschiderea barierei

La o secundă după ieșirea din raza de acțiune a senzorului se inițializează operațiunea de

coborâre a barierei semnalizata și de această dată prin culoarea galbenă a semaforului ( doar

pentru bariera de intrare în parcare) și afișarea mesajului „Se coboară barieră ! Vă rugăm

așteptați !” pe display.

Figura 5.3 – Secvența pentru închiderea barierei

Deoarece accesul și ieșirea din parcare trebuie să se desfășurare în cel mai scurt timp posibil și în cele mai sigure condiții, un algoritm de sigurata a fost dezvoltat pentru prevenirea daunelor materiale aduse de coborârea barierelor. În primul rând viteza de coborâre a barierelor este mai mică decât viteza de ridicare a acestora, iar pe parcursul operațiunii este verificată constantă starea senzorului aferent barierei pentru care se desfășoară mișcarea. În eventualitatea în care „ținta” este detectată dinou coborârea barierei este întreruptă, se revine în poziția verticală, urmând ca operațiunea să fie reluată în dată ce „ținta” a dispăruți din raza de acțiunea a senzorului.

Sistemul presupune de asemenea atentă monitorizare a numărului actual de locuri disponibile în orice moment. Afișarea mesajului „Bine ați venit ! Locuri libere: X/8” se face pe după de fiecarea dată după încheierea operațiunii de ieșire din parcare.

În eventualitatea în care parcarea este plină accesul devine limitat (bariera de la intrare nu mai este acționată chiar dacă este detectată o țintă) concomitent cu semnalizarea prin poziția roșie a senaforului alătur de afiseara pe LCD a mesajului: „Parcarea este plină! Va rungam așteptați eliberarea unui loc!”. În figură 5.4 este prezentat scenariul descris înainte.

Figura 5.4 – Scenariul pentru parcare plină

Intrarea în parcare poate fi efectuată doar după ce un loc a fost eliberat ( bariera de la ieșire a fost deschisă iar numărul de locuri libere incrementat).

Întreg ansamblul și componentele acestuia sunt regăsite în figură 5.5

Figura 5.5 – Prezentarea componentelor sistemului realizat

Senzor intrare;.

Senzor ieșire;

Display LCD 16×4;

Bariera de intrare;

Bariera de ieșire;

Semafor;

BIBLIOGRAFIE

Laurean Bogdan – Constructia si functionarea motoarelor de curent continuu, Cursuri si materiale explciative, 2014;

Laurean Bogdan – Senzori si traductoare introducere, Cursuri si materiale explciative, 2014;

Toma L. – Sisteme de achizitie si prelucrare numerica a semnalelor, Editura de Vest, Timisoara, 1997;

Data Sheet Arduino http://www.arduino.cc

Data Sheet L293D http://www.ti.com/lit/ds/symlink/l293.pdf

Driver-ul pentru motor L293D http://learn.adafruit.com/downloads/pdf/adafruit-motor-shield.pdf

BIBLIOGRAFIE

Laurean Bogdan – Constructia si functionarea motoarelor de curent continuu, Cursuri si materiale explciative, 2014;

Laurean Bogdan – Senzori si traductoare introducere, Cursuri si materiale explciative, 2014;

Toma L. – Sisteme de achizitie si prelucrare numerica a semnalelor, Editura de Vest, Timisoara, 1997;

Data Sheet Arduino http://www.arduino.cc

Data Sheet L293D http://www.ti.com/lit/ds/symlink/l293.pdf

Driver-ul pentru motor L293D http://learn.adafruit.com/downloads/pdf/adafruit-motor-shield.pdf

Similar Posts