Realizarea Benzi Rulante cu Microcontrollerul Pic16f887

Realizarea benzi rulante cu microcontrollerul PIC16F887

Obiectiv

1. Descrierea functionalitatii pe module a platformei

2. Utilitatea micro-robotilor

2.1 Inteligență, autonomie și control

2.3 Materiale folosite în structura corpului la construcția roboților

2.4 Proiectarea hardware generală a robotului

3. Sistemele senzoriale

4. Motoarele de current continuu utilizate

5. Criterii pentru alegerea unui microcontroller

5.1 Dispozitive I/O

5.2 Module Timer

5.3 Pinul MCLR/Vpp

6. Convertoarele ADC

7. Dispozitive de actionare

8. Modulul de comunicatie wireless Bluetooth

9. Programarea memoriei microcontrolerului PIC16F887A

10. LCD-ul alfanumeric 16×2 caractere

11. Schema electronica generala

12. Senzorul de distanta in IR

13. Microswitch-urile pentru comenzile de START si STOP

14. Intreruperile pe TIMER1

15. Descrierea software a sistemului (MIKROC)

16. Descrierea functionalitatii software

17. CALCULUL FIABILITATII

18. CODUL SURSA C- mediu de dezvoltare MIKROC

Bibliografie

Obiectiv

Proiectul de fata a fost realizat cu scopul de a implementa un sistem electronic cu microcontroller si senzori analogici-digitali care sa fie capabil sa detecteze si sa faca selectia obiectelor rulate pe o banda de transmisie in functie de marime si culoare. Platforma robotica are la baza microcontrollerul pe 8 biti PIC16F887 ce functioneaza la tensiunea de 5V si care reprezinta principalul procesor analog-digital de semnale al sistemului. Afisarea datelor de interes se realizeaza pe un LCD alfanumeric de 16×2 caractere si un protocol de comunicare cu microcontroller-ul de 11bit (8bit de date + 3bit control) .

In cazul de fata ,sistemul electronic recunoaste , analizeaza si afiseaza pe un LCD alfanumeric numarul total al cuburilor ce trec prin fata senzorilor dar si culoarea cuburilor (alba sau neagra). Intreg modulul electronic se alimentaza la o tensiune maxima de 15V pentru a se evita defectarea stabilizatorului pozitiv de tensiune de 5V, sistemul electronic fiind totodata protejat la inversa tensiune. In scopul comunicarii cu utilizatorul , sistemul de fata dispune de un LCD alfanumeric de 16×2 caractere pe care sunt afisate datele de interes dar in acelasi timp afisarea datelor se realizeaza si wireless prin comunicatie de tip bluetooth. Startarea si oprirea benzii rulante aflata in regim normal de functionare se realizeaza prin intermediul a doua butoane (START-STOP) de comanda sau direct din terminal, wireless prin comanda “s” pentru start si “p” pentru stop. Totodata pe teminalul de comunicatii seriale este afisata in timp real valoarea contorului ce indica numarul de cuburi analizate. In momentul in care un cub trece prin dreptul senzorilor in infrarosu, se realizeaza in timp real o analiza ce are ca scop determinarea tipului de cub, la sfarsitul careia se afiseaza datele pe terminalalele mai sus amintite dar in acelasi timp se comanda si actionarea motorului DC selector capat de linie. Motoarele utilizate sunt motoare de curent continuu DC (4-6V) cu redactor 120:1 si sunt comandate software prin semnale in regim PWM. Pentru actionarea celor doua motoare s-a utilizat un driver specializat de tipul L293 ce contine in structura sa interna doua punti H prin intermediul carora se poate comanda invartirea unui motor de tip DC in ambele sensuri.

Materialul ce sta la baza constuctiei platformei – machete este FOREX-ul , un material cu caracteristici speciale, ce se face remarcat prin duritate si o foarte mare usurinta in prelucrare. Materialele de constructie pentru banda de rulare si rolele de directivitate ce compun sistemul de angrenare au fost cumparate ca materiale brute si adaptate sistemului.

BLOCURILE ELECTRONICE CONSTITUTIVE

FIG.1

1. Descrierea functionalitatii pe module a platformei

Platforma rulanta este compusa din mai multe module electronice interconectate ce au ca scop principal achizitia-procesarea-afisarea de semnale si mai apoi actionarea dispozitivelor electromecanice in scopul selectiei cuburilor mici-mari si albe-negre.Astfel sistemul electronic este capabil sa detecteze urmatoarele tipuri de cuburi : mici albe /mici negre/mari albe/mare negre. Un lucru important referitor la recunoasterea cuburilor este acela ca s-a reusit ca prin intemediul a numai doi senzori in infrarosu sa se detecteze toate aceste caracteristici si mai apoi sa se faca selectia electromecanica. Motorul de selectie de la capat de linie este tot de acelsi tip ca cel de angrenare al benzii si anume motor DC cu reductor 120:1 dar pe langa acesta , pentru determinare pozitiei curente de lucru, s-a mai folosit si doua microswitch-uri pe post de encodere simple incrementale. Analiza pozitiei acestor encodere in functia de intrerupere face ca viteza de reactie a sistemului sa fie net sporita in momentul in care se face o detectie a unui obiect supus analizei senzorilor in IR. Microswitch-urile utilizate ca encodere in sistemul de selectie-capat de linie sunt conectatate in circuit impreuna cu cate un resistor de pull-down, valoarea tensiunii la pinul de input al microcontroller-ului ce realizeaza analiza fiind in momentul actionarii de 1L (5V) si de 0L(0V) in rest. Comanda propriuzisa a motoarelor DC se realizeaza software prin intermediul generarii de semnal PWM cu scopul de a controla viteza de deplasare a benzii rulante.

Achizitionarea semnalelor provenite de la senzori se realizeaza intern de catre microcontroller prin intermediul convertorului ADC pe 10 bit ce lucreaza in regim multiplexat si ce permite achizitia de semnale analogice de la un numar de 14 canale ADC diferite. In urma achizitiei si procesarii de semnale se afiseaza pe un LCD alfanumeric de 16×2 caractere mesaje de interes ce constau in valori provenite de la senzori , status-ul curent sistemului precum si mesaje de asteptare. O problema aparuta in timpul constructiei a fost resetarea continua a modulului central cu microcontroller in momentul in care se comanda actionarea motoarelor , problema ce avea ca si cauza consumul foarte mare de curent al motoarelor la primul impuls de rulare al benzii. Deoarece stabilizatorul pozitiv de tensiune al sistemului poate debita un maxim de 1.5A , in momentul actionarii motoarelor de current continuu , consumul de current creste foarte mult si tensiunea de alimentare de 5V scade proportional ducand in final la resetarea intregului sistem electronic . Solutia a fost utilizarea a inca unui stabilizator de 5V ,separat de unitatea principala de procesare, pentru alimentarea driver-ului ce comanda motoarele de current continuu.

2. Utilitatea platformelor robotice autonom-inteligente

Utilitatea roboților și micro-roboților este de necontestat atunci când intervenția omului este limitată sau nu este posibilă datorită anumitor factori. Un lucru foarte important în ceea ce privește robotica este autonomia, iar în cele ce urmează se vor aborda câteva caracteristici și noțiuni de bază legate de această funcție.

2.1 Inteligență, autonomie și control

Platformele robotice au la bază două caracteristici foarte importante și anume inteligenta și autonomia, acestea fiind foarte strâns corelate. Astfel când se face referire la funcția de autonomie, implicit intră în discuție și termenul de inteligență.

Inteligența unui robot are la bază capabilitățile și sarcinile pe care acesta le poate realiza și se poate defini prin regulile implementate la nivel de software, reguli pe baza cărora robotul își îndeplinește funcția de autonomie. Inteligența unui robot este demonstrată prin modul în care robotul poate lucra eficient în mediu sau altfel spus, modalitatea prin care procesul de lucru diferă de cazul în care acțiunile robotului ar fi controlate de un operator uman.

Când se face uz de termenul de de autonomie, se face referire în principiu la capacitățile robotului de a lua anumite decizii fără a fi prezentă intervenția unui operator uman. Pe baza regulilor implementate la nivel software și în funcție de numărul și complexitatea acestora, robotul are capabilitatea de a realiza anumite sarcini. Din punctul de vedere al funcționării, schema de control a unui robot este compusă din mai mulți pași repetitivi și anume:

in primul rând robotul primește informații din mediul înconjurător prin intermediul senzorilor cu care este echipat;

in următoarea etapă robotul își planifica ce decizii sa ia continuare în funcție de informațiile primite de la senzori, construind astfel un model al lumii înconjurătoare;

Robotul își pune în final în aplicare deciziile, procesul fiind posibil numai cu ajutorul părții electro-mecanice cu care acesta este dotat;

Fiind strâns legate, aceste reguli formează mecanismul care mai este și numit în literatura de specialitate STA (sense-think-act). Astfel blocul de comandă din cadrul unui robot se poate descompune în mai multe blocuri funcționale, cum se prezintă și în figura următoare:

FIG.2 Blocuri functionale

Blocul de percepție din cadrul acestei scheme de principiu realizează procesarea datelor provenite de la senzorii de pe robot iar blocul de planificare are rolul de a decide un plan de acțiune pentru sistem. Pașii prezentați mai sus sunt repetați de robot până în momentul în care sarcina este îndeplinită cu succes.

2.3 Materiale utilizate în construcția platformelor robotice

Ca și corpul uman, o platforma robotica va conține părțile vitale ce ajută la buna funcționare a sa. Astfel structura de bază a corpului unui robot poate fi construită din materiale precum lemn, plastic sau metal și poate lua orice formă și dimensiune. O caracteristică importantă de care trebuie să se țină cont atunci când se aleg dimensiunile și formele materialului este aceea că pe structura corpului vor fi dispuse motoarele/servomotoarele, acumulatorii, plăcile electronice și alte elemente auxiliare. În multe cazuri o carcasă de protecție poate fi plasată peste circuitele electronice și peste anumite componente auxiliare, ajungându-se chiar și la utilizarea de piele artificială, aceasta având un rol pur estetic și nu de protecție. In cazul de fata materialul predominant folosit este lemnul datorita usurintei cu care se prelucreaza. Metalul reprezintă alegerea optimă în construcția structurii de bază a unei platforme robotice, iar printre metalele cel mai des utilizate în acest scop se pot enumera:

– Aluminiul este un material utilizat în construcția roboților de dimensiuni medii și mari și se remarcă duritatea mare raportată la greutate, fiind în același timp ușor de prelucrat dar scump în comparație cu alte materiale.

– Oțelul este deseori utilizat în construcția cadrului unui robot datorită durității ridicate iar ca dezavantaj se remarcă faptul că prelucrarea acestuia necesită scule speciale, oțelul fiind un material mai greu deformabil. Oțelul inoxidabil este utilizat în construcția componentelor de precizie cum ar fi brațe, mâini, angrenaje și alte mecanisme unde aluminiul nu ar putea face față solicitărilor.

– Lemnul este un material utilizat în principal la construcția cadrului unui robot, și apreciat pentru faptul că se prelucrează foarte ușor.Acesta are o duritate slabă raportată la greutate.

– Plasticul este materialul folosit la aproape orice în zilele noastre, inclusiv la construcția roboților. Acesta are o duritate chiar mai mare decât a multor metale și este foarte ușor de prelucrat și de lipit.

Acestea au fost doar câteva exemple de materiale cel mai des utilizate în construcția roboților, dar lista poate continua având în vedere apariția de noi materiale a căror principală caracteristică este duritatea maximă raportată la greutatea minimă. Un material ușor de prelucrat cu greutate mică și duritate mare constituie un avantaj și duce implicit la o proiectare mai bună a tuturor ansamblelor unui ansamblu robotic. În ceea ce privește construcția platformei robotice prezentate, materialele utilizate au fost:

-Plastic, baghete de plastic

-Forex-ul

-Aluminiul;

-Cauciucul

-Buretele

2.4ial utilizat în principal la construcția cadrului unui robot, și apreciat pentru faptul că se prelucrează foarte ușor.Acesta are o duritate slabă raportată la greutate.

– Plasticul este materialul folosit la aproape orice în zilele noastre, inclusiv la construcția roboților. Acesta are o duritate chiar mai mare decât a multor metale și este foarte ușor de prelucrat și de lipit.

Acestea au fost doar câteva exemple de materiale cel mai des utilizate în construcția roboților, dar lista poate continua având în vedere apariția de noi materiale a căror principală caracteristică este duritatea maximă raportată la greutatea minimă. Un material ușor de prelucrat cu greutate mică și duritate mare constituie un avantaj și duce implicit la o proiectare mai bună a tuturor ansamblelor unui ansamblu robotic. În ceea ce privește construcția platformei robotice prezentate, materialele utilizate au fost:

-Plastic, baghete de plastic

-Forex-ul

-Aluminiul;

-Cauciucul

-Buretele

2.4 Proiectarea hardware generală a robotului

Proiectarea hardware a robotului s-a axat în principiu pe usurinta prelucrarii materialelor si duritatea in timp la stress mecanic . Materialele utilizate în construcția robotului cum ar fi aluminiul, cuprul și plasticul au asigurat această diminuare a greutății și în principiu o optimizare a proiectării hardware. În ceea ce privește plăcile de bază pe care s-au plantat componentele electronice, pentru comoditate și rapiditate în execuție, plăcuțele cu găuri au fost alegerea optimă așa cum se poate observa și în figura următoare:

FIG.3 Cablaj folosit

Componentele electronice folosite în construcția robotului au fost alese în ideea unei dimensiuni cât mai reduse și o calitate sporită pentru o optimizare a spațiului utilizat și anume a placii de baza pe care sunt montate modulele electronice si angrenajele mecanice. Toți rezistorii utilizați sunt marcați în codul culorilor și au o valoare a puterii proprii de 1/4W, această alegere fiind făcută în strânsă corelație cu faptul că prin circuitele existente curentul care circulă nu are valori mari.

Pe lângă toate acestea, au mai fost utilizate LED-uri cu o singură culoare, modul LCD alfanumeric, diode LED emițătoare și receptoare în infraroșu (IR), tranzistori, condensatori, regulator de tensiune de 5V, oscilatoare cu cristal (XT) de 8Mhz, motor de curent continuu și o serie largă de de conectori și fire. S-a insistat foarte mult pe calitatea lipiturilor precum și pe conectorii, mufele și firele de conexiune alese pentru ca în etapele următoare ale construcției robotului să nu se întâmpine probleme legate de conectivitate.

3. Sistemele senzoriale

Pentru majoritatea sarcinilor atribuie unei platforme robotice, cel mai comun tip de intrare este cel reprezentat de semnalul electric provenit de la sistemul senzorial. Se poate spune faptul că există o gamă largă de sisteme senzoriale de la foarte simple la foarte complexe, toate acestea utilizate cu un sigur scop și anume de a oferi sistemului electronic cu microcontroller semnalul pe baza căruia să poată lua decizii inteligente. Spre exemplu un senzor de temperatura poate oferi robotului informația necesară în scopul de a continua sau nu o anumită acțiune.Senzorii se pot grupa în două mari categorii, și anume:

– Senzori digitali care oferă rezultate la ieșire numai de valori 1 sau 0, on/off sau true/false. Un simplu exemplu în acest sens este un comutator oferind informația necesară în momentul în care acesta este închis sau deschis.De asemenea un sensor sonar sau ultrasonic range finder returnează valori binare, semnalul din ieșire fiind compus dintr-un anumit număr de biți și furnizând informații referitoare la distanță. Senzorii digitali pot fi conectați direct la blocul de procesare și control fără alte blocuri electronice de interfațare.

– Senzorii analogici care oferă la ieșire de obicei o tensiune. În multe cazuri, acest tip de senzori oferă la ieșire o rezistență sau un curent variabil care este convertit mai apoi de către un circuit intermediar într-o tensiune. Un exemplu foarte bun este acela în care un element LDR (foto-rezistor) este expus la lumină.În acest caz, prin construcția unui simplu divizor de tensiune, tensiunea din ieșire variază direct cu lumina care intră în contact cu foto-celula. În cazul senzorilor analogici este deseori nevoie de un bloc de conversie analog-digital care să convertească variația tensiunii de la ieșirea senzorului într-o formă în care unitatea centrală de procesare o poate utiliza. În ceea ce privește tipul senzorilor, se pot enumera:

-Sonar ultrasonic range finder în care undele reflectate sunt folosite pentru a aproxima distanța sau pentru determina dacă robotul este în apropiere de un obiect. Raza de acțiune are o valoare maximă în jur de 10 metri.

-Senzorul cu infraroșu în care undă în infraroșu reflectată este utilizată în scopul de a determina distanța. Raza tipică de acțiune este de la 0 la 2 metri.

-Senzorul de lumină este utilizat în scopul de a detecta prezența sau absența luminii.

-Senzorul piroelectric în infraroșu poate detecta diferențe de temperatură și este foarte utilizat în senzorii de mișcare. Raza de acțiune este cuprinsă de la 0 până în jurul valorii de 15 metri.

-Senzorul de sunet cu ajutorul căruia sursele de sunet pot fi detectate.Se poate regla astfel încât să fie sensibil la anumite frecvente și amplitudini ale semnalului sonor.

-Accelerometrul care este folosit pentru a detecta schimbări de viteză sau deviații de la axa orizontală, cel mai des fiind utilizat pentru a determina viteza de deplasare a robotului.

-Senzorul de temperatura poate fi utilizat pentru a monitoriza temperatura ambiantă sau căldura aplicată.

4. Motoarele de curent continuu utilizate

Motoarele reprezinta o componenta esentiala in ceea ce priveste mobilitatea robotilor, acestea putand diferi intre ele prin dimensiuni,turatie, mod de lucru, brushed sau brushless, cu magnet permanent sau nu ,de curent continuu sau alternativ. O caracteristica foarte importanta a motoarelor o reprezinta viteza de rotatie (RPM) a acestora, majoritatea avand o plaja de valori cuprinsa intre 2000-9000 RPM. Motoarele sunt utilizate in sistemele robotice prin intermediul mecanismelor de reductie, numite si reductoare, si au ca scop marirea cuplului generat prin transformarea vitezei in putere, in cazul de fata reductoarele robotului avand un factor de 120:1.Comanda motoarelor s-a realizat digital prin intermediul generarii de semnale PWM. Avantajul comenzii motoarelor in regim PWM este acela ca ofera posibilitatea unei viteze de rotatie variabile . S-a dorit utilizarea unui semnal PWM pentru comanda motoarelor pentru un control mai fin al miscarii dar scopul principal a fost pentru a oferi sistemului electronic timpul necesar de achizitie-procesare-actionare la detectia unui cub pe banda.Astfel, software , prin schimbare unor parametri de comanda cu directa legatura la tensiunea de alimentare a motoarelor DC, se poate varia viteza de rotatie a benzii. Motorul DC ce angreneaza banda este cel prezentat in figura urmatoare :

FIG.4 Motor DC

Comanda motoarelor de current continuu utizate in rularea benzii si in modulul selector sunt actionate prin intermediul unui circuit integrat specializat L293 ce contine in structura sa interna 2 punti H . Motoarele utilizate in cazul de fata sunt de tipul FF-050SH cu perii si au urmatoarele caracteristici:

FIG6. Detalii tehnice motor DC

FIG.5 Tip motor DC cu reductor utilizat

Estimand faptul ca motoarele functioneaza la o turatie de 8000 RPM si tinand cont de factorul de 120:1 al reductoarelor , va rezulta o turatie maxima a axului de iesire din reductor de 160 RPM.Diametrul rotii de angrenare fiind de 40mm, va rezulta o viteza maxima a robotului :

v=diametru.roti * pi*RPM/60=0.0 4*3.14*2.66=0.33m/s;

v=0.33*3600/1000= 1.2km/h.

5. Criterii pentru alegerea unui microcontroller

Sunt multe aspecte de care trebuie ținut seama la alegerea unui MC pentru o anumită aplicație. Alegerea unui MC potrivit poate duce la succesul proiectului, așa cum o alegere nepotrivită poate duce la eșecul proiectului. Fiecare cititor trebuie să adapteze aceste criterii nevoilor sale și scalei proprii de valori. Obiectivul urmărit în alegerea unui MC este obținerea calității dorite cu un cost cât mai scăzut. Calitățile dorite înseamnă performanță, fiabilitate, calități EMC (de compatibilitate electromagnetică cu mediul), iar costul total include costurile cercetării, proiectării, construcției, testării, reparării produsului. În primul rând se pune problema stabilirii funcției pe care MC trebuie s-o îndeplinească în sistem. Alegerea din catalog a unui MC trebuie făcută în ideea a cât mai puțin hardware suplimentar (din motive economice). Procesul de căutare este dificil din cauza numărului foarte mare de tipuri de MC disponibile pe piață . După stabilirea MC optim se verifică prețurile, dacă este disponibil, suportul acordat de fabricant, existența uneltelor de dezvoltare, stabilitatea firmei constructoare. Un criteriu important este posibilitatea de a fi găsit pe piață (optenabilitatea), mai ales în zone în care circulația mărfurilor este destul de greoaie. Criteriile pentru alegerea unui MC sunt, în ordinea importanței:

1. Posibilitatea folosirii în aplicația dată este suficient un MC sau sunt necesare circuite suplimentare;

2. Liniile I/O sunt suficiente (un număr prea mic înseamnă că aplicația nu se poate face cu acest MC, iar un număr prea mare înseamnă un cost excesiv);

3. Există toate interfețele solicitate de aplicație: I/O serial, convertoare A/D, D/A și nu există interfețe în plus;

4. Există capacitatea de memorare suficientă: RAM, ROM;

5. MC are viteza suficientă pentru această aplicație. Se verifică timpulnecesar rulării programului care trebuie să fie mai mic decât intervalul de timp în care trebuie să reacționeze MC.

Un argument pentru alegerea unui tip de MC este existența unui modul de evaluare. Pentru a promova propriile MC, mulți furnizori au creat Kit-uri de evaluare care conțin

plăci de evaluare și un soft minimal cu care se poate învăța utilizarea MC și se pot pune la punct aplicații. Un kit conține de regulă un program monitor pentru calculator PC, un program de transfer al datelor spre placa de evaluare (prin interfața RS232 sau CENTRONICS), un asamblor și un compilator C. Toate kiturile sunt însoțite de documentație.

Schema bloc a unui microcontroller

Schema este în continuare o reprezentare generalizată :

FIG.6 Schema bloc microcontroller

Se poate observa că un MC este organizat în jurul unei magistrale interne pe care se vehiculează date, adrese și semnale de comandă și control între blocurile funcționale. Unitatea centrală execută instrucțiunile pe care le primește prin magistrala de date din memoria program. Structura Harvard este posibilă și răspândită la MC pentru că de regulă instrucțiunile sunt stocate în memoria ROM, iar datele în cea RAM. Magistrala de date și cea de adrese pot fi separate sau multiplexate. Fiecare MC are un controller de întreruperi care admite atât intrări din exterior cât și de la modulele interne. Unele MC dispun de un controller DMA propriu.Modulele I/O pot fi seriale sau paralele. Fiecare modul transferă date cu exteriorul

prin intermediul registrului de date (RD). Modulul este programat (configurat) de unitatea centrală prin intermediul unui registru de comenzi (RC) și se poate citi starea modulului prin registrul de stare (RS). Prin RS se pot genera întreruperi către unitatea centrală. Registrele modulelor I/O pot fi văzute de UC ca locații de memorie sau ca dispozitive de I/O într-un spațiu de adresare separat. Sub numele de dispozitiv I/O, într-o abordare generalizată, sunt cuprinse principalele interfețe ale MC (timer, canal serial UART) și linii I/O grupate în porturi paralele de uz general. Același nume generic poate acoperi și interfețele speciale întâlnite în configurații particulare de MC (convertor A/D, interfață serială sincronă, interfață LCD, interfață USB, etc.

Particularizare. Diagrama bloc a microcontrollerului PIC16F887

FIG.7 Diagrama bloc microcontroller PIC16F887

5.1 Dispozitive I/O

Dispozitivele I/O reprezintă un aspect de mare interes atunci când este vorba de microcontroller, interes rezultat din însăși particularitatea unui MC aceea de a interacționa cu mediul în procesul de control pe care îl conduce.

Dispozitivele I/O implementează funcții speciale degrevând unitatea centrală de toate aspectele specifice de comandă și control în funcția respectivă.Există o varietate mare de dispozitive I/O; dispozitivele I/O conduc operații generale de comunicație (transfer serial sau paralel de date), funcții generale de timp (numărare de evenimente, generare de impulsuri), operații de conversie analog/numerică, funcții de protecție, funcții speciale de comandă, și enumerarea poate continua. Parte din resurse acoperă funcțiile de control propriu-zis, iar o parte asigură funcțiile necesare aplicațiilor în timp real (sistemul de întreruperi, timer). Din această mare varietate, parte din dispozitive se găsesc în configurația tuturor MC sau sunt foarte des întâlnite, iar o altă parte de dispozitive o regăsim doar în MC construite pentru a optimiza aplicații cu un grad mare de particularitate. În acest capitol, în continuare, vor fi prezentate dispozitive des întâlnite în echiparea MC. Dispozitivele I/O sunt “văzute” de unitatea centrală ca porturi. Există două filozofii de alocare a adreselor (mapare) pentru apelarea porturilor de către unitatea centrală. Porturile sunt mapate fie în spațiul de memorie, fie într-un spațiu propriu.

Avantajele mapării în spații separate:

• Metoda nu este susceptibilă de a provoca erori soft deoarece se

folosesc instrucțiuni diferite pentru a accesa memoria și dispozitivele I/O;

• Dispozitivele I/O nu ocupă spațiu de memorie;

• Decodificatorul de adrese pentru dispozitivele I/O este mai simplu

deoarece spațiul de adresare al dispozitivelor I/O este mai mic.

Dezavantaje ale mapării în spații separate:

• instrucțiunile I/O sunt mai puțin flexibile în comparație cu

instrucțiunile de lucru cu memoria;

• instrucțiunile I/O nu permit folosirea modurilor de adresare folosite în

lucrul cu memoria.

Avantajul mapării în spațiu comun:

• toate instrucțiunile de lucru cu memoria și toate modurile de adresare

sunt utilizabile și în tratarea dispozitivelo I/O (programarea operațiilor

I/O este foarte flexibilă);

Dezavantajele mapării în același spațiu:

• este susceptibil la erori software;

• spațiul de adresare disponibil pentru memorie este mai mic.

Avantajul mapării într-un spațiu comun este acela că se poate opera cu porturile la fel ca și cu o locație de memorie; multe operații aritmetice și logice folosesc operanzi direct de la port, datele pot fi mutate între porturi cu o singură instrucțiune, conținutul unui port poate fi citit, incrementat și rezultatul scris din nou la port de asemenea cu o singură instrucțiune.

5.2 Module Timer

Natura aplicațiilor pentru care s-a născut microcontroller-ul implică o multitudine de funcții de timp puse la dispoziția utilizatorului prin module de timp numite timer. Un MC este echipat în mod obligatoriu cu un astfel de modul mai mult sau mai puțin complex. Un sistem timer obișnuit pune la dispoziție un set de funcții implementate pe baza unui numărător liber central și a unor blocuri funcționale pentru fiecare funcție în parte. Timer-ul are în structura sa, dintre toate celelalte subsisteme, cele mai multe registre. Toate funcțiile unui timer pot genera întreruperi independente; fiecare are controlul propriu și propriul vector de întrerupere. Modulele timer complexe sunt construite cu arii de numărare programabile (PCA). Pentru aplicații speciale în timp real s-au construit module timer cu unitate aritmetică și logică proprie. Timer-ul este folosit pentru a măsura timpul și pentru a genera semnale cu perioade și frecvențe dorite. Timer-ele nu sunt doar circuite cu funcții detemporizare; în modulul timer sunt implementate câteva mecanisme care pun la dispoziția utilizatorului funcții specifice. Mecanismul de comparare permite controlul unor semnale de ieșire; mecanismul de captură permite monitorizarea unor semnale de intrare; numărătoarele interne permit generarea de referințe de timp interne, necesare în bucle de întârziere, multiplexarea diferitelor sarcini software, ș.a. Timer-ul poate fi folosit practic pentru orice funcție de timp, inclusiv generarea unor forme de undă sau conversii D/A simple. Funcțiile oferite de un timer sunt:

1. Captură la intrare (IC – input capture) – această funcție se bazează pe posibilitatea de a stoca valoarea numărătorului principal la momentul apariției unui front activ al unui semnal extern. Facilitatea permite măsurarea lățimii unui impuls sau a perioadei unui semnal. Facilitatea poate fi folosită și ca referință de timp pentru declanșarea altor operații.

2. Comparare la ieșire (OC – output compare) – se compară la fiecare impuls de ceas valoarea numărătorului principal cu cea a unui registru. Dacă se constată egalitate, în funcție de programarea anterioară pot avea loc următoarele evenimente: declanșarea unei acțiuni la un pin de ieșire (opțional), setarea unui flag într-un registru sau generarea unei întreruperi pentru unitatea central (opțional). Funcția este folosită pentru a genera întârzieri sau pentru a genera o formă de undă cu valori dorite pentru frecvență și pentru factorul de umplere .

3. Întreruperi în timp real (RTI – real-time interrupt) – într-un sistem există sarcini care trebuiesc executate periodic sau care nu permit depășirea unui interval limită între doua execuții. Aceste sarcini sunt lansate ca rutine de tratare a întreruperii generate de timer.

4. COP (computer operating properly) watchdog – această funcție este folosită pentru a reseta sistemul în cazul în care din erori de programare (bugs) sau erori în desfășurarea programului datorate perturbațiilor mediului, registrul COP nu este accesat într-un interval de timp prescris.

5. Acumulare de pulsuri (pulse accumulator) – este funcția folosită pentru a număra evenimentele ce apar într-un interval de timp determinat sau pentru a măsura durata unui impuls.

Microcontrollerul PIC16F887

FIG.8 Microcontroller-ul PIC16F887

Microcontrollerul utilizat pentru acest proiect este PIC16F887 si are reprezentarea pinilor ca in figura 1. Asa cum se poate observa si din figura nr.1 pinii microcontrollerului inglobeaza mai multe functii , asfel , pinii corespunzatori port-ului PORTA pot fi setati si ca pini analogici de intrare dar si ca pini digitali de intrare/iesire. De asemenea pinii Vpp , RB7 si RB6 sunt utilizati in programarea memoriei microcontrollerului prin conexiune ICSP , dar pinii RB7 , RB6 pot fi utilizati si ca pini digitali de intrare/iesire. PIC16F887 contine un numar de 14 canale analogice si pot fi folosite in regim multiplexat, independent unul de celalalt avand. Microcontrollerul are la baza arhitectura de tipul Harvard si un numar de 35 de instructiuni, putand opera la o frecventa maxima a oscilatorului de 20 Mhz , reprezentand o viteza propriuzisa de lucru de F(clock)/4= 200 nanosecunde.

FIG.9 Arhitectura Harvard

Un aspect important legat de acest tip de arhitectura este acela ca memoria program este separata de memoria de date , in acest fel fiind posibila citirea unei date si a unei instructiuni in acelasi timp( memoria de date si memoria program se afla pe BUS-uri diferite). Tehnica pipeline este cea prin intermediul careia o instructiune se executa corect iar in cazul de fata , o instructiune este corect realizata in 4 perioade de clock, astfel , la o frecventa a oscilatorului de 20 Mhz, frecventa reala de lucru a microcontrolerului va fi de 20/4 = 5 Mhz, sau altfel spus, 5 mips (5 milioane de de instructiuni pe secunda) Aceasta tehnica se regaseste si la procesoare si ajuta la cresterea vitezei propriuzise de lucru. Fiecare etapa din cele 4 din procesul pipeline este executata de catre o unitate functionala a microcontrollerului. Segmentele pipeline sunt conectate intre ele intr-un mod analog asamblarii unei conducte din segmente de teava. Segmentele tipice de executie ale unei instructiuni masina pe microcontroller sunt :

F- fetch – se refera la un ciclu special in care procesorul citeste din memorie codul instructiunii ce urmeaza a fi executata.

D-decode – se refera la procesul de decodare , proces in care instructiunea este recunoscuta si procesul are tot ce ii trebuie pentru executia instructiunii.

E-execute- reprezinta procesul propriuzis de executie a instructiunii

W-write-back- scrierea rezultatului inapoi in memorie.

FIG.10 Instruction execution

Referitor la microcontrollerul PIC16F887, acesta, pe langa oscilatorul extern ce poate fi adaugat din punct de vedere hardware, mai contine si un oscilator intern fiind posibila selectarea unei frecvente cuprinse intre 31kHz-8Mhz. In cazul de fata frecventa la care opereaza microcontrolerul este de 20 Mhz si a fost ales pentru ca are integrat in constructia sa o platforma ADC multicanal, platforma ce a corespuns standardelor de design digital alese la inceputul constructiei acestui proiect.O serie de caracteristici ce descriu microcontrollerul PIC16F877A sunt prezentate in figura urmatoare :

FIG.11 PIC16F887 Resources

• Power-Saving modul Sleep
• Gamă largă de tensiune gama de operare (2.0V-5.5V)
• Power-on Reset (POR)
• Power-up Temporizator (PWRT) și Oscilator Start-up Temporizator (OST)
• Brown-out Reset (BOR)

• low-curent watchdog timer (WDT)
• anduranță mare in scrierea Flash-ului / EEPROM-ului pe celulă:
– 100.000 cicluri Flash
– 1.000.000 cicluri EEPROM
– Flash / date EEPROM de retenție:> 40 ani
• Memoria program de citire / scriere în cursul timpului de funcționare
• In-Circuit Debugger

Functiile pinilor pentru microcontrolerul PIC16F887:

FIG.12 PIC16F887 pin-functions

5.3 Pinul MCLR/Vpp

Acest prin are rolul de MASTER CLEAR OR RESET .

– MCLR and VPP sunt doua functii reprezentate prin acelasi pin;

– MCLR reprezinta Master Clear, iar functia de reset pe microcontroller va determina ca microcontrollerul sa stea intr-o stare de reset atat timp cat MCLR este conectat la GND . Datorita acestui fapt, pentru a se evita eventualele resetari ale microcontrollerului, se utilizeaza un rezistor de tipul pull-up care mentine in permanenta pinul de MCLR la Vdd. Cand MCLR e conectat la Vdd , atunci microcontrollerul va incepe sa execute prima instructiune din memoria program.

Definitia VPP se traduce ca fiind Voltage for Programming si este utilizat in procesul scrierii memoriei . Atunci cand amplitudinea tensiunii de pe pinul Vpp este cuprinsa intre 9-13v microcontrollerul intra intr-o stare speciala de reset unde acesta nu functioneaza , dar poate fi programat.

FIG.13 Pinul MCLR

Configurare modului de lucru al microcontroller-ului

In proiectul de fata s-au utilizat configuratiile de input-uri digitale , input-uri analogice si output-uri digitale pentru indeplinirea tuturor functiilor proiectului, in urmatorul mod :

–––––––––––DSCRIERE PROIECT BANDA RULANTA––––––––––-

-Ruleaza mesaje de informare/avertizare pe LCD-ul alfanumeric de 16×2 caractere;

-Ruleaza la startare un program de selftest pentru verificarea functionalitatii sistemelor;

-Conectare la bluetooth cu afisare si posibilitate de start-sotop;

-Senzorii in infrarosu detecteaza dimensiunea si culoarea unui cub;

-Rularea benzii si selectorul au la baza motoarele DC;

-Contorizarea numarului de cuburi si afisarea pe LCD si pe teminal;

-Banda rulanta poate if oprita din butoanele de comanda si din terminal-bluetooth;

–––––––––––-SETARI De LUCRU–––––––––––––––-

1.a. INPUT-URI ANALOGICE

RA0/AN0 -> input analogic citire distanta in infrarosu – senzorul de la baza(1);

RA1/AN1 -> input analogic citire distanta in infrarosu – senzorul de sus(2);

1.b. INPUT-URI DIGITALE

RA2 -> encoder -capat de cursa stanga;

RA3 -> encoder -capat de cursa dreapta;

RC0 -> microswitch de comanda START;

RC1 -> microswitch de comanda STOP;

2. OUTPUT-URI

RC2 -> LED albastru;

RC3 -> LED rosu;

RD7 -> MOTOR DRIVER ENABLE 1 – pentru selector;

RD6 -> MOTOR DRIVER INPUT 1 – pentru selector;

RD5 -> MOTOR DRIVER INPUT 2 – pentru selector;

RD4 -> MOTOR DRIVER ENABLE 2 – pentru rulare banda;

RC5 -> MOTOR DRIVER INPUT 3 – pentru rulare banda;

RC4 -> MOTOR DRIVER INPUT 4 – pentru rulare banda;

3. CONFIGURARE LCD ALFANUMERIC

PIN NUMBER 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16

DESCRIPTION Vss Vdd Vo Rs R/W En D0 D1 D2 D3 D4 D5 D6 D7 BA(+) BLK-()

PIC16F887 Vss Vdd Pot RB0 GND RB2 GND GND GND GND RD3 RD2 RD1 RD0 Vdd(R) Vss

4. MODUL BLUETOOTH UART

PIN NUMBER 1 2 3 4 5 6

DESCRIPTION WUP VCC GND TXD RXD STS

PIC16F887 NC VCC GND RX(RC7) TX(RC6) NC

6. Convertoarele ADC

Intrările/ieșirile analogice și convertoarele A/D nu sunt considerate ca parte definită în contextul unui calculator; aceste elemente sunt importante în schimb atunci când considerăm un microcontroller. Prezența modulelor A/D și D/A în structura unui MC contribuie la “puterea”acestuia în aplicații deoarece interfațarea cu mediul presupune necesitatea de a prelucra sau de a elabora mărimi analogice. Convertoarele A/D sunt des întâlnite printre perifericele on-chip. Convertoarele D/A nu sunt întâlnite în mod uzual printre unitățile componente deoarece sunt relativ ușor implementate în exterior. Un convertor D/A simplu poate fi realizat folosind un timer în mod PWM și integrând pulsul în exterior cu un simplu circuit RC.

Convertoarele A/D integrate pe chip sunt convertoare cu aproximații succesive sau mai rar, convertoare cu integrare. Însușirile convertoarelor nu sunt deosebite; sunt convertoare lente în comparație cu cele implementate în circuite independente. Timpii de conversie obișnuiți sunt plasați în intervalul 10μs-25μs. Rezoluția este de 8, 10 sau 12 biți iar precizia de +/-1/2LSB. Modulul de conversie este prevăzut și cu un multiplexor analogic, astfel sunt disponibile mai multe canale de intrare. Unele MC sunt echipate și cu circuit de eșantionare/memorare. În cazul în care circuitul de eșantionare/memorare lipsește, semnalul analogic trebuie menținut constant pe durata unei conversii. Tensiunea de referință necesară convertorului poate fi generată în circuit sau dacă nu, este necesar să fie furnizată din exterior. În continuare, este prezentată o schemă bloc simplă a unui modul de conversie A/D. Circuitul analogic de intrare constă într-un multiplexor analogic, un circuit de eșantionare/memorare și un convertor A/D cu aproximații succesive. Tensiunea de referință pentru convertor și masa analogică sunt furnizate din exterior la pini speciali. Clock-ul necesar convertorului este generat intern din clock-ul unității centrale.

FIG.14 ADC description

In proiectul de fata , PORTA al microcontrolerului este utilizat pe post de convertor cu intrari analogice,intrari ce preiau semnalele generate de senzorii cu care este echipat sistemul .Canalele ADC folosite in conversia analog-numerica sunt pe 10 biti si sunt utilizate astfel :

INPUT-URI ANALOGICE:

RA0/AN0 -> input analogic citire distanta in infrarosu – senzorul de la baza(1);

RA1/AN1 -> input analogic citire distanta in infrarosu – senzorul de sus(2);

Asa cum a fost mentionat si anterior in proiect, pentru achizitia semnalelor analogice provenite de la senzorii sistemului, se utilizeaza un singur convertor analog-numeric cu reprezentare a semnalului analogic de intrare in format digital pe 10 biti si rezolutie de 4.88 mV / bit. Convertorul lucreaza in regim muliplexat sau altfel spus este utilizat pentru toate semnalele analogice de intrare prin setarea corespunzatoare a registrilor ANSEL , ANSELH. Legatura dintre PORTA, PORTB si registri ANSEL si ANSELH pentru setarea canalelor de intrare analogice este urmatoarea :

FIG.15 ANSEL and ANSELH description

Pentru a seta un canal in modul de intrare analogic , de exemplu pentru pinul RA0/AN0, trebuie ca, in prima faza sa se seteze bitul 0 din registrul TRISA cu 1L ( pinul RA0 se face pin de intrare) iar apoi sa se seteze bitul 0 din registul ANSEL cu 1L pentru ca pinul RA0 sa aiba functia de intrare analogic. Daca nu se seteaza bitul din registrul ANSEL, atunci intrarea va avea functia doar de intrare digitala.

Un aspect important legat de acsti doi registri (ANSEL si ANSELH) este acela ca setarea valorilor bitilor din continutul lor nu afecteaza iesirile digitale.

Configuratia arhitecturala a registrilor ANSEL si ANSELH este urmatoarea :

FIG.16 Corelatie ANSEL /TRIS

Considerente software legate de convertorul ADC

In ceea ce priveste partea de procesare a semnalelor analogice si tinand cont de formatul , rezolutia , registrii implicati in procesul de achizitie a datelor ,partea software este baza procesarii semnalelor. In cazul de fata, daca se face referire la semnalul analogic de pe intrarea RA/AN0, iesirea divizorului rezistiv are o plaja de valori cuprinsa intre 0-5000mV . Valoarea amplitudii de pe canalul de intrare AN0 este citita si convertita in format digital pe 10 bit de catre convertorul ADC, deci pentru valoarea maxima a tensiunii din intrare (~5V) , convertorul ADC va genera un cuvant pe 10 biti de valoare maxima , adica de 1024 (2^10). De aici se poate deduce intr-un mod simplu rezolutia, dupa formula :

Rez = Valoarea in fizic (5V) / Valoarea in hex (1024) = 4.88 mv/bit.

In cod, achizitia si procesarea semnalului analogic s-a realizat astfel :

adc_reading_IR_jos= ADC_Read(0);

adc_reading_IR_jos= ADC_Read(1);

S-au utilizat functiile predefinite ale compilatorului MikroC pentru citirea semnalelor analogice provide de la senzorii analogic ce lucreaza pe principiul reflexiei in infrarosul.

Astfel , dupa cum se poate observa si in linia de cod expusa mai sus, in prima faza se citeste valoarea semnalului de pe canalul 0 al convertorului ADC prin Adc_Read(0) . In final , aceasta valoare este copiata in variabila de tip integer adc_reading_IR_jos si respectiv adc_reading_IR_jos si utilizata ulterior in cod pentru analiza dimensiunii si culorii cuburilor de pe banda.

7. Dispozitive de actionare

Asa cum a fost mentionat si anterior in proiect , sistemul utilizeaza configuratia de “differential work ”, ce inseamna ca motoarele sunt comandate independent unul fata de celalalt , permitand invartirea individuala in ambele sensuri ale acestora.

Comanda motoarelor de current continuu se realizeaza prin intermediul unui driver specializat ce are in structura sa interna 2 punti de tip H ce permit alimentarea intependenta a doua motoare cu posibilitate de comanda in regim PWM. Comanda in puls PWM este de o importanta majora in cadrul acestui proiect deoarece permite , pe langa rotirea in ambele sensuri, si modularea vitezei de rotatie.

La baza circuitului driver pentru motoarele DC sta circuitul integrat L293 ce are urmatoarea configuratie si parametri electrici :

FIG.17 L293 IC –caracteristici electrice

FIG.18 L293 IC –caracteristici electrice

Deoarece motoarele de current continuu functioneaza la o tensiune de alimentare de maxim 6 V , circuitul L293 este alimentat la tensiunea de 5V prin intermediul unui stabilizator pozitiv de tensiune. Ca si amplasare , modulul driver pentru cele doua motoare este amplasat asa cum reiese si din urmatoarea figura :

FIG.19 Modulul diver de motoare

Comanda modulului driver pentru motoare se realizeaza pe o interfata de 6 bit :

RD7 -> EN1,2 (enable input 1)

RD6 -> IN1 (directivity select 1)

RD5 -> IN2 (directivity select 1)

RC4 -> IN4 (directivity select 2)

RC5 -> IN3 (directivity select 2)

RD4 -> EN3,4 (enable input 2)

Astfel , pentru comanda unui motor sunt necesari 3 biti din care 2 pentru directia de invartire si unul pentru activare (EN). In cazul de fata , pinul de EN este folosit pentru activarea intrarii de comanda in regim PWM. Modulul integrat in schema electronica arata ca in figura urmatoare :

FIG.20 Modulul driver L293 integrat in sistem

Comanda motoarelor in semnal PWM

Acest tip de semnal – Pulse Width Modulation este o modalitate de a varia controlat teniunea de iesire prin modficarea factorului de umplere “DUTY CYCLE”. Perioada de timp corespunzătoare valorii ON dintr-un ciclu ON-OFF se numește factor de umplere (duty cycle) și reprezintă, in medie, ce tensiune va primi dispozitivul electronic. Astfel, se pot controla circuitele analogice din domeniul digital. Practic, asta înseamnă că un LED acționat astfel se va putea aprinde / stinge gradual, iar în cazul unui motor acesta se va învârti mai repede sau mai încet.Modificand factoul de umplere ce compune semnalul PWM se va modifica implicit si amplitudinea semnalului continuu de la iesire:

FIG.21 Semnal PWM

La baza generarii acestui tip de semnal stau un numerator si un comparator. Astfel functia numaratorului este de a contoriza , pe o anumita frecventa de esantionare, timpul cat semnalul a ramas in valoarea de 0L sau 1L. In permanenta , odata cu contorizarea temporala, se compara valoarea contorului cu valoarea prestabilia a semalului PWM. In momentul in care s-a ajus la egalitate sau depasire (contor >= valoare prestabilita semnal PWM) se face inversarea de semnal, acest lucru insemnand ca durata componentei semanalului de “duty cycle” a luat sfarsit si se continua cu perioada de 0L pana in momentul in care s-a ajuns la sfarsitul perioadei semnalului. Toata aceasta etapa se repeta in permaneneta si modificand componenta de “duty cycle” cu perioada semnalului ramanand acceeasi se va modifica de fapt amplitudinea semnalului continuu generat in iesirea sistemului.

8. Modulul de comunicatie wireless BLUETOOTH

Proiectul de fata permite afisarea datelor de interes pe un LCD alfanumeric de 16×2 caractere , dar in acelasi timp si afisarea intr-un terminal prin comunicatie wireless de tip Bluetooth.

FIG.22 Modulul bluetooth

Comunicatia intre microcontroller si modulul Bluetooth se realizeaza prin intermediu pinilor specializati PORTC bit 6 si bit 7.

FIG.23 Conectare modul Bluetooth la sistem

In compilatorul Mikroc folosit , initializarea comunicatiei seriale cu baudrate-ul de 9600 bps s-a realizat astfel :

––––––––––––––––––––––––––––––––––––-

UART1_Init(9600); // Initialize UART module at 9600 bps

–––––––––––––––––––––––––––––––––––––––––––––––––––––––––

In linii mari , modulul bluetoooth se comporta ca o transmie normala de date pe protocol serial UART dar cu avantajul ca datele pot fi transmise / receptionate wireless prin radiofrecventa. In cazul de fata datele sunt trimise catre un terminal instalat pe un Smartphone si ofera avantajul unei comunicatii mobile la o distanta de peste 10 m.

Frecventa de lucru a modulului Bluetooth este standard de 2.4 Ghz iar ca sensibilitate ajunge la -80dBm. Antena utilizata de acest modul este deja integrate de cablaj iar tensiunea de alimentare este cuprinsa intre 3.3V-5V. In cazul de fata , in faza de testare si mai apoi in faza de implementare, s-a utilizat tensiunea de alimentare de 5V deoarece se elimina astfel posibilele erori de nivele logice care pot devia de la diferenta de 5V la 3.3v. In ceea ce priveste vitezele de baudrate acceptate de modul , aceaste sint de 9600, 19200, 38400, 57600,115200,230400, 460800 bps. Cateva detalii tehnice referitoare la modulul Bluetooth sunt urmatoarele :

Footprint-ul circuitului integrat specializat :

FIG.24 Footprint circuit integrat bluetooth

Descrierea pe pini si fucntionalitati :

FIG.25 Desciere modul bluetooth

FIG.26 Desciere modul bluetooth

FIG.27 Desciere modul bluetooth

FIG.28 Desciere modul bluetooth

FIG.29 Desciere modul bluetooth

Comenzile AT la nivel de modul , pentru setarea aceastuia sunt urmatoarele:

FIG.30 Comenzi pentru setarea modulului bluetooth

FIG.31 Comenzi pentru setarea modulului bluetooth

FIG.32 Comenzi pentru setarea modulului bluetooth

FIG.33 Comenzi pentru setarea modulului bluetooth

FIG.34 Comenzi pentru setarea modulului bluetooth

FIG.35 Comenzi pentru setarea modulului bluetooth

In proiectul de fata , pentru setarea modulului Bluetooth mai sus descris , s-a utilizat un modul special de tip PL2303 care face posibila transmisia datelor sub protocol serial UART prin intermediul conexiunii de date USB :

FIG.36 Modul serial PL2303

Iar interconexiunea de programare-setare a modulului HC-05 si PL2303 s-a realizat astfel :

FIG.37 Conectivitate Bluetooth-PL2303

Totodata , pentru a putea intra in meniul modulului de comunicatii Bluetooth , pe langa acest modul PL2303 s-a utilizat si un terminal special care permite operatiunea de scriere-setare in modulul Bluetooth, si anume TERATERM.

FIG.38 Terminal setare bluetooth

9. Programarea memoriei microcontrolerului PIC16F887A

Programarea de tip ISP (In-System Programming) este o tehnică pentru programarea unui microcontroler după ce acesta a fost dispus pe placa de circuit. TehnicaICSP (In-Circuit Serial Progrmming) reprezintă o evoluție a tehnicii ISP dezvoltatăde către firma Microchip în scopul programării microcontrolerelor PICmicro TM OTP șiFlash. Utilizarea a doar doi pini de intrare/ieșire pentru transferul serial al datelor este mult mai ușoară și mai puțin intruzivă decât operarea normală a microcontroleru-lui.

Programatorul reprezintă instrumentul hardware care permite transferul un program într-un microcontroler. Acesta poate fi întîlnit într-o varietate de tipuri și forme. Procesul de scriere al unui program începe din momentul în care asamblorul generează codul hex compus din instrucțiuni în cod mașină. Codul hex este preluat intr-un fișier și transferat direct în memoria microcontrolerului. Pentru acesta este necesar dispozitivul hardware (programatorul) care este conectat atât la computerul generator alcodului hex (prin interfață serială RS232 sau USB), cât și la un număr de pini specifici ai microcontrolerului. Fiecare serie de microcontrolere sau de capsulă are un set diferit de pini care poartă denumirea de interfață/conector ICSP. Circuitul electronic al modulului contine o conexiune de tipul ICSP pentru a facilita scrierea memoriei microcontrolerului.Conectorul este plasat intr-o zona degajata a circuitului pentru a nu se afecta componentele electronice sensibile .

Conexiunea ICSP contine 6 pini corespunzatori microcontrollerului:

VPP(MCLRn) –reprezinta valoarea tensiunii de programare care este de obicei de 13V;

Vcc-tensiunea de alimentare de 5V;

GND- masa circuitului;

PGD- conexiune de date (RB7);

PGC- conexiune de clock (RB6);

PGM- low voltage programming enable;

Conectorul ICSP sprecum si conexiunea acestuia cu microcontrolerul PIC16F887A sunt descrise in figurile urmatoare :

FIG.39 Conexiunea ICSP

Scrierea memoriei microcontrolerului PIC16F887A s-a facut cu ajutorul programatorului PICKIT2 ce a fost realizat cu microcontrolerul PIC18f2550 si conectare pe portul USB iar programul utilizat in acest proces a fost software-ul “PICKIT2”, software destinat microcontrolerelor din familia PIC.

10. LCD-ul alfanumeric 16×2 caractere

LCD-ul utilizat in acest proiect este unul de tip alfanumeric cu 2 linii si 16 coloane iar comunicarea cu microcontrollerul se realizeaza printr-o interfata de 8 biti. Alimentarea modulului LCD se face cu 5V, iar intensitatea luminoasa a pixelilor poate fi ajustata prin intermediul unei intrari de control. Aceasta intrare de control accepta o tensiune variabla, tensiune obtinuta prin intermediul unui divizor rezistiv ce are la baza un semireglabil de 50 kohm .Pinii de interfatare ai LCD-ului conform datasheet-ului sunt :

FIG.40 Caracteristici electrice LCD

Pentru comunicarea microcontroller-ului cu display-ul alfanumeric se utilizeaza 8 biti de date si 3 biti de control. Astfel pinul de RS este utilizat pentru ca display-ul sa recunoasca daca i s-a trimis o “comanda instructiune” sau o “data” de afisat.

Pinul R/W este utilizat pentru a selecta daca urmeaza sa se afiseze sau sa se citeasca de pe display-ul alfanumeric. Pinul E reprezinta pinul de activare care permite executia tuturor acestor operatiuni , ceea ce inseamna ca doar atunci cand valoarea e 1L (5V) se permite citirea si interpretarea cuvantului de date (8 bit) primit in configuratie de tip paralel.

Cracteristici electrice:

Display-ul functioneaza la tensiunea maxima de 5V si este astfel complet compatibil pe nivele logice cu microcontroller-ul utilizat – PIC16F887 :

FIG.41 Caracteristici electrice LCD

Diagrama bloc a modulului LCD :

FIG.42 Configuratie interna LCD

Caracterul afisor :

FIG.43 Caracterul afisor – LCD

Protocolul de comunicare cu microcontrolerul PIC16f887 este stabilit in conformitate cu timpii de intarziere si semnalele de control/date descrise in datasheet-ul LCD-ului.

11. Schema electronica generala

FIG.44 Schema electronica generala

In partea de alimentare a sistemului electronic s-a utilizat un circuit de stabilizare pe ramura pozitiva de tensiune , acest lucru insemnand ca indifferent de tensiunea de alimentare aplica la intrarea acestuia, tensiunea din iesire va fi tot timpul constanta si de valoare 5V. In scopul filtrarii tensiunii de alimentare s-au utilizat condensatori de 100 de nF atat pe partea de intrare in modulul stabilizator , cat si in partea de iesire (5V).

FIG.45 Modul alimentare

Condensatorul de 100uF va filtra glich-urile tensiunii de alimentare la frecventa joasa iar condesatorii de valoare mai mica (100nF) vor filtra variatiile de frecventa mai mare ale tensiunii de alimentare. Un alt aspect ce trebuie mentionat este cel ca variatiile in frecventa si glich-urile la frecventa mare sunt introduse in mare parte de catre microcontroller la executarea instructiunilor de lucru dar si de oscilatorul cu quartz.

In scopul protectiei intregului modul electronic la o eventuala alimentare cu tensiune inversa , s-a utilizat o metoda simpla de protective , si anume , introducerea in paralel cu tensiunea de alimentare a unei diode schottky in configuratie inversa (anodul conectat la GND). Astfel , cand polaritatea tensunii de alimentare este respectata , dioda se va comporta ca un contact deschis cu o rezistenta ohmica foarte mare.In momentul in care sistemul electronic s-a alimentat invers , dioda va intra in conductie si va inchide circuitul prin ea , nelasand ca inversa tensiune sa ajunga pe circuitul principal de procesare cu microcontroller. S-a ales diode schottky deoarce este mai rapida ca o diode normala redresoare si incepe sa intre in conductie de la tensiunea de aproximativ 0.3v :

FIG.46 Caracteristica electrica diode Schottky

De asemenea pentru a se indica faptul ca sistemul electronic este sub tensiune s-a integrat in sistemul de alimentare , la iesirea stabilizatorului, un LED de culoare verde ,impreuna cu un resistor de 100 de ohm cu scop de limitare a curentului prin LED.

. O eventuala defectiune la partea de alimentare a circuitului va determina ne-aprinderea acestui LED.

Rezistorul integrat la pinul numarul 1( MCLR) al microcontrollerului este utilizat ca resistor de pull-up in scopul evitarii unei posibile resetari. Atunci cand pinul de MCLR este conectat la masa sau tensiunea de pe acesta scade sub o anumita valoare minima , se declanseaza mecanismul de resetare a sistemului, proces in care registri interni vor fi setati la valori initiale de startare. Pinul MCLR , pe langa functia de I/O si de reset , mai are si functia de pin de programare (VPP) si utilizat in functia de incarcare a codului software in microcontroller.

FIG.47 MCLR-VPP function pin

Operatiunile de stergere si scriere in memorie sunt realizate , asa cum a fost mentionat si anterior in cadrul proiectului, prin intermediul comunicatiei ICSP.

FIG.48 Conexiune ICSP

Ca si orientare pe platforma automatizata , conexiunea ICSP este dispusa asa cum se poate observa si din figura urmatoare:

FIG.49 Pozitionare conexiune ICSP

Quart-ul sau generatorul de frecventa a circuitului electronic este principalul element care detemina frecventa de lucru a microcontrollerului, in cazul de fata 8Mhz / 4 = 2Mhz. Frecventa generata de oscilator este divizata cu 4 doarece o instructiune necesita 4 perioade de clock corespunzatoare fazelor :

F- fetch – se refera la un ciclu special in care procesorul citeste din memorie codul instructiunii ce urmeaza a fi executata.

D-decode – se refera la procesul de decodare , proces in care instructiunea este recunoscuta si procesul are tot ce ii trebuie pentru executia instructiunii.

E-execute- reprezinta procesul propriuzis de executie a instructiunii

W-write-back- scrierea rezultatului inapoi in memorie.

Astel o instructiune va fi executata la fiecare 0.5 us (500 ns). Condensatorii pozitionati pe pinii oscilatorului cu quart au rolul de a filtra semnalul generat de acesta prin procesul de eliminare a frecventelor nedorite de lucru din jurul frecventei fundamentale de 8 Mhz necesare corectei functionari a microcontrollerului.

12. Senzorul de distanta in IR

Pentru detectia si aproximarea distantelor s-au utilizat senzorii in infrarosu IR , acestia comportandu-se excelent si dand rezultate mai mult decat satisfacatoare .

Diodele in IR utilizate sunt de 5mm ca diametru , iar senzorul detecteaza variatia distantei de la o distanta de aproximativ 25 cm fata de elemental receptor. Ca si dispunere pe platforma robotica mobila , senzorii IR pot fi localizati astfel :

FIG.50 Pozitionarea senzorilorpe platforma

Dupa cum se poate observa si din figura de mai sus , atat dioda emitatoare cat si cea receptoare in infrarosu sunt optic izolate pentru a nu exista interferente cu lumina naturala dar si pentru a nu se afecta una pe cealalta.

Diodele IR utilizate sunt diode standard de 5mm cu urmatoarele caracteristici :

DIODA EMITATOARE :

FIG.51 Dioda IR

FIG.52 Dioda IR – caracteristici electrice

FIG.53 Dioda IR – caracteristici electrice

FIG.54 Grafic de functionare – diode IR

DIODA RECEPTOARE

FIG.55 Receptor IR

FIG.56 Receptor IR –caracteristici electrice

FIG.57 Receptor IR –caracteristici electrice

FIG.58 Receptor IR – spectru si lungime de unda

Blocul emitator cat si cel receptor in infrarosu IR lucreaza la o tensiune maxima de 5V , fiind alimentate de la stabilizatorul general de 5V destinat alimentarii microcontrollerului. In urmatoarea schema se poate observa cum cei doi senzori in infrarosu au fost conectati si utilizati in sistem :

FIG.59 Conectivitatea electrica a senzorilor in sistem

Canalele analogice utilizate in citirea valorilor de pe senzori sunt :

RA0/AN0 -> input analogic citire distanta in infrarosu – senzorul de la baza(1);

RA1/AN1 -> input analogic citire distanta in infrarosu – senzorul de sus(2);

Valorile tensiunilor de iesire ale senzorilor sunt direct proportionale cu raza in infrarosu reflectata si implicit cu distanta pana la obstacol. La baza functionalitatii sistemului sensorial in infrarosu sta divizorul rezistiv de tensiune :

FIG.60 Divizorul rezistiv de tensiune

Extrapoland acest lucru si pastrand functionalitatea , se poate vedea clar faptul ca tensiunea de iesire a modulului va fi cu atat mai mica cu cat raza reflectata in infrarosu este mai puternica.Astfel elemental fotosensibil in infrarosu va lucra in mod dynamic , in sensul ca rezistena dynamica va oscila si implicit tensiunea de iesire odata cu intensitatea razei reflectate in infrarosu. Ulterior , in codul software, managementul si deciziile logice pe care le va lua sistemul se vor baza in mare masura pe valorile primite de la acesti senzori in infrarosu.

Afisarea datelor provenite de la senzori se realizeaza pe LCD-ul alphanumeric dupa ce au fost, in prealabil achizitionate si procesate. Comunicarea LCD-microcontroller se axeaza pe un protocol pe 11 bitit, 8 biti (D0-D7) find biti de date/instructiuni si 3biti (E, R/W, Rs) avand functia de biti de control.Astfel cei 8 biti de de comunicare pot fi folositi ca pachet date dar si ca instructiuni prin setarea corespunzatoare a celor 3 biti de control. Semireglabilul pozitionat in alimentarea LCD-ului este utilizat pentru a varia contrastul LCD-ului alfanumeric prin variatia tensiunii de alimentare pe pinul CONTR al LCD-ului. Conexiunea ICSP este folosita la programarea microcontrollerului si utilizeaza pinii de vpp/ MCLR, PGD, PGC, Vdd si VSS. Comunnicarea dintre modulul electronic si soft-ul de programare (PICkit2) se realizeaza prin conexiune ICPS – USB.

13. Microswitch-urile pentru comenzile de START si STOP

Ca functionalitate pentru sistemul electronic cu microcontroller primeaza comanda utilizatorului pe tot parcursul functionarii. Astfel in momentul in care intreaga platforma robotica este alimentata, se afiseaza pentru inceput o serie de mesaje pe LCD-ul alfanumeric de 16×2, se realizeaza un selftest pentru verificarea functionalitatii sistemelor si se ajunge in final in punctul in care sistemul asteapta apasarea butonului de START sau conectarea prin Bluetooth la sistem si startarea acestuia prin apasarea literei “s”. Ca si conectivitate , cele doua butoane de START si STOP sunt conectate dupa cum se poate observa din schema urmatoare de principiu :

FIG.61 Microswitch-urile decizionale

Din schema electronica de mai sus, se observa faptul ca microswitch-urile se afla integrate in cate un divizor rezistiv de tensiune, pe ramura pozitiva. Astfel , in momentul in care tasta nu este apasata , rezistorul cu functie de pull-down va trage pinul de intrare la masa, sistemul stiind astfel ca nu a aparut nici o cerere de schimbare a functionalitatii curente. Cand tasta a fost apasata , pinul digital de intrare este conectat la tensiunea de alimentare de 5V si sistemul isi intrerupe starea curenta de lucru .

Din punctul de vedere al conectivitatii cu microcontroller-ul, cele doua switch-uri sunt conectate astfel :

Reactia sistemului electronic la apasarea tastei este imediat deoarece aceasta operatie de interogare pe pinii digitali de intrare PORTC bitii 0 si 1 este efectuata in intrerupere cu o frecventa de 60 us :

––––––––––––––––secventa microswith––––––––––––––

––––––––––––––––end secventa microswith––––––––––––-

La fiecare 60 us (program counter-ul) PC sare automat la overflow in functia de intrerupere aflata la adresa 0x0004h unde in permanenta se trateaza starea microswitch-ului de functionalitate. In momentul in care s-a detectat faptul ca acesta este apasat , se schimba automat starea variabilei ce mentine flow-ul sistemului – “start_banda_normal” ca in urmatoarea secventa de cod :

––––––––––––––––––––––––––––––––––––––

––––––––––––––––––––––––––––––––––––––

In functie de aceasta variabila “start_banda_normal”, in programul principal se iau decizii de startare sau oprire a benzii automate. Totodata , asa cum a fost mentionat si anterior in cadrul acestui proiect , comenzile de start si respectiv stop , se pot efectua direct din butoanele de START si STOP sau, daca sistemul de Bluetooth este activat , se poate efectua direct din terminal prin apsarea tastei “s” pentru stratare sau a tastei “p” pentru oprire a benzii, asa cum se poate observa si din figura urmatoare :

–––––––––––––––––––––––––––––––––––––-

–––––––––––––––––––––––––––––––––––––

Dupa cum se poate observa din imaginea de mai sus, in functia de intrerupere in permanenta sunt interrogate butoanele de START si STOP dar , in permaneneta se interogheaza si ce s-a trimis de pe serial catre modulul Bluetooth . Astfel , daca sistemul a receptionat 115 in format zecimal ce inseamna “s” atunci valoarea variabilei start_banda_normal se modifica in valoarea “1” iar in programul principal se schimba functionalitatile-banda incepe sa ruleze. Acelasi lucru se intampla si in momentul in care s-a receptional “112” in format zecimal , ce inseamna “p” – in acest caz valoarea variabilei start_banda_normal devine 0 si banda se va opri.

14. Intreruperile pe TIMER1

Modulul de TIMER1 este un timer/numerator format din 2 registri de 8 biti TMR1H si TMR1L ce pot fi scrisi si cititi. Pentru a se putea utiliza acest timer, se foloseste in proces si registrul INTCON cu setari pe bitii INTCON.GIE si INTCON.PEIE. Bitul PIE1.TMR1IE este setat pentru inceperea intreruperilor iar PIR1.TMR1IF este resetat ,valoarea de start a counter-ului modului TRIMER1 fiind stabilita prin valorile celor 2 registri:

Aceast lucru insemnand inceperea numararii de la valoarea counter-ului 65435 pana la 65535 , deci generarea unei intreruperi la fiecare 100 x 0.5us=50 us. Astfel segmentarea / esantionarea in timpi de lucru se va realiza cu un pas/rezolutie de 50 us us. Prin intermediul TIMER1 se realizeaza software procesul de preluare a semnalelor provenite de la tastatura sistemului compusa din microswitch-uri, interogarea buffer-ului sistemului de comunicatie serial si nu in cele din urma generarea de semnal PWM pentru comanda motorului ce se ocupa cu angrenarea benzii. Ese folosit un semnal de tip PWM pentru comanda motorului de angrenare al benzii pentru a se putea incetini viteza de invartire a acestuia.

15. Descrierea software a sistemului (MIKROC)

Partea software a sitemului a fost realizata in cod C prin intermediul compilatorului Mikroc iar codul inscris in memoria flash a microcontrollertului prin intermediul programului software PICkit2. In ceea ce proveste strict partea software , au fost utilizate variabile globale, functii si proceduri de intrerupere. Variabilele utilizate in codul sursa si tipul acesora :

––––––––––––––-variabile––––––––––––––––––––

int i=0; // contor general

int contor_pw =0; // contor generare semnal PWM in interurpere

int check_ok = 0; // verificare in incoditionare IF

int start_banda_normal =0; // trigger actionare semnal PWM pentru rularea benzii;

int valoare_calibrata_IR_jos=0; // valoare calibrata senzor 1

int valoare_calibrata_IR_sus=0; // valoare calibrata senzor 2

int adc_reading_IR_jos =0; // valoare citita de pe ADC de la senzorul IR 1

int adc_reading_IR_sus=0; // valoare citita de pe ADC de la senzorul IR 2

int contoriz = 0; // contorizare numar de cuburi

int check_if=0; // pentru conditionare

int one_time =0; // pentru conditionare

char uart_rd; // valoare citita de pe UART

char conversion[30]; // conversie pentru afisare pe LCD

char msg[16]; // variabila mesaj afisare pe LCD

const char LCD_txt1[] = "CONVEYER PROJECT";// mesa de interes de afisat pe LCD

const char LCD_txt3[] = " *SELFTEST* "; // mesa de interes de afisat pe LCD

const char LCD_txt4[] = "CHECK BLUETOOTH";// mesa de interes de afisat pe LCD

const char LCD_txt6[] = " CALIBRARE "; // mesa de interes de afisat pe LCD

const char LCD_txt7[] = "––IR–––"; // mesa de interes de afisat pe LCD

const char LCD_txt8[] = "–-cub alb––"; // mesa de interes de afisat pe LCD

const char LCD_txt9[] = "–-CUB ALB––"; // mesa de interes de afisat pe LCD

const char LCD_txt10[]= "–cub negru–-"; // mesa de interes de afisat pe LCD

const char LCD_txt11[]= "–CUB NEGRU–-"; // mesa de interes de afisat pe LCD

const char LCD_txt12[]= " "; // mesa de interes de afisat pe LCD

const char LCD_txt13[] = "CONTOR:"; // mesa de interes de afisat pe LCD

const char LCD_txt133[] = " TIP-CUB "; // mesa de interes de afisat pe LCD

const char LCD_txt14[] ="–BANDA OPRITA–";// mesa de interes de afisat pe LCD

const char UART_txt0[] = " EMPTY"; // mesa de interes de afisat pe LCD

const char UART_txt1[] = " ALB "; // mesa de interes de afisat pe LCD

const char UART_txt2[] = " alb "; // mesa de interes de afisat pe LCD

const char UART_txt3[] = " NEGEU"; // mesa de interes de afisat pe LCD

const char UART_txt4[] = " negru"; // mesa de interes de afisat pe LCD

––––––––––––––––––––––––––––––––––––––

LCD-ul contine un processor propriu dar si memorie CGROM, CGROM, iar programarea microcontrollerului s-a realizat tinand cont de aceste lucruri si utilizand functii predefinite de afisare si control. Functiile corespunzatoare LCD-ului utilizate in proiect sunt :

Configurare display LCD

PIN NUMBER 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16

DESCRIPTION Vss Vdd Vo Rs R/W En D0 D1 D2 D3 D4 D5 D6 D7 BA(+) BLK-()

PIC16F887 Vss Vdd Pot RD7 RD6 RD5 RC7 RC6 RC5 RC4 RC3 RC2 RC1 RC0 Vdd(R) Vss

Configurare software s-a realizat prin intermediul urmatoarei functii predefinite:

––––––––––-LCD16x2 CONFIGURATION–––––

//–––––––-Initializare LCD–––––––––––––//

sbit LCD_RS at RB0_bit;

sbit LCD_EN at RB2_bit;

sbit LCD_D4 at RD3_bit;

sbit LCD_D5 at RD2_bit;

sbit LCD_D6 at RD1_bit;

sbit LCD_D7 at RD0_bit;

sbit LCD_RS_Direction at TRISB0_bit;

sbit LCD_EN_Direction at TRISB2_bit;

sbit LCD_D4_Direction at TRISD3_bit;

sbit LCD_D5_Direction at TRISD2_bit;

sbit LCD_D6_Direction at TRISD1_bit;

sbit LCD_D7_Direction at TRISD0_bit;

––––––––––––––––––––––––––––––––––––

Alte functii utilizate , cu referire la LCD-ul alfanumeric sunt :

––––––––––––––––––––––––––––––––––––––

Lcd_Cmd(Lcd_CLEAR) ; se sterg caracterele de pe LCD

––––––––––––––––––––––––––––––––––––––

Afisare mesaj linia 1, coloana1:

––––––––––––––––––––––––––––––––––––––

strConstCpy(text,mesg1);

Lcd_Out(1,1,text);

––––––––––––––––––––––––––––––––––––––

Mesajele ce ulterior vor fi folosite la rularea sistemului sunt definite astfel :

–––––––––––––––-mesaje pe LCD––––––––––––––––-const char LCD_txt1[] = "CONVEYER PROJECT";

const char LCD_txt3[] = " *SELFTEST* " ;

const char LCD_txt4[] = "CHECK BLUETOOTH";

const char LCD_txt6[] = " CALIBRARE " ;

const char LCD_txt7[] = "––IR–––" ;

const char LCD_txt8[] = "–-cub alb––" ;

const char LCD_txt9[] = "–-CUB ALB––" ;

const char LCD_txt10[]= "–cub negru–-" ;

const char LCD_txt11[]= "–CUB NEGRU–-" ;

const char LCD_txt12[]= " " ;

const char LCD_txt13[] = "CONTOR:" ;

const char LCD_txt133[] = " TIP-CUB " ;

const char LCD_txt14[] ="–BANDA OPRITA–";

const char UART_txt0[] = " EMPTY" ;

const char UART_txt1[] = " ALB " ;

const char UART_txt2[] = " alb " ;

const char UART_txt3[] = " NEGEU" ;

const char UART_txt4[] = " negru" ;

––––––––––––––––––––––––––––––––––––––Functia de afisare a acestor mesaje se realizeaza astfel :

––––––––––––––––––––––––––––––––––––

Lcd_Out(1,1,CopyConst2Ram(msg,LCD_txt1)); // afisare mesaj pe LCD-ul 16×2

––––––––––––––––––––––––––––––––––––––

In aceasta functie , in prima faza se copie mesajul intr-o variabila de tipul char prin functia “CopyConst2Ram” si ulterior se realizeaza afisarea propriuzisa a mesajului la linia si coloana definite prin primele doua variabile ale functiei “Lcd_Out”. Definirea functei de afisare propriuzisa a mesajelor este urmatoarea :

––––––––––––––––––––––––––––––––––––––

Lcd_Out(1,1,CopyConst2Ram(msg,LCD_txt1)); // afisare mesaj pe LCD-ul 16×2

Delay_ms(3000);

Lcd_Cmd(_LCD_CLEAR);

Delay_ms(1000);

Lcd_Out(1,1,CopyConst2Ram(msg,LCD_txt3));

––––––––––––––––––––––––––––––––––––––

Crearea unui character de tip custom ce nu poate fi regasit in memoria microcontrollerului display-ului alfanumeric se realizeaza prin intermediul urmatoarei functii :

––––––––––––––––––––––––––––––––––––––

void CustomChar(const char *def, unsigned char n, char pos_row, char pos_char)

{

char i ;

LCD8_Cmd(64 + n * 8) ;

for(i = 0 ; i<=7 ; i++)

{

LCD8_Chr_Cp(def[i]) ;

}

LCD8_Cmd(LCD_RETURN_HOME) ;

LCD8_Chr(pos_row, pos_char, n) ;

}

––––––––––––––––––––––––––––––––––––––

In prima faza a inceperii programarii se seteaza pinii I/O ce vor fi ulterior folositi in proiect astfel :

––––––––––––––––––––––––––––––––––––––

––––––––––––––––––––––––––––––––––––––

Se utilizeaza AN0-AN1 ca inputuri analogice responsabile cu achizitia semnalelor provenite de la senzori si a AN2-AN3 pentru preluarea semnalelor digitale de intrare.Concomitent cu setare pinilor din PORTA ca pini de intrare (care momentan sunt pini de intrare digitali), se seteaza si registrul ANSEL cu aceleasi valori atribuite port-ului PORTA pentru ca sa se produca modificarea din pini de intrare digitali in pini de intrare analogici.

––––––––––––––––––––––––––––––––––––––

––––––––––––––––––––––––––––––––––––––

Tensiunea de iesire generata pe port-urile anterior setate ca port-uri cu pini de intrare/iesire este 0 la alimentarea microcontrollerului. In proiectul de fata s-a utilizat sistemul de intreruperi pe TIMER1 al microcontrollerului pentru managementul starii curente de functionare a sistemului. Intruperea pe acest timer s-a realizat in modul urmator :

––––––––––––––––-interrupt–––––––––––––––––– ––––––––––––––––––––––––––––––––––––––Registri care intra in alcatuirea mecanismului de intrerupere (intrerupere periferica) pentru TIMER1 sunt:

FIG.62 Registrul INTCON

Registrul T1CON :

FIG.63 Registrul T1CON

Registru PIR1 :

FIG.64 Registrul PIR1

Registrul PIE1 :

FIG.65 Registrul PIE1

Registrii de mentinere a valorii in format digital pe 16 biti a semnalului analogic din intrarea convertorului sunt TMR1H si TMR1L.Ca si functionalitate , TIMER1 module este utilizat in citirea permanenta cu o recurenta de 50us a starii microswitch-urilor , in functie de care se realizeaza navigarea in meniul sistemului automatizat. Astfel , bazandu-ne pe functia de intrerupere apelata automat in mometul unui overflow pe TIMER1 (functie aflata in memorie la adresa 0x004h) se poate observa mecanismul de tratare a starii microswitch-ului:

–––––––––––––functie de intrerupere––––––––––––

//–––––-intrerupere generata pe TIMER1––––––––––-//

void interrupt (){

if(start_banda_normal ==1 ){

PORTC.f2 = 1 ;

}

if(start_banda_normal ==0 ){

PORTC.f2 = 0 ;

PORTC.f3 = 1 ;

}

if (uart_rd == 115) // start banda prin bt

start_banda_normal = 1;

if (uart_rd == 112) // stop banda prin bt

start_banda_normal = 0;

if (PORTC.f0) // start banda prin buton albastru

{

start_banda_normal = 1;

uart_rd = 1;

}

if (PORTC.f1){ // stop banda prin buton rosu

start_banda_normal = 0;

uart_rd = 0;

}

//–––––––-testat banda rulare PWM = ok––––––––-//

if (start_banda_normal == 1 ){

contor_pw = contor_pw+1;

if (contor_pw < 50)

{

PORTD.f4 = 0; // pwm motor banda

PORTC.f5 = 0;

PORTC.f4 = 0;

}

if (contor_pw >=50 && contor_pw<100)

{

PORTD.f4 = 1; // pwm motor banda

PORTC.f5 = 0;

PORTC.f4 = 1;

}

if (contor_pw>=100)

contor_pw = 0;

}

else {

PORTD.f4 = 0;

PORTC.f5 = 0;

PORTC.f4 = 0;

}

//

PIR1.TMR1IF = 0;

TMR1H = 0b11111111;

TMR1L = 0b10011011;

}

––––––––––––––––––––––––––––––––––––––

Bazandu-ne pe codul sursa mai sus expus si referindu-ne strict la tratare starii microswith-urilor , se poate observa ca sistemul , la fiecare salt in intrerupere cu o recurenta de 50 us testeaza daca s-a apasat microswitch-ul. Tinand cont de starea in care se afla sistemul in meniul de baza exprimat prin variabila check se efectueaza modificarea variabilei “start_banda_normal” :

––––––––––––––––––––––––––––––––––––––

––––––––––––––––––––––––––––––––––––––

Aceste variabile , dupa ce program counter-ul PC revine in programul de baza , sunt analizate si in functie de acestea , prin intermediul unor brench-uri si conditionari de tip “ IF “ sistemul stie sa isi schimbe status-ul current.

16. Descrierea functionalitatii software

In prima faza de startare a sistemului , se initializeaza LCD-ul alfanumeric si comunicatia serial UART :

––––––––––––––––––––––––––––––––––––––

Ulteiror se afiseaza mesajul de tipul :

In etapa imediat urmatoare se intitiaza procedura de “SELFTEST” in care sistemul isi verifica functionalitatea senzorilor si a mecasnismelor de actionare :

//––––––––-SELFTEST pe LED rosu-albastru–––––––//

for (i=1;i<10;i++){

PORTC.f2 = 0 ;

PORTC.f3 = 1 ;

Delay_ms(50) ;

PORTC.f2 = 1 ;

PORTC.f3 = 0 ;

Delay_ms(50) ;

PORTC.f2 = 1 ;

PORTC.f3 = 1 ;

Delay_ms(50) ;

}

PORTC.f2 = 0 ; // reset 0L on LED's

PORTC.f3 = 0 ; // reset 0L on LED's

//–––––––-TEST BANDA RULANTA LA STARTARE SISTEM––––––//

PORTD.f4 =1 ; // rulare banda sens- backward

PORTC.f5 = 1 ;

PORTC.f4 = 0 ;

Delay_ms(1000); // STOP

PORTD.f4 = 0 ;

PORTC.f5 = 0 ;

PORTC.f4 = 0 ;

Delay_ms(1000); // rulare banda sens- forward

PORTD.f4 = 1 ;

PORTC.f5 = 0 ;

PORTC.f4 = 1 ;

Delay_ms(1000); // STOP

PORTD.f4 = 0 ;

PORTC.f5 = 0 ;

PORTC.f4 = 0 ;

//––––––––TEST SELECTOR LA STARTARE SISTEM–––––––//

while (! PORTA.f3 ){

PORTD.f7 = 1 ; // pwm- motor selectie

PORTD.f5 = 0 ;

PORTD.f6 = 1 ;

Delay_us(2000);

PORTD.f7 = 0 ; // pwm- stop motor selectie

PORTD.f5 = 0 ;

PORTD.f6 = 0 ;

Delay_us(3000);

}

PORTD.f7 = 0 ; // stop motor selectie

PORTD.f5 = 0 ;

PORTD.f6 = 0 ;

Delay_ms(3000);

while (! PORTA.f2 ){

PORTD.f7 = 1; // pwm- motor selectie

PORTD.f5 = 1;

PORTD.f6 = 0;

Delay_us(2000);

PORTD.f7 = 0; // pwm- stop motor banda

PORTD.f5 = 0;

PORTD.f6 = 0;

Delay_us(3000);

}

PORTD.f7 = 0; // stop motor banda

PORTD.f5 = 0;

PORTD.f6 = 0;

Din acest moment sistemul ajunge intr-o bluca in care , pentru a incepe startarea benzii si a tuturor sistemelor , se astepta input-ul utilizatorului care poate fi definit ori prin apasare butonului de “START” ori conectarea prin Bluetooth la sistem si apoi apasarea tastei “s”:

––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––

––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––

Din acest moment se incepe procedura de calibrare a senzorilor si se activeaza timer-ul TIMER 1 astfel :

–––––––––––––––––––––––––––––––––––––

Se ajusteaza pozitia selectorului pe cuburi mici(stanga) si se afiseaza pentru inceput mesajul “contor”

–––––––––––––––––––––––––––––––––––––

Atat timp cat nu se detecteaza nici un cub , contorul ce numara cuburile nu se incrementeaza sip e LCD se afiseaza un mesaj nul :

Functia in programul principal pentru detectia si afisarea pe LCD a tipului de cub negru mic sau mare este :

//––––––––––––cub negru mic-MARE–––––––––––

if ((adc_reading_IR_jos > (valoare_calibrata_IR_jos+60)) && (adc_reading_IR_jos < (valoare_calibrata_IR_jos+140))){ // testat ok

Delay_ms(300);

if ((adc_reading_IR_sus > (valoare_calibrata_IR_sus+10)) && (adc_reading_IR_sus < (valoare_calibrata_IR_sus+200))) // testat ok

{

if (!check_if){

contoriz ++;

check_if++;

}

PORTC.f3 = 1 ;

Lcd_Out(1,1,CopyConst2Ram(msg,LCD_txt11));

}

else

{

if (!check_if){

contoriz++;

check_if++;

}

PORTC.f3 = 1 ;

Lcd_Out(1,1,CopyConst2Ram(msg,LCD_txt10));

}

}

––––––––––––––––––––––––––––––––––––––Definirea functiei de detective a cubului alb mic sau mare pe baza informatiei provenite de la senzorii in infrarosu , este:

//––––––––cub alb mic-MARE–––––––––––-//

if (adc_reading_IR_jos > (valoare_calibrata_IR_jos+450)){ // testat ok

if (adc_reading_IR_sus > (valoare_calibrata_IR_sus+450)) // testat ok

{

if (!check_if){

contoriz++;

check_if++;

}

PORTC.f3 = 1 ;

Lcd_Out(1,1,CopyConst2Ram(msg,LCD_txt9));

}

else

{

if (!check_if){

contoriz++;

check_if++;

}

PORTC.f3 = 1 ;

Lcd_Out(1,1,CopyConst2Ram(msg,LCD_txt8));

}

}

if ((adc_reading_IR_jos >= (valoare_calibrata_IR_jos+60)) && (adc_reading_IR_sus > (valoare_calibrata_IR_sus+60))){

while (! PORTA.f3 && !one_time ){

PORTD.f7 = 1; // pwm motor banda

PORTD.f5 = 0;

PORTD.f6 = 1;

Delay_us(200);

PORTD.f7 = 0; // pwm motor banda

PORTD.f5 = 0;

PORTD.f6 = 0;

Delay_us(10);

}

one_time = 1 ;

}

if ((adc_reading_IR_jos >= (valoare_calibrata_IR_jos+60)) && (adc_reading_IR_sus <= (valoare_calibrata_IR_sus+5))){

while (! PORTA.f2 && (one_time==1) ){

PORTD.f7 = 1; // pwm motor banda

PORTD.f5 = 1;

PORTD.f6 = 0;

Delay_us(200);

PORTD.f7 = 0; // pwm motor banda

PORTD.f5 = 0;

PORTD.f6 = 0;

Delay_us(10);

}

one_time = 0;

}

while (!start_banda_normal ){

if (UART1_Data_Ready()== 1)

uart_rd = UART1_Read(); // read the received data

Lcd_Out(1,1,CopyConst2Ram(msg,LCD_txt14));

}

}

}

––––––––––––––––––––––––––––––––––––––Functia de intrerupere in care se determina starea butoanelor , se genereaza semnalul PWM pentru comanda motorului de angrenare-banda si nu in cele din urma , se realizeaza un check pe comunicatia seriala, este urmatoarea :

//–––––-intrerupere generata pe TIMER1––––––––––-//

void interrupt (){

if(start_banda_normal ==1 ){

PORTC.f2 = 1 ; // comentat LED rosu ca sa nu fie intrerupt atunci cand detecteaza cubul

}

if(start_banda_normal ==0 ){

PORTC.f2 = 0 ;

PORTC.f3 = 1 ;

}

if (uart_rd == 115) // start banda prin bt

start_banda_normal = 1;

if (uart_rd == 112) // stop banda prin bt

start_banda_normal = 0;

if (PORTC.f0) // start banda prin buton albastru

{

start_banda_normal = 1;

uart_rd = 1;

}

if (PORTC.f1){ // stop banda prin buton rosu

start_banda_normal = 0;

uart_rd = 0;

}

//–––––––-testat banda rulare PWM = ok––––––––-//

if (start_banda_normal == 1 ){

contor_pw = contor_pw+1;

if (contor_pw < 50)

{

PORTD.f4 = 0; // pwm motor banda

PORTC.f5 = 0;

PORTC.f4 = 0;

}

if (contor_pw >=50 && contor_pw<100)

{

PORTD.f4 = 1; // pwm motor banda

PORTC.f5 = 0;

PORTC.f4 = 1;

}

if (contor_pw>=100)

contor_pw = 0;

}

else {

PORTD.f4 = 0;

PORTC.f5 = 0;

PORTC.f4 = 0;

}

PIR1.TMR1IF = 0;

TMR1H = 0b11111111;

TMR1L = 0b10011011;

}

–––––––––––––––––––––––––––––––––-

17. CALCULUL FIABILITATII

Fiabilitatea este o disciplina din domeniul ingineriei care utilizeaza cunostinte stiintifice pentru asigurarea unor performante ridicate ale functiilor unui echipament, într-un anumit interval de timp si conditii de exploatare bine precizate. Aceasta include proiectarea, abilitatea de a întretine, de a testa si a mentine echipamentul la parametri acceptabili pe toata durata ciclului de viata. Fiabilitatea unui echipament este descrisa cel mai bine de pastrarea performantelor acestuia în timp. Performantele de fiabilitate ale unui echipament sunt concretizate în faza de proiectare prin alegerea judicioasa a arhitecturii echipamentului, a materialelor, a procesului de fabricatie, a componentelor – atât soft cât si hard – urmate de verificarea rezultatelor obtinute în urma simularilor si a testelor de laborator.

Fiabilitatea este un atribut al echipamentelor care nu trebuie ignorat. Caracteristicile de fiabilitate reprezinta ”ingredientele” critice pentru orice activitate de proiectare a echipamentelor industriale. Este de preferat sa se tina cont de aspectele legate de fiabilitate înca din faza de proiectare decât sa nu se faca acest lucru în speranta ca lucrurile vor merge bine.
Aparitia unei teorii a fiabilitatii a fost determinata de cresterea complexitatii echipamentelor si de caracterul de masa al productiei moderne. Domeniul care a impulsionat dezvoltarea acestei discipline a fost, ca si în alte cazuri, cel militar întrucât în timpul celui de-al doilea razboi mondial s-a constatat ca echipamentele electronice complexe (echipamente de radiocomunicatii, sonare etc.) se aflau în stare de defectare un timp sensibil mai mare decât timpul de functionare normala. Pe baza solutiilor oferite de catre aceasta noua disciplina – fiabilitatea – au fost posibile progrese mari si în alte domenii de activitate, precum centralele nucleare, transporturile (navale, terestre, aeriene si în ultimul timp spatiale), prelucrarea si transmisia datelor, productia bunurilor de larg consum etc.
Dupa trecerea de la productia manufacturiera la productia de masa s-a constatat o marire a dispersiei parametrilor echipamentelor datorata atât cresterii complexitatii cât si micsorarii posibilitatilor de control interfazic pe liniile de productie. În cazul productiei de masa, datorita modificarilor rapide ale cerintelor tehnice, se constata ca nu este necesar întotdeauna sa se obtina un nivel maxim posibil de fiabilitate, ci este esential sa se cunoasca cu precizie care este nivelul real de fiabilitate, luându-se masuri pentru deplasarea acestuia catre o valoare optima. În decursul timpului s-a constat ca, în cazul sistemelor si echipamentelor complexe, oricât s-ar investi pentru a obtine o fiabilitate ideala, nu se poate obtine un echipament care sa nu se degradeze în timp. Din aceasta cauza este util sa se cunoasca nivelul real al fiabilitatii, astfel încât, în functie de acesta, sa se stabileasca durata misiunii, intervalele de revizie, structura echipamentului etc.
Fiabilitatea este unul dintre parametrii determinanti pentru competitivitatea unui produs, întrucât gradul de vandabilitate creste semnificativ pentru produsele fiabile. Este de subliniat faptul ca în programul de actiuni lansate de Guvernul României la sfârsitul lunii august 2001 pentru cresterea exporturilor (si reducerea deficitului comercial al tarii), una dintre masurile propuse se refera la cresterea fiabilitatii produselor

Din punct de vedere economic, cu cât un echipament prezinta o fiabilitate mai

ridicata, în conditii tehnologice date, costul de investitie Cî este mai ridicat; costurile de mentenanta CM sunt însa mici întrucât defectiunile sunt rare si de intensitate redusa. Invers, un echipament ieftin si putin fiabil implica niste costuri de mentenanta mai mari.

FIG.66

Un sistem est de tip paralel daca functionarea unui singur component este suficienta pentru functionarea sistemului. În acest caz, sistemul va fi în pana (defect) daca toate elementele sunt defecte. Cum S este evenimentul sistemul functioneaza, vom spune ca S este evenimentul sistemul nu functioneaza. Vom avea:

FIG.67

In cazul de fata modulul electronic face parte din clasa sistemelelor serie-paralel (mixte), deoarece , la o defectare a unei componente, exista probabilitatea ca sistemul sa nu mai functioneze(de exemplu, la defectarea microcontrollerului sau a stabilizatorului de tensiune 7805 sau a quartz-ului). In acelasi timp , in ceea ce proveste partea de senzoristica, defectarea unui senzor nu i-ar pune probleme sistemului deoarece acesta va functiona normal cu semnalele provenite de la ceilalti senzori, lucru ce face ca sistemul sa fie de tipul mixt.

Fiabilitatea sistemului electronic depinde in foarte mare masura de calitatea si specificatiile componentelor alese in procesul de dezvoltare hardware-software. Calitatea componentelor difera de la producator la producator si este de cele mai multe ori proportionala cu pretul acestora.

18. CODUL SURSA C- mediu de dezvoltare MIKROC

/*

–––––––––––DSCRIERE PROIECT BANDA RULANTA–––––––––-

-Ruleaza mesaje de informare/avertizare pe LCD-ul alfanumeric de 16×2 caractere;

-Ruleaza la startare un program de selftest pentru verificarea functionalitatii sistemelor;

-Conectare la bluetooth cu afisare si posibilitate de start-sotop;

-Senzorii in infrarosu detecteaza dimensiunea si culoarea unui cub;

-Rularea benzii si selectorul au la baza motoarele DC;

-Contorizarea numarului de cuburi si afisarea pe LCD si pe teminal;

-LED-uri de avertizare-informare de culoare albastra si rosie;

-Banda rulanta poate if oprita din butoanele de comanda si din terminal-bluetooth;

–––––––––––-SETARI De LUCRU–––––––––––––––-

1.a. INPUT-URI ANALOGICE

RA0/AN0 -> input analogic citire distanta in infrarosu – senzorul de la baza(1);

RA1/AN1 -> input analogic citire distanta in infrarosu – senzorul de sus(2);

1.b. INPUT-URI DIGITALE

RA2 -> encoder -capat de cursa stanga;

RA3 -> encoder -capat de cursa dreapta;

RC0 -> microswitch de comanda START;

RC1 -> microswitch de comanda STOP;

2. OUTPUT-URI

RC2 -> LED albastru;

RC3 -> LED rosu;

RD7 -> MOTOR DRIVER ENABLE 1 – pentru selector;

RD6 -> MOTOR DRIVER INPUT 1 – pentru selector;

RD5 -> MOTOR DRIVER INPUT 2 – pentru selector;

RD4 -> MOTOR DRIVER ENABLE 2 – pentru rulare banda;

RC5 -> MOTOR DRIVER INPUT 3 – pentru rulare banda;

RC4 -> MOTOR DRIVER INPUT 4 – pentru rulare banda;

3. CONFIGURARE LCD ALFANUMERIC

PIN NUMBER 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16

DESCRIPTION Vss Vdd Vo Rs R/W En D0 D1 D2 D3 D4 D5 D6 D7 BA(+) BLK-()

PIC16F887 Vss Vdd Pot RB0 GND RB2 GND GND GND GND RD3 RD2 RD1 RD0 Vdd(R) Vss

4. MODUL BLUETOOTH UART

PIN NUMBER 1 2 3 4 5 6

DESCRIPTION WUP VCC GND TXD RXD STS

PIC16F887 NC VCC GND RX(RC7) TX(RC6) NC

*/

int i=0; // contor general

int contor_pw =0; // contor generare semnal PWM in interurpere

int check_ok = 0; // verificare in incoditionare IF

int start_banda_normal =0; // trigger actionare semnal PWM pentru rulare

int valoare_calibrata_IR_jos=0; // valoare calibrata senzor 1

int valoare_calibrata_IR_sus=0; // valoare calibrata senzor 2

int adc_reading_IR_jos =0; // valoare citita de pe ADC de la senzorul IR 1

int adc_reading_IR_sus=0; // valoare citita de pe ADC de la senzorul IR 2

int contoriz = 0; // contorizare numar de cuburi

int check_if=0; // pentru conditionare

int one_time =0; // pentru conditionare

char uart_rd; // valoare citita de pe UART

char conversion[30]; // conversie pentru afisare pe LCD

char msg[16]; // variabila mesaj afisare pe LCD

const char LCD_txt1[] = "CONVEYER PROJECT";// mesa de interes de afisat pe LCD

const char LCD_txt3[] = " *SELFTEST* "; // mesa de interes de afisat pe LCD

const char LCD_txt4[] = "CHECK BLUETOOTH";// mesa de interes de afisat pe LCD

const char LCD_txt6[] = " CALIBRARE "; // mesa de interes de afisat pe LCD

const char LCD_txt7[] = "––IR–––"; // mesa de interes de afisat pe LCD

const char LCD_txt8[] = "–-cub alb––"; // mesa de interes de afisat pe LCD

const char LCD_txt9[] = "–-CUB ALB––"; // mesa de interes de afisat pe LCD

const char LCD_txt10[]= "–cub negru–-"; // mesa de interes de afisat pe LCD

const char LCD_txt11[]= "–CUB NEGRU–-"; // mesa de interes de afisat pe LCD

const char LCD_txt12[]= " "; // mesa de interes de afisat pe LCD

const char LCD_txt13[] = "CONTOR:"; // mesa de interes de afisat pe LCD

const char LCD_txt133[] = " TIP-CUB "; // mesa de interes de afisat pe LCD

const char LCD_txt14[] ="–BANDA OPRITA–";// mesa de interes de afisat pe LCD

const char UART_txt0[] = " EMPTY"; // mesa de interes de afisat pe LCD

const char UART_txt1[] = " ALB "; // mesa de interes de afisat pe LCD

const char UART_txt2[] = " alb "; // mesa de interes de afisat pe LCD

const char UART_txt3[] = " NEGEU"; // mesa de interes de afisat pe LCD

const char UART_txt4[] = " negru"; // mesa de interes de afisat pe LCD

void Lcd8_data_write1 (int , int , int ); // declaratie functie de afisare pe LCD

//–––––––-Initializare LCD–––––––––––––//

sbit LCD_RS at RB0_bit;

sbit LCD_EN at RB2_bit;

sbit LCD_D4 at RD3_bit;

sbit LCD_D5 at RD2_bit;

sbit LCD_D6 at RD1_bit;

sbit LCD_D7 at RD0_bit;

sbit LCD_RS_Direction at TRISB0_bit;

sbit LCD_EN_Direction at TRISB2_bit;

sbit LCD_D4_Direction at TRISD3_bit;

sbit LCD_D5_Direction at TRISD2_bit;

sbit LCD_D6_Direction at TRISD1_bit;

sbit LCD_D7_Direction at TRISD0_bit;

//–––––––FUNCTIE ELIBERARE RAM LA AFISARE PE LCD––––––//

// copy const to ram string

char * CopyConst2Ram(char * dest, const char * src){

char * d ;

d = dest;

for(;*dest++ = *src++;);

return d;

*dest = 0;

}

//–––––––––WRITE VALUE TO LCD–––––––––––––//

void Lcd8_data_write1 (int linie, int coloana, int valoare)

{

IntToStr(valoare, msg);

Lcd_Out(linie, coloana , msg);

}

//––––––––––––––––––––––––––––––-//

void main() {

//––––––––––PORT SETTINGS––––––––––––––//

ANSEL = 0b00000011; // SETARI – intrari analogice

ANSELH = 0; // SETARI – intrari analogice

TRISA = 0b00001111; // SETARI – INPUT/OUTPUT pe TRISA

TRISC = 0b10000011; // SETARI – INPUT/OUTPUT pe TRISC

TRISB = 0b00000000; // SETARI – INPUT/OUTPUT pe TRISB

TRISD = 0b00000000; // SETARI – INPUT/OUTPUT pe TRISD

TRISE = 0b00000000; // SETARI – INPUT/OUTPUT pe TRISE

PORTD = 0b00000000; // SETARI – INPUT/OUTPUT pe TRISD

//––––––––––––––––––––––––––––––-//

PORTD.f6 =0; // set on 0 all output's

PORTD.f5 =0; // set on 0 all output's

PORTD.f4 =0; // set on 0 all output's

PORTD.f3 =0; // set on 0 all output's

//––––––––-SETARI INTRERUPERE TIMER1––––––––––//

INTCON.GIE = 1; //enable all un-masked interrupts

INTCON.PEIE = 1; //Set PEIE

T1CON = 1; //enable Timer1

PIR1.TMR1IF = 0; // setat pe 50us (60 pe osciloscop)

TMR1H = 0b11111111;

TMR1L = 0b10011011;

PIE1.TMR1IE = 0; // disable Timer1 interrupt

//–––––––––––––––––––––––––––––––-//

PORTC.f5 = 0; // 0 pe driver-ul pentru comanda motoarelor

PORTC.f4 = 0; // 0 pe driver-ul pentru comanda motoarelor

PORTD.f6 = 0; // 0 pe driver-ul pentru comanda motoarelor

PORTD.f5 = 0; // 0 pe driver-ul pentru comanda motoarelor

PORTC.f2 = 0; // 0 pe driver-ul pentru comanda motoarelor

PORTC.f3 = 0; // 0 pe driver-ul pentru comanda motoarelor

//–––––––––INIT LCD–––––––––––––––––––//

Lcd_Init(); // functie de intitializre LCD

Lcd_Cmd(_LCD_CLEAR); // functie Clear display

Lcd_Cmd(_LCD_CURSOR_OFF); // functie Cursor off

//–––––––––SETARE UART–––––––––––––––––-//

UART1_Init(9600); // Initialize UART module at 9600 bps

Delay_ms(100); // Wait for UART module to stabilize

//–––––––––MESAJE DE INTAMPINARE PE LCD–––––––––//

Lcd_Out(1,1,CopyConst2Ram(msg,LCD_txt1)); // afisare mesaj pe LCD-ul 16×2

Delay_ms(3000);

Lcd_Cmd(_LCD_CLEAR);

Delay_ms(1000);

Lcd_Out(1,1,CopyConst2Ram(msg,LCD_txt3)); // afisare mesaj pe LCD-ul 16×2

//––––––––-SELFTEST pe LED rosu-albastru––––––––––//

for (i=1;i<10;i++){

PORTC.f2 = 0 ;

PORTC.f3 = 1 ;

Delay_ms(50) ;

PORTC.f2 = 1 ;

PORTC.f3 = 0 ;

Delay_ms(50) ;

PORTC.f2 = 1 ;

PORTC.f3 = 1 ;

Delay_ms(50) ;

}

PORTC.f2 = 0 ; // reset 0L on LED's

PORTC.f3 = 0 ; // reset 0L on LED's

//–––––––-TEST BANDA RULANTA LA STARTARE SISTEM––––––//

PORTD.f4 =1 ; // rulare banda sens- backward

PORTC.f5 = 1 ;

PORTC.f4 = 0 ;

Delay_ms(1000); // STOP

PORTD.f4 = 0 ;

PORTC.f5 = 0 ;

PORTC.f4 = 0 ;

Delay_ms(1000); // rulare banda sens- forward

PORTD.f4 = 1 ;

PORTC.f5 = 0 ;

PORTC.f4 = 1 ;

Delay_ms(1000); // STOP

PORTD.f4 = 0 ;

PORTC.f5 = 0 ;

PORTC.f4 = 0 ;

//––––––––TEST SELECTOR LA STARTARE SISTEM–––––––––//

while (! PORTA.f3 ){

PORTD.f7 = 1 ; // pwm- motor selectie

PORTD.f5 = 0 ;

PORTD.f6 = 1 ;

Delay_us(2000);

PORTD.f7 = 0 ; // pwm- stop motor selectie

PORTD.f5 = 0 ;

PORTD.f6 = 0 ;

Delay_us(3000);

}

PORTD.f7 = 0 ; // stop motor selectie

PORTD.f5 = 0 ;

PORTD.f6 = 0 ;

Delay_ms(3000);

while (! PORTA.f2 ){

PORTD.f7 = 1; // pwm- motor selectie

PORTD.f5 = 1;

PORTD.f6 = 0;

Delay_us(2000);

PORTD.f7 = 0; // pwm- stop motor banda

PORTD.f5 = 0;

PORTD.f6 = 0;

Delay_us(3000);

}

PORTD.f7 = 0; // stop motor banda

PORTD.f5 = 0;

PORTD.f6 = 0;

//––––––––CONECTIVITATE BLUETOOTH––––––––––––-//

Lcd_Cmd(_LCD_CLEAR);

Lcd_Out(1,1,CopyConst2Ram(msg,LCD_txt4));

Delay_ms(1000);

while (! PORTC.f0 && !check_ok ){

if (UART1_Data_Ready()== 1) { // If data is received,

uart_rd = UART1_Read(); // read the received data,

if (uart_rd == 115) // daca e 's' start

check_ok = 1 ;

}

}

check_ok = 0 ;

Lcd_Cmd(_LCD_CLEAR);

Lcd_Cmd(_LCD_CLEAR);

//––––––-start banda rulare slow regim PWM–––––––––––––//

start_banda_normal = 1;

//––––––-calibrare senzori infrarosu––––––––––––––––//

Lcd_Out(1,1,CopyConst2Ram(msg,LCD_txt6)); // afisare mesaj pe LCD

Lcd_Out(2,1,CopyConst2Ram(msg,LCD_txt7)); // afisare mesaj pe LCD

Delay_ms(3000);

adc_reading_IR_jos= ADC_Read(0); // citire IR sensor 1

valoare_calibrata_IR_jos = adc_reading_IR_jos;

adc_reading_IR_sus= ADC_Read(1); // citire IR sensor 2

valoare_calibrata_IR_sus = adc_reading_IR_sus;

Delay_ms(3000);

Lcd_Cmd(_LCD_CLEAR);

Lcd8_data_write1(1, 1,valoare_calibrata_IR_jos); // afisare valoare calibrata IR1

Lcd8_data_write1(1,10,valoare_calibrata_IR_sus); // afisare valoare calibrata IR2

//–––––––START TIMER 1 interrupt––––––––––––––––//

PIE1.TMR1IE = 1;

//––––––-setare pozitie initiala = cuburi mici––––––––––––-//

while (! PORTA.f2){

PORTD.f7 = 1; // pwm DUTY CYCLE motor banda

PORTD.f5 = 1;

PORTD.f6 = 0;

Delay_us(200);

PORTD.f7 = 0; // pwm OFF motor banda

PORTD.f5 = 0;

PORTD.f6 = 0;

Delay_us(10) ;

}

//––––––afisare mesaj contorizare––––––––––––––––//

Lcd_Out(2,1,CopyConst2Ram(msg,LCD_txt13));

UART1_Write(10); //0x0A is ascii for new line for UART

UART1_Write(13); //0x0A is ascii for new line for UART

while (1) {

UART1_Write('\r'); // scriere pe aceeasi linie pe UART

Uart1_Write_Text(CopyConst2Ram(msg,LCD_txt13));

InttoStr(contoriz,conversion);

UART1_Write_Text( conversion);

if (UART1_Data_Ready()== 1) // daca s-a receptionat DATA pe UART

uart_rd = UART1_Read(); // read the received data

Lcd8_data_write1(2,11,contoriz);

adc_reading_IR_jos= ADC_Read(0);

adc_reading_IR_sus= ADC_Read(1);

if ((adc_reading_IR_jos >= (valoare_calibrata_IR_jos-10)) && (adc_reading_IR_jos < (valoare_calibrata_IR_jos+10))){ // testat ok

if ((adc_reading_IR_sus >= (valoare_calibrata_IR_sus-10)) && (adc_reading_IR_sus < (valoare_calibrata_IR_sus+10))) // testat ok

{

PORTC.f3 = 0 ;

Lcd_Out(1,1,CopyConst2Ram(msg,LCD_txt12));

check_if = 0;

}

}

//–––––––––-cub negru mic-MARE–––––––––––––––//

if ((adc_reading_IR_jos > (valoare_calibrata_IR_jos+60)) && (adc_reading_IR_jos < (valoare_calibrata_IR_jos+140))){ // testat ok

Delay_ms(300);

if ((adc_reading_IR_sus > (valoare_calibrata_IR_sus+10)) && (adc_reading_IR_sus < (valoare_calibrata_IR_sus+200))) // testat ok

{

if (!check_if){

contoriz ++;

check_if++;

}

PORTC.f3 = 1 ;

Lcd_Out(1,1,CopyConst2Ram(msg,LCD_txt11));

}

else

{

if (!check_if){

contoriz++;

check_if++;

}

PORTC.f3 = 1 ;

Lcd_Out(1,1,CopyConst2Ram(msg,LCD_txt10));

}

}

//––––––––cub alb mic-MARE––––––––––––––––––//

if (adc_reading_IR_jos > (valoare_calibrata_IR_jos+450)){ // testat ok

if (adc_reading_IR_sus > (valoare_calibrata_IR_sus+450)) // testat ok

{

if (!check_if){

contoriz++;

check_if++;

}

PORTC.f3 = 1 ;

Lcd_Out(1,1,CopyConst2Ram(msg,LCD_txt9));

}

else

{

if (!check_if){

contoriz++;

check_if++;

}

PORTC.f3 = 1 ;

Lcd_Out(1,1,CopyConst2Ram(msg,LCD_txt8));

}

}

if ((adc_reading_IR_jos >= (valoare_calibrata_IR_jos+60)) && (adc_reading_IR_sus > (valoare_calibrata_IR_sus+60))){

while (! PORTA.f3 && !one_time ){

PORTD.f7 = 1; // pwm motor banda

PORTD.f5 = 0;

PORTD.f6 = 1;

Delay_us(200);

PORTD.f7 = 0; // pwm motor banda

PORTD.f5 = 0;

PORTD.f6 = 0;

Delay_us(10);

}

one_time = 1 ;

}

if ((adc_reading_IR_jos >= (valoare_calibrata_IR_jos+60)) && (adc_reading_IR_sus <= (valoare_calibrata_IR_sus+5))){

while (! PORTA.f2 && (one_time==1) ){

PORTD.f7 = 1; // pwm motor banda

PORTD.f5 = 1;

PORTD.f6 = 0;

Delay_us(200);

PORTD.f7 = 0; // pwm motor banda

PORTD.f5 = 0;

PORTD.f6 = 0;

Delay_us(10);

}

one_time = 0;

}

while (!start_banda_normal ){

if (UART1_Data_Ready()== 1)

uart_rd = UART1_Read(); // read the received data

Lcd_Out(1,1,CopyConst2Ram(msg,LCD_txt14));

}

}

}

//–––––-intrerupere generata pe TIMER1–––––––––––––––//

void interrupt (){

if(start_banda_normal ==1 ){

PORTC.f2 = 1 ; // comentat LED rosu ca sa nu fie intrerupt atunci cand detecteaza cubul

}

if(start_banda_normal ==0 ){

PORTC.f2 = 0 ;

PORTC.f3 = 1 ;

}

if (uart_rd == 115) // start banda prin bt

start_banda_normal = 1;

if (uart_rd == 112) // stop banda prin bt

start_banda_normal = 0;

if (PORTC.f0) // start banda prin buton albastru

{

start_banda_normal = 1;

uart_rd = 1;

}

if (PORTC.f1){ // stop banda prin buton rosu

start_banda_normal = 0;

uart_rd = 0;

}

//–––––––-testat banda rulare PWM = ok––––––––––––––//

if (start_banda_normal == 1 ){

contor_pw = contor_pw+1;

if (contor_pw < 50)

{

PORTD.f4 = 0; // pwm motor banda

PORTC.f5 = 0;

PORTC.f4 = 0;

}

if (contor_pw >=50 && contor_pw<100)

{

PORTD.f4 = 1; // pwm motor banda

PORTC.f5 = 0;

PORTC.f4 = 1;

}

if (contor_pw>=100)

contor_pw = 0;

}

else {

PORTD.f4 = 0;

PORTC.f5 = 0;

PORTC.f4 = 0;

}

//–––––––––––––––––––––––––––––––––//

PIR1.TMR1IF = 0;

TMR1H = 0b11111111;

TMR1L = 0b10011011;

}

//–––––––––––––––––––––––––––––––––//

Bibliografie

www.seattlerobotics.org/guide/servos.html

www.seattlerobotics.org/guide/servohack.html

www.cs.uiowa.edu/~jones/step/index.html

www.repairfaq.org/filipg/RC/F_Servo101.html

www.hut.fi/Misc/Electronics/

www.boondog.com\tutorials\tutorials.htm

www.eg3.com/ee/robotics.htm

http://members.tripod.com/RoBoJRR/reference.htm

http://rvl.www.ecn.purdue.edu/RVL/mobile-robot-nav/mobile-robot-nav.html

www.rentron.com/.

www.tabrobotkit.com.

www.robotics.com/arobot/sonar.html.

www.hompro.com/techkids/..

Bibliografie

www.seattlerobotics.org/guide/servos.html

www.seattlerobotics.org/guide/servohack.html

www.cs.uiowa.edu/~jones/step/index.html

www.repairfaq.org/filipg/RC/F_Servo101.html

www.hut.fi/Misc/Electronics/

www.boondog.com\tutorials\tutorials.htm

www.eg3.com/ee/robotics.htm

http://members.tripod.com/RoBoJRR/reference.htm

http://rvl.www.ecn.purdue.edu/RVL/mobile-robot-nav/mobile-robot-nav.html

www.rentron.com/.

www.tabrobotkit.com.

www.robotics.com/arobot/sonar.html.

www.hompro.com/techkids/..

Similar Posts