Proiectarea Si Realizarea Unei Retele de Telemetrie Care Opereaza In Banda 433 Mhz

Introducere

Domeniul telecomunicatiilor este unul foarte vast, nascut din necesitatea omului de a comunica pe distante care depaseau raza de actiune a simturilor. De-a lungul timpului, aceasta “comunicare la distanta” nu s-a limitat la unde electromagnetice, ci a constat si in semnale luminoase, semnalizari cu ajutorul fumului (cum este si cazul traditiei statului Vatican), secvente de sunete produse cu ajutorul unor instrumente speciale, s.a.m.d..

In era moderna, telecomunicatiile au insemnat telegraf, radio, telefonie, televiziune, teledetectie, si nu numai. Fiecare dintre aceste domenii este destul de vast, fiind guvernat de principii, metode, functii si standarde specifice sau comune cu ale altor domenii de telecomunicatii. De asemenea, mediile si metodele de propagare au evoluat.

Intr-un domeniu relativ nou, cel al retelelor de telemetrie, se foloseste insa unul dintre cele mai vechi medii de propagare: aerul, si metoda de propagare care a stat la baza telecomunicatiilor moderne: undele electromagnetice. In acest domeniu, pe langa multitudinea de aplicatii care pot fi studiate si dezvoltate, este util studiul crearii unei astfel de retele.

Scopul lucrarii de fata este de a documenta proiectarea si realizarea unei retele de telemetrie care opereaza in banda 433 MHz. Continuturile se axeaza pe proiectarea retelei si a functiilor de baza din aceasta, cu identificarea rolurilor nodurilor retelei si apoi pe proiectarea partii hardware, pornind de la schema electrica si ajungand pana la realizarea cablajului imprimat. De asemenea, implementarea functiilor de retea prin software este realizata si documentata, urmarindu-se explicarea functionalitatii a doua tipuri de noduri prin prezentarea de scheme logice si parti relevante din cod. Este urmarita si prelevarea de informatii de la senzori, care este o parte esentiala in retelele de telemetrie.

Reteaua este formata din cinci noduri, dintre care patru au functii de senzori, iar al cincilea concentreaza functii de control a comunicatiei in retea si a comportamentului celorlalte noduri. Scopul retelei este de a capta prin intermediul undelor electromagnetice RF informatii de la senzori si de a le afisa pe monitorul unui computer atasat nodului central.

Acest tip de retea de telemetrie poate fi utilizat pentru un numar mare de aplicatii, dintre care voi enumera cateva:

Sisteme de ventilatie si conditionare a aerului (monitorizare si control)

Sisteme de incalzire cu calorifere sau panouri electrice (functie de termostat)

Controlul unor sisteme de panouri solare in scopul obtinerii unui randament cat mai bun

Sisteme de securitate

Dispozitive de monitorizare a pacientilor

Puncte de monitorizare a activitatii utilajelor

Sisteme de control a marfurilor cu potential periculos pentru sanatate, in vami sau porturi

Fundamente teoretice

Prezentarea sistemului

Caracteristici

Sistemul de telemetrie are urmatoarele caracteristici:

Tensiune de alimentare 9 V

Tensiune de lucru 5 V

Retea de senzori comandati dintr-un nod central

Raza de actiune: peste 240 m

Transmisie RF 433 MHz

Modulatie FSK

Controlul integritatii datelor implementat prin CRC-CCITT

Sistem ARQ incorporat in software

Afisarea rezultatelor pe monitorul unui PC, in cadrul unei aplicatii dezvoltate special pentru aceasta retea

Modul de functionare al sistemului

Schema bloc a sistemului este cea din figura. Se observa prezenta unui nod central, care are rolul de master in gestionarea comunicatiei, echipat cu module de emisie si receptie. Acesta coordoneaza activitatea a patru noduri periferice, cu rol de module “slave” in comunicatie. Pe langa modulele de emisie si receptie, acestea mai sunt echipate cu senzori de temperatura si LED-uri ce pot avea functia de alarma luminoasa.

Datele preluate din retea sunt transmise de catre modulul “master” spre un PC conectat prin interfata seriala RS232. Pe ecranul monitorului se pot afisa datele curente, precum si un grafic cu datele captate in ultimele minute, dupa accesarea aplicatiei special create in acest scop.

Dupa cum este reprezentat si in schema bloc, comunicatia intre module se realizeaza prin unde radio, in banda 433.05 MHz – 434.79 MHz, ceea ce permite plasarea nodurilor periferice pe o raza mai mare de 240 m[biblio datasheet hmT].

Controlul comunicatiei din nodul central se face prin interogare circulara a nodurilor periferice. Astfel, fluxul informational din cadrul sistemului poate fi explicat prin prezentarea fluxului informational existent intre modulul master din nodul central si unul dintre modulele slave, situat intr-unul dintre nodurile periferice. Figura prezinta succesiunea interogarilor primite de modulul “slave” si modul in care acesta raspunde, in conditii normale de lucru (in absenta erorilor). Comportamentul nodurilor in cazul depistarii de erori este tratat pe larg in capitolul.

Se observa ca prima comanda spre nodul periferic este cea de “initializare”. Nodul central emite aceasta comanda in mod broadcast, apoi verifica initializarea prin comanda “autotest”. Dupa aceste operatiuni preliminare se intra intr-o bucla in care se citesc datele de la senzori si se transmit rezultatele spre PC, unde devin vizibile in fereastra aplicatiei, prezentata in figura de mai jos.

Aplicatia de preluare si afisare a datelor pe PC consta intr-o fereastra in care se afiseaza modulul curent de la care s-au transmis datele, patru “progress bars” cu valori definite de la 0°C la 110°C, asociate canalelor de receptie a datelor, deci senzorilor atasati in cele patru noduri periferice si un grafic pe care se afiseaza in timp real datele furnizate de senzori, prin intermediul modulului situat in nodul central.

Comunicarea in retea

Nivelul fizic

Comunicarea la nivelul fizic in reteaua de telemetrie se realizeaza in banda de frecventa 433.05 MHz – 434.79 MHz, care este parte componenta a benzii ISM (Industrial, scientific and Medical). Modulele de comunicatie pe care am ales sa le incorporez in designul modulelor de retea opereaza la frecventa de 434 MHz.

Topologia retelei are o structura fizica si logica in forma de stea, cu un nod central de comanda si patru noduri periferice, dupa cum se poate observa in figura. Comunicatia este dirijata din nodul de comanda, reprezentat de modulul tip master, nodurile periferice neavand desemnat un protocol de intercomunicatie.

Modulele de comunicatie sunt reprezentate de emitatoare si receptoare individuale, care sunt grupate in perechi, fiecare modul, atat modulul cu functie de master cat si cei cu functie de slave, avand cate o pereche emitator-receptor atasata. Emitatorul preia datele furnizate pe pinul dedicat al microcontrollerului si le transmite prin modulatie FSK. Receptorul preia informatia si dupa demodulare, o transmite pe pinul dedicat receptiei al microcontrollerului. Fluxul de date este structurat sub forma de octetiFiecare byte este transmis asincron cu viteza de 2400 bps, rezultand o perioada de bit de 416 μs. Pentru controlul fluxului si pentru prevenirea situatiei in care emitatorul depaeste receptorul in transmiterea mesajului, rezultand in pierderea comunicarii sau in congestie de mesaje, trasmiterea fiecarui byte este urmata de o perioada de intarziere de 8 ms. In continuare voi prezenta calculul pentru determinarea perioadei totale de transmitere a unui octet, tinand cont ca formatul de transmitere este 8 biti de date/1 bit de stop/fara paritate.

, unde tW este perioada de transmitere completa a octetului , rezultand perioada totala tT ca fiind:

Desi modulatia FSK are avantaje fata de modulatia in amplitudine, reusind sa respinga semnalele nedorite cu o amplitudine mai mica si deci crescand intr-o anumita masura rezistenta la zgomot, in aceasta retea am tinut cont de diversitatea surselor de semnal in banda 433 MHz. Zgomotul are manifestarea aparenta a unor biti de informatie aleatori. O sursa ideala de zgomot poate genera o combinatie de biti cu o probabilitate egala cu generarea oricarei combinatii de biti. Aceasta proprietate face dificila gasirea unei combinatii de biti pentru scoaterea din zgomot a semnalului. In realitate insa, zgomotul nu are proprietatea de a fi ideal.

Astfel, la nivelul legaturii fizice am implementat scoaterea din zgomot a semnalului transmis prin introducerea de secvente de biti recongnoscibile de catre modulul destinatar al mesajului, dupa receptie si demodulare. In consecinta, transmiterea oricarui mesaj in retea include transmiterea codurilor binare 01010101, urmat de 10101010, deci caracterele ce au codurile hexazecimale 0x55, respectiv 0xAA, care preced restul datelor. Acestea au rolul de a plasa receptorul intr-o stare expectativa, pregatind receptia bitilor de adresa si informatie.

Nivelul legaturii de date si nivelul de retea

Unitatea de masura a informatiei la nivelul legaturii de date este cadrul de date. Acesta contine un numar de unitati ale nivelului inferior, organizate astfel incat functiile nivelului curent sa poata fi indeplinite.

Structura cadrului de date in reteaua de telemetrie este prezentata in figura. Cadrul este format din preambul, cuvintele de adresa, informatia utila si codul de verificare a erorilor, rezultand, conform relatiei, o perioada de transmitere a cadrului egala cu:

Preambulul la nivelul legaturii de date este inclus in bitii de sincronizare utilizati de catre nivelul fizic pentru activarea receptorului. Fiind o succesiune be schimbari de nivel, asigura si caracteristica de preambul de nivelul 2. Caracterul de delimitare a cadrului are aceeasi natura, deci este compus din succesiuni de nivel high si low, cu exceptia celor mai putini semnificativi 2 biti, care au valoarea egala cu unu.

Pentru ca aceasta retea are o complexitate redusa, adresarea este de tip local si in consecinta nivelul de retea este inclus in nivelul legaturii de date. Adresarea se face pe doi octeti, primul continand adresa destinatiei si al doilea adresa sursei. Faptul ca adresa nodului de destinatie si cea a sursei sunt receptionate in acelasi cuvant, deci sunt citite de-o data nu limiteaza performantele retelei pentru ca decizia de a continua receptia mesajului se ia imediat dupa receptionarea celui de-al patrulea cuvant din cadru, implicand, conform relatiei, o intarziere de 3.328 μs. Adresarea este implementata astfel incat nodurile periferice au adrese de la 1 la 4, iar adresa nodului central este considerata zero. Acest lucru nu impiedica trimiterea de mesaje in regim broadcast pe adresa 00, pentru ca se presupune imposibila situatia ca un mesaj de alt tip sa aiba adresa nodului de destinatie identica cu adresa nodului sursa. Pentru ca fiecare dintre adrese este reprezentata pe 8 biti, este posibila extinderea retelei pana la un numar destul de mare de noduri, si anume 255, cu adrese intre 1 si 255, adresa 0 fiind rezervata nodului central.

Pentru a se implementa una dintre functiile importante ale nivelului legaturii de date, aflata in subnivelul legaturii logice, si anume detectia cadrelor eronate, ultimii patru octeti din compozitia cadrului sunt alocati codului de detectie a erorilor. Am optat pentru utilizarea unui cod ciclic, si anume o schema CRC pe 16 biti. Polinomul generator ales este un polinom standard pe 16 biti, si anume CRC-CCITT: . Schema CRC este aplicata cuvintelor de adresa si celor de date, iar codul rezultat este plasat pe ultimii patru octeti ai cadrului. Implementarea schemei CRC va fi prezentata in capitolul care descrie dezvoltarea software. La receptie, codul este recalculat pentru bitii de adresa si date receptionati folosind acelasi algoritm si apoi comparat cu codul receptionat. In cazul in care exista egalitate, inseamna ca receptia mesajului s-a facut cu succes. In caz contrar, mecanismul ARQ implementat in nodul central cere retransmiterea mesajului. Acest lucru este realizat prin retransmiterea mesajului de executie a comenzii de catre nodul central.

Serviciul utilizat in stabilirea conexiunii in reteaua de telemetrie este un serviciu confirmat neorientat pe conexiune, cadrele fiind transmise fara stabilirea in prealabil a unei legaturi logice. Confirmarea primirii mesajului asigura totusi un nivel minim de siguranta in functionarea retelei. Confirmarea receptionarii mesajelor transmise de catre modulul “master” se realizeaza implicit, prin transmiterea de mesaje-raspuns de catre modulele “slave”. Pentru a implementa serviciul cu confirmare, nodul central asteapta un timp predeterminat primirea raspunsului si in cazul in care acest eveniment nu apare, efectueaza retransmiterea mesajului, metoda ce permite excluderea din retea a unor noduri inerte, care esueaza sa raspunda la apeluri repetate. Nodurile periferice, deci modulele “slave” nu asteapta confirmarea mesajelor transmise, pentru ca in acest fel comunicatia in retea sa nu se aglomereze cu mesaje de confirmare, ingreunand sincronizarile si limitand timpul necesar transmiterii de mesaje cu informatie utila.

Pentru subnivelul care guverneaza accesul la mediu, a fost nevoie de implementarea unui protocol de acces multiplu care sa permita controlul asupra fluxului de date si impiedicarea congestiunilor. Cel mai bun protocol in acest sens mi s-a parut un protocol cu proces alocator, care tine cont de dispunerea fizica a retelei (topologie stea) si de functiile grupate in nodul central, care ii dau posibilitatea de a controla accesul la mediu. Astfel, nodul central primeste o functie aditionala, aceea de proces alocator. Rolul sau este de a atentiona nodurile periferice de momentul in care va trebui sa emita si, in plus, de a initia comunicatia cu fiecare nod in parte. In acest scop, in programul modulului “master”, aflat in nodul central, este implementata o bucla circulara care realizeaza apelul pe rand al nodurilor periferice. Fiecare comanda este transmisa pe rand fiecarui nod periferic, acestea recunoscandu-si adresa in cadrul primit si raspunzand la mesaj prin executia comenzii si returnarea rezultatului.

Nivelul de aplicatie

La nivelul de aplicatie in reteaua de telemetrie se face identificarea comenzii primite si a datelor aditionale. Informatia care circula la acest nivel este structurata conform figurii de mai jos:

Identificarea comenzii se realizeaza prin evaluarea octetului care contine codul comenzii, apoi sa face un salt la subrutina corespunzatoare codului comenzii. In reteaua de telemetrie sunt identificabile patru comenzi, pentru care raspunsul contine date aditionale sau nu. Comenzile sunt detaliate in tabelul de mai jos:

Dupa executia unei comenzi primite, nodul periferic raspunde printr-un mesaj. In cazul in care tipul comenzii nu necesita transmiterea de date aditionale, octetii rezervati pentru acestea sunt transmisi, cu valoarea implicita 0. Acest lucru mentine structura cadrului la nivelul legaturii de date indiferent de comanda care se transmite la nivelul superior.

Comunicatia retelei cu un PC asociat

Pentru ca datele citite in reteaua de telemetrie sa fie vizibile pentru utilizatorul acesteia, am implementat comunicatia cu un PC prin interfata seriala RS232. Functia aceasta ii revine modulului “master”, pentru ca, protocoalele implementate in reteaua de telemetrie conduc la acumularea tuturor rezultatelor in nodul central, care este echipat cu modulul “master”.

Informatiile trimise prin aceasta conexiune contin valorile citite de senzorii atasati nodurilor periferice. In programul nodului central, aceste date sunt receptionate si retransmise spre PC imediat dupa receptionarea lor.

Structura mesajului transmis catre PC este de tip cadru de nivel de legatura de date. Se poate observa in figura faptul ca in acest caz am optat pentru verificarea corectitudinii datelor prin utilizarea unei sume de control. Acest lucru se datoreaza faptului ca, fiind o conexiune pe fir, cu traseu scurt, probabilitatea de aparitie a erorilor este foarte mica.

Datele receptionate sunt apoi afisate pe ecranul monitorului astfel incat se poate observa canalul curent, deci nodul periferic care a transmis ultimul mesaj, valoarea curenta citita de la senzorul din acel nod, afisata sub forma numerica si geometrica. In plus, se afiseaza pe un grafic valorile citite in functie de timp, astfel incat se poate observa evolutia in timp a fiecarei marimi afisate. Am ales sa fac discriminarea in functie de canal prin folosirea unor culori diferite pentru afisarea pe grafic si nu prin afisarea a patru grafice diferite, tinand cont de faptul ca marimile citite in cele patru noduri periferice sunt de aceeasi natura. In cazul in care unul dintre noduri citeste o marime aditionala, se poate realiza afisarea unui alt grafic, care sa descrie evoutia uneia dintre marimile citite in functie de cealalta, cum ar fi, de exemplu, temperatura in functie de nivelul de luminozitate.

In capitolul am realizat prezentarea in detaliu a ferestrei aplicatiei si a modului de programare, iar capitolul contine detalii despre realizarea legaturii hardware intre modulul “master” si PC.

Dezvoltare hardware

Nodurile retelei sunt construite modular, fiecare continand:

O placa pe care este montat microcontrollerul, realizata pe cablaj imprimat a carui conceptie este descrisa in capitolul

O placa specifica aplicatiei, care contine conectori pentru comunicarea pe interfata seriala RS232, pentru alimentare si pentru atasarea emitatorului si receptorului. In plus, modulele care reprezinta nodurile periferice prezinta si conectori pentru atasarea modulului de masurare

Module de emisie si receptie, HM-T433 si HM-R433

Module de masurare a temperaturii (in nodurile periferice)

In figura de mai jos se poate observa unul dintre module, asamblat cu toate partile componente.

Prezentarea placii pentru microcontroller

In figura se poate observa schema electrica a placilor pentru microcontroller, pentru care am realizat si cablaj imprimat. O piesa foarte importanta pentru aceasta placa este stabilizatorul de tensiune LM7805, care preia tensiunea de intrare de 15 V si furnizeaza la iesire tensiune de 5 V, nivelul standard pentru aplicatii digitale TTL. Intrarea si iesirea sunt protejate cu condensatori SMD de decuplare, cu valori de 10 μF si 100 μF. Rolul acestora este de a proteja de efecte nedorite ale fluctuatiilor de curent determinate de fluctuatiile in consumul de putere.

Piesa centrala a ansamblului electronic este microcontrollerul ATmega8, in capsula PDIP cu douazecisiopt de pini. Pe langa aceasta, am folosit doi conectori dubli cu cate optsprezece pini, pentru accesul spre placa specfica aplicatiei.

De la pinii microcontrollerului am facut legaturi la pinii conectorilor dubli, astfel: pinul 1 fiind pinul de RESET al microcontrollerului, i-am atasat un buton de reset plasat intr-o configuratie cu un rezistor de 10 kΩ spre tensiunea de alimentare de 5 V furnizata de stabilizator si un condensator de 10 μF spre masa.

Pinii 2..6 ai microcontrollerului sunt conectati direct la pinii cu aceleasi numere ai conectorului dublu X1. Pinul 7 este dedicat pentru alimentare, iar pinul 8 pentru conectarea la masa, iar intre acestia am plasat un condensator de 10 μF.

Pentru conectarea cuartului de 12.288 MHz am folosit condensatori de valori egale, de 22 pF, respectand recomandarile producatorului microcontrollerului[foaie catalog ATmega8].

Pinii 11 si 12 ai microcontrollerului sunt conectati direct la pinii 15, respectiv 16 ai conectorului dublu X1. Pinul 13 comanda aprinderea unui LED de culoare verde, conectat la GND printr-un rezistor de 330 Ω, pentru limitarea curentului la valoarea de 15 mA. Similar, pinul 14 comanda aprinderea unui LED de culoare rosie, conectat tot printr-un rezistor de 330 Ω la GND.

Pinii 15 si 16 ai microcontrollerului sunt conectati direct la pinii 18, respectiv 17 ai conectorului dublu X2. Pinii microcontrollerului numerotati 17, 18 respectiv 19 sunt conectati atat la pinii conectorului dublu cu numerele 16, 15, respectiv 13, cat si la pinii conectorului de programare X3, comceput pentru programarea seriala a microcontrollerului.

Structura conectorului X3 poate fi observata in tabelul de mai jos, care contine pe primul rand numerele pinilor iar pa randul doi functiile pinilor conectati ai microcontrollerului. Detalii despre rolul acestor pini si modul de programare seriala a microcontrollerului ATmega8 pot fi urmarite in subcapitolul.

Cu ajutorul pinilor 20..22 am setat tensiunile de referinta pentru convertorul analog-digital. Pinul 20 reprezinta intrarea pentru tensiunea de referinta AREF, de 5 V. Am realizat un circuit LC de conectare cu pinul 22 (GND), dupa recomandarile producatorilor[ATmega8], documentat si in subcapitolul, figura. Pentru ca nu am folosit referinta de tensiune interna AREF, am conectat un condensator cu capacitatea de x spre masa.

Pentru pinii 23..26, care pot fi programati ca intrari pentru convertorul analog-numeric, am conceput filtre RC compuse din rezistoare cu valoarea de x spre intrare si condensatoare cu capacitatea de x spre masa.

In fine, pinii 27 si 28 sunt conectati direct la pinii conectorului dublu X2 cu numerele 7, respectiv 8.

Exista in cadrul conectorilor dubli X1 si X2 perechi de pini pe care am plasat fie puncte de alimentare, fie puncte de masa. Astfel, pinii 9 si 10 ai X1, respectiv 3 si 4 ai X2 sunt pini de masa, pe pinii 7 si 8 ai X1, respectiv 5 si 6 ai X2 se aplica 5 V, iar pe pinii 1 si 2 ai X2 se aplica 15 V.

Cablajul imprimat realizat pentru placa microcontrollerului este prezentat in figura de mai jos.

Prezentarea placii specifice aplicatiei

Pe placa specifica aplicatiei se gasesc o serie de conectori pentru modulele atasate (emisie, receptie, senzori) si pentru alimentare. Conectorii dubli X1 si X2 cu 18 pini, organizati in perechi paralele, fac legatura cu placa microcontrollerului. Tensiunea de alimentare a modulului, de 15 V, al carei punct de intrare este conectorul cu patru pini J1, este transmisa pe placa microcontrollerului prin intermediul pinilor 4 si 5 ai conectorului X2. Acolo se face, dupa cum am aratat, transformarea la 5 V prin intermediul stabilizatorului de tensiune LM7805. Tensiunea de 5 V este necesara si modulelor de emisie si receptie si pentru determinarea valorii masurate de senzori, astfel incat este readusa pe placa specifica aplicatiei prin intermediul pinilor 5 si 6 ai conectorului X2, precum si al pinilor 7 si 8 ai conectorului X1.

De asemenea, se mai fac conexiuni cu anumiti pini ai microcontrollerului. Pinii folositi pentru transmisia si receptionarea datelor de la modulele de emisie si receptie sunt, dupa cum am aratat anterior, pinii RX si TX ai microcontrollerului, conectati la pinii 2, respectiv 3 ai conectorului dublu X1.

Tot pentru transmisie si receptie se folosesc pinii microcontrollerului PD2 si PD6, si anume in scopul transmisiei si receptiei datelor prin interfata seriala RS232 spre PC.

Interfara seriala RS232 este conectata prin intermediul conectorului simplu X3, cu 6 pini aliniati. Datele parcurg, spre PC, circuitul integrat de adaptare pentru comunicatia seriala MAX232A, ale carui conexiuni sunt prezentate in detaliu mai jos.

Receptorul este conectat prin intermediul conectorului cu 4 pini J3, avand nevoie de pini pentru transmisia datelor, pentru alimentare (tensiune pozitiva si masa) si pentru activare (pinul “ENABLE” prezent pe placa receptorului, prin designul firmei producatoare). Pentru activare am utilizat pinul PD4, programat ca iesire si setat cu nivel “high” pentru activarea receptorului, dupa cum se poate vedea in capitolul, unde am prezentat realizarea software.

Emitatorul este conectat prin intermediul conectorului cu 4 pini J4. Sunt folositi trei dintre pinii conectorului, pentru tensiunea pozitiva, masa si datele care sunt transmise. Alimentarea este conectata prin emitorul unui tranzistor PNP BC327 care are baza conectata la un pin al microcontrollerului printr-un resitor de 1kΩ. Energia din colector este furnizata pe pinul de alimentare al emitatorului atunci cand pinul microcontrollerului este setat cu valoare “low”.

Conectorul J5 este utilizat pentru modulul pe care se gaseste senzorul. Pe trei dintre cei patru pini ai conectorului se transmit tensiunea pozitiva, tensiunea de referinta 0 V (GND) si tensiunea rezultata prin divizare folosind rezistenta variabila a termistorului, dupa cum este explicat mai jos, in sectiunea dedicata modulului de senzor.

Prezentarea conexiunilor spre interfata seriala RS232

Pentru adaptarea semnalului la comunicatia pe interfata seriala RS232 am folosit circuitul integrat adaptor MAX232A produs de compania MAXIM. Acesta preia semnalul transmis de microcontroller prin intermediul conectorului simplu cu 6 pini aliniati X3, pe pinii T1IN si T2IN. Semnalul este inversat si conditionat pentru comunicatia seriala si este furnizat spre legatura RS232 pe pinii T1OUT si T2OUT. Pentru implementarea comunicatiei in sens invers, semnalul sosit pe interfata seriala este preluat pe pinii R1IN si R2IN, inversat si conditionat pentru nivel de semnal TTL/CMOS si furnizat spre microcontroller pe pinii R1OUT si R2OUT.

Adaptorul MAX232A are nevoie de condensatorii C1 intre pinii 1 si 3, care face parte din circuitul de dublare a tensiunii impreuna cu C3, pe pinul 2 fiind tensiune de +10 V, respectiv condensatorul C2, intre pinii 4 si 5, folosit impreuna cu C4 in circuitul pentru inversarea tensiunii dublate, pinul 6 avand tensiune de -10 V. Toti condensatorii au valoarea de 0.1μF, conform indicatiilor producatorului[foaie catalog MAX232].

Pe placa adaptorului MAX232 se gasesc conectori spre doua cabluri destinate comunicatiei seriale. Unul dintre acestea este utilizat pentru transmiterea datelor spre computer in scopul afisarii in fereastra aplicatiei, iar celalalt a fost introdus pentru urmarirea comportamentului sistemului in timpul dezvoltarii acestuia. Aceasta din urma legatura transmite spre un terminal activat pe un PC datele emise din nodul central.

Placa de adaptare care contine integratul MAX232A este atasata nodului central.

Prezentarea caracteristicilor emitatorului si receptorului

Emitatorul (HM-T433) si receptorul (HM-R433) sunt produse de Hope Microelectronics Co., Ltd., fiind concepute ca si module complementare pentru aplicatii ce folosesc modulatie FSK. Modulele opereaza la frecventa de 434 MHz in banda 433.05 MHz – 434.79 MHz.

Valoarea tipica a puterii de emisie a modulului HM-T433 este de 6 dBm (3.98 mW), iar sensibilitatea receptorului HM-R433 are o valoare tipica de -109 dBm (1.25 mW), iar temperatura de lucru poate varia intre -35 °C si 80 °C.

Am atasat emitatorului si receptorului antene filare pentru care am calculat lungimea folosind frecventa de lucru:

Am ajustat aceasta valoare folosind un factor de scurtare de 0.8. Rolul factorului de scurtare este de a adapta lungimea antenei in functie de tipul de cablu folosit in constructia antenei. Astfel, rezulta o lungime adaptata cu valoarea:

In continuare voi prezenta caracteristici legate de aspectul modulelor de emisie si receptie.

Emitator

Fotografii

Denumirea pinilor

Detalii de dimensionare

Receptor

Fotografii

Denumirea pinilor

Detalii de dimensionare

Prezentarea senzorilor de temperatura

Senzorii de temperatua utilizati sunt reprezentati de termistori NTC (Negative Temperature Coefficient), caracterizati de scaderea rezistentei o data cu cresterea temperaturii.

Pentru ca aceasta valoare a rezistentei sa poata fi furnizata intrarii ADC a microcontollerului si apoi transformata intr-o valoare digitala, este nevoie de montarea termistorului intr-un circuit de divizare a tensiunii.

Modulele de divizare a tensiunii atasate nodurilor periferice contin urmatorul circuit de principiu.

Astfel, tensiunea furnizata pe pinul ADC0 al microcontrollerului este calculabila cu formula:

Formula nu este utilizata insa in program, pentru ca valoarea tensiunii UADC este convertita automat. Problema cu un astfel de termistor, insa se gaseste in determinarea neliniaritatilor si respectarea acestora la convertirea din valori digitale in valori ale temperaturii.

Pentru a determina neliniaritatile pentru toti cei patru termistori, am realizat etalonarea orientativa a acestora folosind un termometru cu alcool si apa, la temperaturi cuprinse intre 0 °C si 100 °C.

In tabelul de mai jos se pot urmari rezultatele experimentului, in care am notat valoarea citita la pinul ADC pentru valori cunoscute ale temperaturii apei.

Prelucrand datele din tabel, am obtinut pentru fiecare dintre cei patru senzori graficele de liniaritate a variatiei rezistentei in functie de temperatura.

Se observa ca nici unul dintre cei patru termistori nu are o caracteristica R(t °C) liniara, ceea ce inseamna ca la implementarea afisarii temperaturii a fost nevoie de definirea valorilor si crearea de intervale de interpolare pentru fiecare din cei patru senzori.

O alta metoda vizuala de a analiza liniaritatea este afisarea pe un grafic a numarului de unitati aflate in intervalele dintre valori cunoscute de temperatura, distantate egal.

Daca termistorul al prezenta liniaritate perfecta, aceasta caracteristica ar fi reprezentata sub forma unei linii orizontale, ceea ce ar insemna ca exista un numar egal de unitati care reprezinta toate intervalele egale de temperatura.

Realizarea cablajelor imprimate

Dupa cum am prezentat anterior, toate modulele sunt formate dintr-o placuta cu microcontrollerul si circuitele adiacente si o placuta specifica aplicatiei, cu circuitele si conectorii pentru emitator, receptor, alimentare si comunicatia seriala. Am ales ca placutele cu microcontrollerul sa aiba cablaj imprimat, acest lucru oferind o rezistenta sporita la utilizare indelungata si pornind de la considerentul ca aceste placute pot fi reutilizate pentru alte aplicatii ce folosesc microcontrollerul Atmega8.

Pentru realizarea cablajelor imprimate am folosit Orcad Family Release versiunea 9.2, cu utilitarele Capture si Layout. Am mai folosit aplicatia Gerb Tool, creata de Wise Software Solutions Inc.

Primul pas a fost elaborarea schemei pentru placa microcontrollerului, prezentata anterior. Am realizat-o folosind utilitarul Capture, cu bibliotecile standard pentru versiunea Orcad mentionata. Dupa ce schema a fost completa, am utilizat functia de verificare a regulilor de design, apasand butonul (Deisgn Rules Check), care se gaseste si in meniul “Tools” al aplicatiei. Un alt pas important este generarea fisierului netlist, .MNL, care este fisierul de plecare pentru prelucrarea cu ajutorul utilitarului Layout.

Acest pas se realizeaza prin apasarea butonului (Create Netlist), care se regaseste, de asemenea, in meniul “Tools”. In urma acestei actiuni se deschide o fereastra, de unde se alege submeniul “Layout” cu optiune Run ECO (Engineering Change Orders) to Layout.

In utilitarul Layout, am deschis fisierul .MNL creat anterior si prin acest pas s-a creat automat fisierul .MAX corespunzator. In fisierul .MAX sunt reprezentate asezarea componentelor pe cablaj si traseele intre puncte. O prima setare in fisierul acesta este reprezentata de alegera numarului de straturi. Eu am ales doua straturi, TOP si BOTTOM, fiind inevitabila intersectarea traseelor in caazul unui singur strat. Dupa o aranjare preliminara a footprinturilor componentelor, continutul fisierului .MAX a fost cel afisat in figura. Se observa faptul ca stratul selectat este “Global Layer”, fiind vizibile atat amprentele componentelor de pe ambele parti, cat si legaturile intre pini, inca neavand proprietatea de trasee (nerutate).

Am conceput traseele si dispunerea componentelor astfel incat sa se produca un numar minim de treceri de pe un strat pe altul, astfel incat configuratia traseelor a fost facuta manual, folosind butonul (Shove Track Mode), prin selectarea traseului cu ajutorul cursorului si apasarea butonului stanga al mouse-ului, apoi specificand punctele in care traseul are unghiuri prin apasarea tastei “Space”. In momentul in care traseul a avut configuratia dorita si mai trebuia plasat ultimul segment, am apasat butonul din dreapta al mouse-ului, selectand “Finish” din lista de optiuni. Astfel am reconfigurat legaturile intre pini, realizand trasee. In locurile unde a fost necesara trecerea de pe o parte pe alta, am introdus trecere. Trecerea se introduce in momentul in care este selectat traseul pe care se va plasa; se apasa butonul din dreapta al mouse-ului si se selecteaza “Add Via” si amprenta trecerii este plasata in punctul respectiv, fiind vizibila pe ambele straturi, TOP si BOTTOM. In figura este prezentata lista de optiuni care apare in momentul apasarii butonului din dreapta al mouse-ului.

Dupa cum se poate observa in figura de mai sus, am activat optiunea de unghiuri ale traseelor de 135°, care permite atat realizarea de unghiuri drepte cat si de unghiuri de 135°. De remarcat este ca ultimul segment dintr-un traseu trebuie sa intalneasca pastila finala sub unul dintre unghiurile mentionate.

Dupa rutarea manuala a traseelor, continutul fisierului .MAX a devenit cel din figura de mai jos:

Etapa urmatoare implica un alt utilitar din suita Orcad. Este vorba despre etapa de post-procesare, care se realizeaza cu ajutorul Gerb Tool. Pentru aceasta, din meniul “Window” al Layout, se selecteaza optiunea “Post Process”, actiune in urma careia apare fereastra de post-procesare din figura de mai jos:

Pe prima coloana se gaseste, pentru fiecare strat in parte, extensia care se va da fisierului generat in post-procesare. Pe a doua coloana se specifica daca se va genera fisier pentru stratul respectiv (“Yes”), sau nu (“No”). Specificarea dispozitivului pentru post-procesare se face pe coloana a treia, unde se poate alege dintre Gerber RS-274D, Extended Gerber, DXF, Print Manager (cu optiunea Print/plot to File). In coloana intitulata “Shift” se specifica pentru fiecare strat in parte daca trebuie miscat, rotit, oglindit sau redimensionat. Ultima coloana este folosita pentru identificarea rapoartelor si notelor, pentru eventualitatea unor interventii ulterioare.

Dupa realizarea setarilor, am rulat programul de post-procesare accesand meniul “Auto” si selectand “Run Post Processor”, actiune care a generat fisierul .GTD (Gerb Tool Document). La accesarea acestuia din folderul curent, ruleaza utilitarul Gerb Tool.

Avand un numar de cablaje imprimate identice de realizat, in aplicatia Gerb Tool pasul cel mai important a fost “planelizarea”. Panelizarea presupune aranjarea mai multor cablaje imprimate si prelucrarea concomitenta a acestora, pentru reducerea timpului de prelucrare si pentru limitarea cantitatii de materiale folosite ulterior. In cazul cablajelor necesare pentru reteaua de telemetrie, panelizarea a fost un pas esential, din moment ce designul pentru placutele destinate microcontrollerelor a fost identic pentru toate. De asemenea, cu ajutorul Gerb Tool am realizat si oglindirea stratului superior, ceruta de tehnologia de imprimare a placii cu cupru, despre care voi oferi detalii in ulterior.

Pentru panelizare, a, selectat pe rand straturile TOP si BOTTOM si, apasand butonul “Panelize” , am accesat meniul care prezinta optiunile pentru panelizare, reprezentat in figura.

Avand de realizat un necesar minim de 5 copii pentru fiecare strat, am selectat panelizare de 3×3 pentru fiecare dintre straturi, asigurand astfel minimul necesar si permitand crearea a patru copii suplimentare pentru rezerva. In acest rationament am inclus dimensiunea placii cu cupru si dimenisiunile placutelor rezultate, astfel incat plasarea acestui numar de copii mi s-a parut oportuna. In figura se poate observa dispunerea copiilor straturilor, precum si faptul ca stratul superior (TOP) este oglindit.

Oglindirea a fost necesara datorita tehnologiei de imprimare. Am utilizat metoda aplicarii de pe hartie cu transfer termic, care, prin proprietatile sale, permite transferul contururilor traseelor si ale pastilelor, astfel incat acestea sa fie protejate in etapa de corodare a stratului de cupru. Pentru pregatirea placii cu strat de cupru inainte de aplicarea hartiei am apelat la o solutie de curatare universala cu microparticule incorporate, astfel incat suprafata sa fie foarte bine curatata. Dupa ce imaginea cablajelor a fost transferata pe hartie, am aplicat-o pe placa astfel incat straturile sa aiba corespondenta. Dupa presarea la cald, imaginea s-a transferat pe placa si am trecut la etapa urmatoare: corodarea stratului de cupru.

Pentru corodare am folosit 500ml clorura ferica de concentratie 38%. Am plasat intr-o tava din material plastic placa si, dupa ce am turnat cantitatea de clorura ferica, am agitat usor timp de 30-40 de minute, tinand cont de corodarea suprafetei placii, evaluata prin inspectie vizuala. Dupa corodarea completa a stratului de cupru din afara traseelor, am sters cu alcool stratul protector deups in etapa de imprimare.

Pentru prelucrarile ulterioare am decupat in prealabil cele 9 placute rezultate in urma imprimarii, apoi, dupa slefuirea marginilor, am gaurit pastilele pentru plantarea componentelor si pastilele care indicau prezenta unor treceri de pe un strat pe celalalt.

In aceasta etapa am curatat suprafata placutelor de impuritatile rezultate prin gaurire si de eventualele reziduuri de tus cu solutia de curatare cu microparticule. Apoi am aplicat doua straturi dintr-o solutie protectoare, rezultata din dizolvarea unei cantitati de sacaz in alcool izopropilic.

Dupa uscarea solutiei protectoare de pe suprafata placutelor, am realizat trecerile intre straturi si eventuale re-trasari cu fludor a mici portiuni din trasee, intrerupte datorita neaderentei hartiei la stratul de cupru sau prelucrarilor ulterioare.

Urmatoarele etape au inclus plantarea si lipirea componentelor, verificarea corectitudinii lipiturilor prin inspectie vizuala si prin utilizarea multimetrului, precum si testarea placutelor finalizate, initial prin alimentare si verificarea tensiunilor in puncte esentiale, iar apoi prin plantarea microcontrollerului si testarea functiilor acestuia.

Dezvoltare software

Descrierea partilor software comune ambelor tipuri de module

Codul programului este dezvoltat in limbajul ANSI C si este transferat in memoria de program a microcontrollerului Atmega8 cu ajutorul mediului de programare CodeVisionAVR versiunea 1.23.6b, special creat pentru familia AVR de la ATMEL. In cadrul codului am integrat subrutine scrise in limbaj de asamblare, dezvoltate si testate cu ajutorul mediului de dezvoltare AVR Studio 4.

La crearea unui nou proiect cu CodeVision AVR, utilizatorul are la dispozitie optiuni in ceea ce priveste microcontrollerul utilizat, frecventa de ceas utilizata, dimensiunea memoriei interne si externe SRAM si dimensiunea stivei. In cazul de fata, am folosit pentru toate modulele o frecventa de 12 MHz, SRAM intern de 1024 B si stiva de 256 B.

Mediul de dezvoltare CodeVisionAVR pune la dispozitia programatorului, in meniul de initiere a proiectului, optiuni pentru initializarea automata a registrilor, in scopul obtinerii functiilor si caracteristicilor dorite.

De asemenea, aceste initializari pot fi realizate prin incarcarea valorilor potrivite in registri, in functie de indicatiile oferite in foaia de catalog a microcontrollerului. Am optat pentru initializarea in cea de-a doua varianta, pentru a explica valorile alocate registrilor. Voi prezenta in ceea ce urmeaza partea comunica de initializare pentru module, cu cateva exceptii, pe care le voi explica in subcapitolele dedicate particularitatilor de programare ale fiecarui tip de modul.

Pentru ambele tipuri de module, am grupat initializarile registrilor intr-o subrutina denumita init_regs() de tip void, apleabila din main().

//**********************************************************************

void init_regs(void) {

// Initializare porturi I/O

// Port B

//Directia datelor: pin 0 iesire, restul (1..7) intrari

DDRB=0x01; //pinul 0 comanda aprinderea LED-ului de culoare rosie

//Valoare asignata pinilor: 1 pentru pinul de iesire, 0 pentru restul

PORTB=0x01;

// Port C

// Directia datelor: toti pinii sunt intrari

DDRC=0x00;

//Valoare 0 pentru toti pinii

PORTC=0x00;

// Port D

//Directia datelor: pinii 7, 5 si 4 iesiri, restul intrari

//pin7: comanda pentru aprinderea LED-ului verde

//pin5: alimentare emitator

//pin4: enable receptor

DDRD=0xB0;

//Valoare asignata: 1 pentru iesire, 0 pentru restul

PORTD=0xB0;

// Timer/Counter 0: nefolosit

TCCR0=0x00;

TCNT0=0x00;

// Timer/Counter 1: nefolosit

TCCR1A=0x00;

TCCR1B=0x00;

TCNT1H=0x00;

TCNT1L=0x00;

OCR1AH=0x00;

OCR1AL=0x00;

OCR1BH=0x00;

OCR1BL=0x00;

// Timer/Counter 2: nefolosit

ASSR=0x00;

TCCR2=0x00;

TCNT2=0x00;

OCR2=0x00;

// External Interrupt(s) initialization

// INT0: Off

// INT1: Off

GICR=0x00;

MCUCR=0x00;

// Intreruperi Timer/Counter: dezactivat

TIMSK=0x00;

// Initializare USART

UCSRA=0x00;

// Activare Receiver (bit 4, UCSRB) si Transmitter (bit 3 UCSRB)

UCSRB=0x18;

// Mod: asincron : bit 6 UCSRC=0

//8 biti date: bitii 2,1 UCSRC =1

//1 stop bit: bit 3 UCSRC=0; no parity: biti 5,4 UCSRC=0

UCSRC=0x06;

//Baud rate: 2400

//conform relatiei, rezulta , rezultand o rata de bit //echivalenta, conform relatiei cu valoarea , deci o eroare de //rata de bit egala cu , conform relatiei.

UBRRL=0x37;

UBRRH=0x01;

//Initializare Analog Comparator: dezactivat: bit 7 in ACSR=1

ACSR=0x80;

SFIOR=0x00;

PORTD.7=0;//bec verde

PORTD.5=1;//alimentare emitator

PORTB.0=0;//bec rosu

PORTD.4=0;//ENABLE REC

}

//**********************************************************************

O alta subrutina prezenta in programele ambelor tipuri de module este intitulata send_frame, este de tip void si are ca parametri cuvinte (definite in acceptiunea teoriei informatiei, deci grupari de 16 biti), care sunt apoi transmise prin intermediul subrutinei putchar a USART. Parametrii subrutinei send_frame contin informatia de adresare si datele dintr-un cadru de nivel 2.

//**********************************************************************

void send_frame(unsigned char a,unsigned char cm,unsigned char d1,unsigned char d2){

calc_crc(a,cm,d1,d2);

crcL=

crcH=

PORTB.0=1; //activare LED rosu

PORTD.5=0; //activare emitator

delay_ms(500);

//Transmiterea cadrului:

//Transmitere preambul si cuvant de incepere a cadrului:

putchar(0xAA);

delay_ms(CH_DEL); //CH_DEL este definit cu valoarea 8

putchar(0xAA);

delay_ms(CH_DEL);

putchar(0xAE);

delay_ms(CH_DEL);

//Transmitere cuvant de adresare

putchar(a);

delay_ms(CH_DEL);

//Transmitere identificator comanda

putchar(cm);

delay_ms(CH_DEL);

//Transmitere date aditionale comanda

putchar(d1);

delay_ms(CH_DEL);

putchar(d2);

delay_ms(CH_DEL);

//Transmitere CRC:

putchar(crcH);

delay_ms(CH_DEL);

putchar(crcL);

delay_ms(CH_DEL);

PORTD.5=1; //dezactivare emitator

PORTB.0=0;//dezactivare LED rosu

delay_ms(EOT); //EOT definit cu valoarea 50

}

//**********************************************************************

In interiorul subrutinei send_frame este apelata rutina de calculare a codului ciclic pentru detectia erorilor. Implementarea algoritmului CRC este comuna tuturor modulelor si este realizata in limbaj de asamblare.

Am pornit de la alegerea polinomului generator CRC-CCITT, , utilizand coeficientii inversati si un algoritm conceput pentru transmisia datelor cu LSB inainte, astfel incat datele vor fi furnizate registrului de deplasare cu reactie prin cel mai putin semnificativ bit.

Schema registrului de deplasare cu reactie este prezentata in figura de mai jos, unde se poate observa 3 porti SAU-exclusiv (XOR) si a unui registru de 16 biti.

Pentru implementarea schemei am conceput un algoritm a carui schema logica este prezentata in continuare.

Subrutina calc_crc este de tip unsigned int, pentru a returna un rezultat pe 2 octeti, iar parametrii sunt aceiasi ca ai subrutinei send_frame.

//Declararea functiei este precedata de eliminarea atentionarilor prin intermediul

//instructiunii #pragma warn-. Acest lucru este necesar pentru a suprima atentionarile //compilatorului in legatura cu transmiterea de parametri intr-o subrutina dezvoltata in //limbaj de asamblare. Parametrii vor fi preluati explicit prin intermediul pointerului Y.

#pragma warn-

unsigned int calc_crc(unsigned char cr1,unsigned char cr2,unsigned char cr3,unsigned char cr4)

{

#asm ;inceputul codului in limbaj de asamblare

;salvarea registrilor pe stiva

PUSH R15

PUSH R22

PUSH R23

PUSH R24

PUSH R25

PUSH R27

PUSH R28

PUSH R29

;subrutina mai utilizeaza registrii 30 si 31, in care ;returneaza rezultatul, de aceea acestia nu sunt utilizati cu ;instructiunile PUSH si POP

LDD R25,Y+0 ;pointerul Y ramane pe ultimul parametru la apelul functiei

;deci in R25 de incarca cr4

LDD R24,Y+1  ;pentru ca valoarea pointerului se decrementeaza pe ;parcurs,

;pentru a obtine datele anterioare lui cr4 el trebuie ;incrementat

LDD R23,Y+2

LDD R22,Y+3

LDI R27,0x08 ;in registrii 27 si 28 incarc coeficientii polinomului

;generator CRC-CCITT

LDI R28,0x84

LDI R30,0xff ;initializez cu ff (deci 11111111) registrii in care se va gasi

;rezultatul final

LDI R31,0xff

LDI R29,0x20 ;in registrul R29 se incarca valoarea hexazecimala

;corespunzatoare numarului de pasi

;4 octeti de date => 32 de pasi

test_loop: ;in aceasta bucla testeza cel mai putin semnificativ bit al

;datelor

MOV R15,R22 ;in registrul auxiliar R15 se copiaza primul

;octet de date

EOR R15,R30 ;se opereaza sau exclusiv intre registrul auxiliar si

;registrul “low” al rezultatului

CLC

ROR R31 ;rotire registrii CRC, dupa clear carry, rezultand

;introducerea unui zero pe bitul cel mai nesemnificativ

ROR R30

SBRS R15,0 ;daca cel mai putin semnificativ bit devine 1 in urma

;operatiei EOR, se sare la pasul urmator

RJMP end_test

ORI R31,0x80 ;daca nu, se face impartirea la polinomul generator

EOR R30,R27

EOR R31,R28

ORI R31,0x80 ;cel mai semnificativ bit se seteaza 1

end_test:

DEC R29 ;se decrementeaza contorul de pasi

CPI R29,0 ;daca a ajuns la zero, se sare la iesirea din subrutina

BREQ CRC_end

CLC ;daca nu, se shifteaza registrii de date la dreapta, pentru

;eliminarea celui mai putin semnificativ bit, care a fost ;testat in bucla

;prin instructiunea CLC se introduce 0 pe pozitia cea mai

;semnificativa

ROR R25

ROR R24

ROR R23

ROR R22

RJMP test_loop ;se reia bucla cu cel mai putin semnificativ bit curent

CRC_end: ;iesirea din subrutina este precedata de scoaterea valorilor

;registrilor din stiva

POP R15

POP R22

POP R23

POP R24

POP R25

POP R27

POP R28

POP R29

#endasm ;marcheaza sfarsitul codului in limbaj de asamblare

}

//reactivez atentionarile

#pragma warn+

Subrutina de calculare a CRC este apelata si la receptia mesajelor, in functia get_frame.

void get_frame(void){

//am implementat asteptarea caracterelor de scoatere din zgomot printr-o “fereastra” de 3 octeti, deplasabila cu cate un octet

c0=c1;

c1=c2;

c2=getchar();

if (c2==0xAE & c1==0xAA & c0==0xAA) {

c3=getchar();

c4=getchar();

c5=getchar();

c6=getchar();

c7=getchar();

c8=getchar();

calc_crc(c3,c4,c5,c6);

crcH=

crcL=

if(c3==adrr)

if(crcL=c8 & crcH=c7) frame_ok=1;

//frame_ok este o variabila globala prin care se implementeaza

//testul corectitudinii datelor

c0=c1=0;

}

}

O ultima subrutina comuna ambelor tipuri de module este interpretorul de comenzi, care face apoi trimiterea catre subrutinele dedicate fiecarei comenzi in parte, sau seteaza anumiti parametri, dupa caz. Interpretorul de comenzi se apeleaza imediat dupa receptionarea cu succes a unui mesaj, si, prin evaluarea celui de-al cincilea caracter receptionat, decide ce subrutina trebuie apelata in continuare. Avand in vedere faptul ca subrutinele asociate pentru cele doua tipuri de module sunt diferite, atat interpretorul de comenzi cat si subrutinele apelate in cadrul acestuia sunt prezentate in subcapitolele dedicate particularitatilor programelor celor doua tipuri de module.

5.2 Descrierea partilor specifice modulului “master”

In continuare voi descrie aspectele legate de partea software a modulului de tip “master”, incepand cu particularitatile in initializare si continuand cu o schema logica ce descrie comportamentul acestui modul, urmate de prezentarea functiei main si a subrutinelor specifice din program.

La initializarea portului D, se incarca urmatoarele valori in registri:

// Initializare port D

//Directia datelor:pinii 7..4 iesiri (bitii egali cu 1), bitii 3..0 intrari

//pinul 7: alimentare LED verde

//pinul 6: folosit ca iesire pentru transmiterea pe interfata seriala RS232 spre PC

//pinul 5: alimentare emitator

//pinul 4: enable receptor

DDRD=0xF0;

//Valorile pinilor

PORTD=0xE0;

De asemenea, se initializeaza Timer/Counter0:

// Initializare Timer/Counter 0

// Ceas: Frecventa sistemului/1024

TCCR0=0x05;

//Valoare initiala: 0

TCNT0=0x00;

//Timer/Counter0 Interrupt Enable: bitul 0 al TIMSK=1

TIMSK=0x01;

Pinilor desemnati din porturile I/O li se aloca valorile initiale:

PORTD.7=0; //LED verde, stins

PORTD.6=1; //comunicatie RS232 cu PC, oprita

PORTD.5=1; //emitator, oprit

PORTD.4=0;//receptor, oprit

PORTB.0=0; //LED rosu, stins

Acestea fiind diferentele in initializari, voi prezenta in continuare schema logica a programului modulului “master”:

Inainte de prezenatrea functiei main, voi prezenta rutina de tratare a interuperii de overflow pentru Timer/Counter0. Aceasta este programata sa contorizeze o secunda. Variabila to_cnt este initializata cu zero in momentul activarii intreruperilor si incrementata la fiecare intrerupere generata de depasirea valorii maxime in registrul de numarare pentru Timer/Counter0. Variabila f_to este initializata cu 0 si devine 1 in momentul in care s-au contorizat 50 de intreruperi Timer/Counter. Fiind variabila globala, f_to este evaluata intr-o bucla pentru a se determina daca s-a scurs perioada de timp masurata prin intermediul subrutinei.

interrupt [TIM0_OVF] void timer0_ovf_isr(void)

{

if(++to_cnt>50){

f_to=1;

to_cnt=0;

}

}

In functia main() sunt apelate, intr-o bucla infinita si conform schemei logice prezentate anterior, subrutinele descrise in subcapitolul si cele prezentate in subcapitolul curent, sub functia main().

//********************************************************************

void main(void){

init_regs();

delay_ms(200);

PORTD.4=1; //activarea receptorului

f_answer_ok=0;

alarm_flag=0;

//transmit "initializare sistem"

initializare_sistem();

//dupa initializari, pornesc

//comunicatia incepand cu

//nodul 1

s=1;

adresa_nod_e=noduri[s];

while(1){

cmdid=0x03;

adresa_nod_e=noduri[s];

if(alarm_flag==1)

{

cmdid=0x04;

adresa_nod_e=alarm_address;

}

if(noduri[s]!=0xFF) //daca nodul nu a fost declarat

//inactiv, este interogat

{

//crc();

send_frame(adresa_nod_e,cmdid,data1,data2);

wait_answer();

if(f_answer_ok & adresa_nod_r==adresa_nod_e)

interpret_answer(c3);

}

f_answer_ok=0;

c2=c3=c4=c5=0;

s++;

if(s==5)s=1;

delay_ms(100);

};

}

//******************************************************************

void initializare_sistem(void){

//"initializare nod" pe broadcast

send_frame(broadcast,cmd_init_nod,0x00,0x00);

//apoi verific trimitand pe rand

//"autotest"

s=1;

while(s<5)

{

adresa_nod_e=noduri[s];

contorARQ=0;

flag_ARQ=1; //incerc sa trimit de 3 ori

//comanda, daca nu soseste

//rapsunsul declar nodul inactiv

while(contorARQ<4 | flag_ARQ=1){

send_frame(adresa_nod_e,cmd_autotest,0x00,0x00);

wait_answer();

if(f_answer_ok & adresa_nod_r==adresa_nod_e)

{

interpret_answer(c3);

flag_ARQ=0;

}

else {

contorARQ++;

flag_ARQ=1;

}

}

if(flag_ARQ==1) noduri[s]=0xFF;

s++;

}

}

//********************************************************************

Raspunsul trimis din nodurile perfierice este asteptat apelandu-se subrutina wait_answer(). Aceasta, folosind un Timer/Counter 0 si subrutina de tratare a intreruperii prezentata mai sus, calculeaza 2 secunde, timp in care nodul periferic este dator sa raspunda apelului. Pe parcursul celor 2 secunde, se incearca sincronizarea si receptionarea raspunsului folosind subrutina get_frame(), prezentata in subcapitolul.

//********************************************************************

void wait_answer(void){

#asm("sei")

f_to=0;

to_cnt=0;

while ((f_answer_ok!=1) & (f_to!=1))

get_frame();

#asm("cli")

}

//********************************************************************

In modulul “master” este implementat un interpretor de comenzi axat pe extragerea datelor din raspunsurile sosite si luarea de decizii in ceea ce priveste gestiunea nodurilor, afisarea rezultatelor, setarea alarmelor. In cazul sosirii de informatii citite de la senzor, in subrutina sunt setate flaguri de alarma, daca este cazul si este apelata rutina de afisare a rezultatelor pe monitorul PC-ului aflat in comunicatie cu modulul “master”. In cazul informatiilor legate de starea nodurilor (raspuns pentru comanda “autotest”) se apeleaza o subrutina de interpretare a diagnosticului.

//********************************************************************

void interpret_answer(unsigned char id_comanda){

if(id_comanda==0x01); //init nod->fara raspuns

if(id_comanda==0x02) check_autotest(c2); //autotest

if(id_comanda==0x03) //informatii citite de la senzor

{

if(c4>rezultat_critic)

{

alarm_flag=1;

alarm_address=c2<<4;

}

afisare_PC();

blink_answer();

}

if(id_comanda==0x04)alarm_flag=0; //setare alarma->fara raspuns

}

//********************************************************************

Subrutina afisare_PC() apeleaza in mod repetat o rutina dezvoltata in limbaj de asamblare pentru transmiterea pe interfata seriala a cate unui octet. Apelurile succesive ajuta la construirea cadrului in comunicatia master-PC.

//********************************************************************

void afisare_PC(void){

send_byte_PC(0xAA);

send_byte_PC(0xAA);

send_byte_PC(c2);

send_byte_PC(c3);

send_byte_PC(c4);

send_byte_PC(c5);

}

//********************************************************************

void send_byte_PC(unsigned char bt){

i=0; //pinul 6 al portului D a fost initial 1, pentru

//mentinerea starii High a liniei

//acum transmit bitul de start (valoare 0), durata

//de bit 416 μs, conform relatiei x.

PORTD.6=0;

delay_us(416);

//apoi trimit bit cu bit datele pe pinul 6 al

//portului D

do{

testbit=(bt&0x01); //transmit LSB -first

PORTD.6=testbit;

delay_us(416);

//deplasez octetul de transmis spre dreapta astfel

//incat noul LSB sa poata fi transmis

bt=bt>>1;

i++;

}while(i<=7); //fac shiftare&transmitere pana transmit si

//ultimul bit

//reasez linia in starea high si transmit cel putin

//416 μs, reprezentand bitul de stop.

PORTD.6=1;

delay_us(416);

}

//********************************************************************

Subrutina check_autotest preia adresa nodului care a intors rezultatul autoverificarii si, daca rezultatul diagnosticului este negativ, ia decizia de a declara nodul inactiv.

//********************************************************************

void check_autotest(unsigned char adresa_nod){

if(c4==0xFF) noduri[adresa_nod]=0xFF;

}

//********************************************************************

5.3 Descrierea particularitatilor modulelor de tip “slave”

In acest subcapitol voi prezenta particularitatile de initializare ale modulelor de tip “slave”, precum si metoda de scriere a adresei modulului in memoria nevolatila EEPROM. De asemenea, prezentarea si descrierea schemei logice de functionare vor contribui la intelegerea modului de comunicare a modulelor in retea si a modului de obtinere a datelor transmise modulului “master”.

In ceea ce priveste initializarile facute modulelor “slave”, in plus fata de ceea ce am prezentat in subcapitolul dedicat partilor software comune tuturor modulelor.

Initializarea convertorului analog-digital:

//*******************************************************************

//Initializare ADC:

//Referinta de tensiune AVCC: ADMUX b7=0, b6=1

//Aliniere la stanga a rezultatului: ADLAR (ADMUX.5)=1

//Intrare analogica ADC0, deci ADMUX3..0=0

ADMUX=0x60;

//ADC Enable (ADCRSA.7=1)

//Mod: free running (conversie continua):ADCSRA.5=1

//Factor de divizare a frecventei de ceas:128 ADCSRA2..0=1

ADCSRA=0xA7

//********************************************************************

In figura urmatoare este prezentata schema logica de functionare a modulelor de tip “slave”.

O prima subrutina, esentiala pentru functionarea intregului sistem, este citirea din memoria EEPROM a adresei proprii. Adresa proprie este stocata in memoria EEPROM folosind urmatoarele instructiuni in limbaj de asamblare (codul reprezinta exemplul pentru modulul cu adresa de nivel 2 egala cu 1):

//********************************************************************

#asm

.ESEG ;anunta o scriere in EEPROM

.ORG 0001 ;salt la adresa 1 (adresa 0 trebuie sa ramana nemodificata)

.DB 0x01 ;inscrierea adresei folosite la emisie

.ORG 0002 ;salt la adresa EEPROM 2

.DB 0x10 ;inscrierea adresei folosite la receptie

#endasm

//********************************************************************

Compilarea fisierului continand aceste instructiuni are ca efect producerea unui fisier .EEP cu urmatorul continut (exemplu pentru modulul cu adresa 1), care poate apoi fi inscris in memoria EEPROM folosind comanda Program->EEPROM din mediul de dezvoltare CodeVisionAVR:

//********************************************************************

:03000000000110EC

:00000001FF

//********************************************************************

Memoria EEPROM este apoi citita dupa initializarea modulului prin rularea subrutinei urmatoare:

//********************************************************************

void get_id(){

#asm

PUSH R26 ;salvarea registrilor pe stiva

PUSH R27

PUSH R30 ;R30 poate fi salvat pentru ca nu se returneaza

;nici o valoare in el dupa ce se iese din subrutina

LDI R26,LOW(adresat) ;adresat: definit ca $0001 folosind .equ

LDI R27,HIGH(adresat)

RCALL EEPROMRDB

MOV R4,R30 ;din maparea registrilor am observat ca variabila

;globala adrt este stocata in R4; pentru ca get_id sa

;nu returneze in R30, copiez valoarea in registrul

;final

LDI R26,LOW(adresar) ;aceleasi operatiuni pentru adresa de receptie

;definita .equ adresar=$0002

LDI R27,HIGH(adresar)

RCALL EEPROMRDB

MOV R5,R30 ;aceasta este stocata in variabila adrr, mapata in R5

RJMP END_Read

EEPROMRDB: ;subrutina de citire a EEPROM

SBIC EECR,EEWE ;se verifica daca bitul EEWE este 0 (Write Enable)

;fapt ce indica permisia de a scrie in registrul

;SPMCR

RJMP EEPROMRDB

IN R0,SREG ;se importa in R0 registrul de stare SREG

CLI ;

OUT EEARL,R26 ;in registrii EEPROM de adresa se incarca

;adresele stocate in registrii R26 si R27

OUT EEARH,R27

SBI EECR,EERE ;se aloca bitului EERE (Read Enable) valoarea 1

IN R30,EEDR ;se citesc datele din EEDR

;EEDR este locatia EEPROM de la adresa EEAR

OUT SREG,R0 ;se reface registrul de stare

RET

END_Read: ;scoaterea valorilor registrilor de pe stiva

POP R26

POP R27

POP R30

#endasm

}

//*******************************************************************

In continuare se poate observa in functia main() o bucla infinita in care apare, conform schemei logice descrise anterior, asteptarea de comenzi si tratarea lor. Astfel, dupa sesizarea sincronizarii si primirea cu succes a unei comenzi, aceasta este identificata si executata. Apoi se transmite rezultatul folosind functia universala send_frame. Inainte de reluarea buclei se testeaza daca indicatorul pentru alarma a fost activat in ultima ciclare. In acest caz, se activeaza alarma. Pentru modulele “slave” nu am implementat apelul get_frame() din subrutina de asteptare, in primul rand pentru ca aceste module asteapta in continuu mesaje, atunci cand nu sunt ocupate cu executarea comenzilor si in al doilea rand pentru a mentine controlul in nodul central. De asemenea, din acelasi motiv al concentrarii controlului, in nodurile periferice nu am implementat mecanism de cerere automata de retransmisie (ARQ).

//********************************************************************

void main(void){

initializare_nod();

while(1){

while (f_mess_ok!=1) get_frame();

f_mess_ok=0;

interpret_command();

delay_ms(200);

send_frame(adrt,0x03,dt1,dt2);

if(alarm_on==1) set_alarm();

}

}

//********************************************************************

Subrutina interpret_command() este axata pe identificarea comenzii prin evaluarea codului comenzii, transmis in cadrul de date. In functie de aceasta, seteaza anumiti parametri pentru raspuns sau apeleaza subrutine specializate de tratare a comenzilor.

//********************************************************************

void interpret_command(void){

if(c3==0x01) initializare_nod();

if(c3==0x02) autocheck();

if(c3==0x03) dt1=read_adc(0);

if(c3==0x04) alarm_on=1;

}

//********************************************************************

Subrutina initializare_nod() este apelata automat la punerea in functiune a modulului, dar si atunci cand modulul “master” transmite mesajul de initializare retea, care este o transmisie broadcast a mesajului de initializare nod.

//********************************************************************

void initializare_nod(void){

initializare_registri();

delay_ms(200);

get_id();

PORTD.4=1;

f_mess_ok=0;

}

//********************************************************************

Subrutina autocheck() este apelata atunci cand comanda primita de la “master” este “autotest”. In aceasta subrutina se testeaza valorile de initializare a unor registri si, daca acestea corespund, se seteaza parametrii de raspuns cu valoarea 0x00, ceea ce simbolizeaza test efectuat su succes. In caz contrar, parametrii iau valoare 0xFF, semnificand test esuat. La primirea raspunsului, modulul “master” ia decizia de a anula comunicarea cu nodul care s-a autoevaluat ca fiin inoperativ.

//********************************************************************

void autocheck(void){

/*verific:

PORTD.7=0;//bec verde

PORTD.5=1;//alimentare emitator

PORTB.0=0;//bec rosu

PORTD.4=0;//ENABLE REC */

dt1=0x00;

dt2=0x00;

}

//********************************************************************

O ultima subrutina specifica este cea care preia datele de la convertorul analog-numeric si le stocheaza intr-o variabila.

//********************************************************************

unsigned char read_adc(unsigned char adc_input)

{

ADMUX=adc_input|ADC_VREF_TYPE;

ADCSRA|=0x40;

while ((ADCSRA & 0x10)==0); //se asteapta terminarea conversiei

ADCSRA|=0x10;

return ADCH; //se returneaza doar registrul ADCH, rezultatul fiind aliniat la stanga si

//folosindu-se doar 8 biti pentru reprezentarea acestuia

}

//********************************************************************

5.4 Dezvoltarea software a aplicatiei de interfata a retelei cu utilizatorul

In ceea ce priveste dezvoltarea software in cadrul retelei de telemetrie, exista o parte a codului care nu se afla in memoria de program a nici unui modul. Este vorba despre codul necesar generarii ferestrei de aplicatie pentru afisarea datelor pentru utilizator.

Am apelat la limbajul de programare Visual Basic, pentru a crea un Form cu functiile dorite. Selectand din meniul de desgin elementele dorite si aranjandu-le in vedera obtinerii unui aspect acceptabil, a rezultat fereastra de aplicatie vizibila in imaginea de mai jos.

Dupa cum se observa, am utilizat 4 elemente “ProgressBar” si patru elemente de afisare de text pentru afisarea informatiilor primite de la nodurile retelei. Un al cincilea element de afisare a textului este utilizat pentru afisarea ultimului modul de la care s-au primit date.

De asemenea, intr-un element de tip “Picture” am implementat afisarea pe un grafic a rezultatelor. Acest lucru se realizeaza definind elementul principal si apoi trasand linii care reprezinta coordonatele, in cadrul algoritmului.

Prima subrutina a programului incarca fereastra cu toate elementele acesteia, la accesarea aplicatiei

‘––––––––––––––––––––––––––––––––––

Private Sub Form_Load()

‘Se deschide portul serial, dupa setarea parametrilor de comunicatie

‘––––––––––––

With MSComm1

'in primul rand se testeaza ca portul serial sa nu fie deschis

If .PortOpen Then .PortOpen = False

'se alege portul de comunicatie

.CommPort = 1

' setari: baudRate, paritate, biti de date, biti de stop

.Settings = "2400,N,8,1"

'setare flag-uri DRT si RTS

.DTREnable = True

.RTSEnable = True

'evenimentul este activat pentru fiecare caracter receptionat

.RThreshold = 1

'se dezactiveaza pentru caracterele trimise

.SThreshold = 0

'deschiderea portului serial

.PortOpen = True

End With 'MSComm1

‘––––––––––––

‘Setarea catorva parametri pentru elementul tip “Picture”

‘––––––––––––

With Picture1

‘scala pe orizontala si verticala, cu punctele de pornire

.ScaleWidth = 30000

.ScaleHeight = 120

.ScaleLeft = 0

.ScaleTop = 0

End With

‘culoarea de fond a elementului

Picture1.BackColor = vbBlack

‘setarea inceperii reprezentarii din coltul stanga-jos

Picture1.CurrentX = 0

Picture1.CurrentY = 0

‘––––––––––––––––

‘Se apeleaza functiile de liniarizare pentru senzori,

‘care sunt implementate tinand cont de datele experimentale

‘prezentate in subcapitolul

‘––––––––––––––––

Call LiniarizC1

Call LiniarizC2

Call LiniarizC3

Call LiniarizC4

‘––––––––––––––––

End Sub

‘Finalul subrutinei

‘––––––––––––––––––––––––––––––––––

In cea de-a doua subrutina am tratat evenimentele care au loc atunci cand se receptioneaza date dinspre modulul “master”

‘––––––––––––––––––––––––––––––––––

Private Sub MSComm1_OnComm()

Dim strInput As String

Dim NInput As Integer

Dim HInput As String

Dim i As Integer

Dim textweight As String

textweight = ""

With MSComm1

Select Case .CommEvent

Case comEvReceive

Timer1.Enabled = True

'se capteaza datele receptionate

strInput = .Input

i = 0

Do

i = i + 1

Loop Until (i = 6 Or (Asc(Mid$(strInput, i, 1)) = 170 And Asc(Mid$(strInput, i + 1, 1)) = 170))

‘se afiseaza numarul nodului curent (“canalul”)

Text9 = Asc(Mid$(strInput, i + 2, 1))

‘In functie de caracterul de adresa, se afiseaza datele in zona destinata nodului ‘curent

If Asc(Mid$(strInput, i + 2, 1)) = 1 Then

‘Se afiseaza valoarea citita de la senzor

Text1 = ValC1(255 – Asc(Mid$(strInput, i + 4, 1)))

‘Se afiseaza in progress bar valoarea citita

ProgressBar1.Value = Abs(ValC1(255 – Asc(Mid$(strInput, i + 4, 1))))

ProgressBar1.Refresh

c = 1

‘Se seteaza parametrul de amplitudine pentru afisarea pe grafic

SigAmp1 = ValC1(255 – Asc(Mid$(strInput, i + 4, 1)))

End If

Similar se seteaza elementele pentru celelalte doua noduri, cu mentiunea ca numerotarea este consistenta cu numarul nodului:

Nod 2: Text2, ProgressBar2, ValC2, SigAmp2

Nod 3: Text3, ProgressBar3, ValC3, SigAmp3

Nod 4: Text4, ProgressBar4, ValC4, SigAmp4

End Select

End With 'MSComm1

End Sub

‘––––––––––––––––––––––––––––––––––

Se afiseaza graficul

‘––––––––––––––––––––––––––––––––––

Private Sub Graph

‘Se deseneaza grila

Call DrawGrid

Picture1.DrawWidth = 2

‘Apoi, in functie de canalul curent, se afiseaza pe grafic datele,

‘cu culori diferite pentru fiecare canal

If c = 1 Then

‘Se plaseaza pe verticala la amplitudinea curenta

YGrCrt1 = 120 – SigAmp1

‘Se traseaza o linie intre ultimul punct in care s-a aflat graficul pentru

‘nodul curent si punctul determinat curent, mentionand culoarea

Picture1.Line (XGr1 – 1, YGrOld1)-(XGr1, YGrCrt1), vbGreen

XGr1 = XGr1 + 1

YGrOld1 = YGrCrt1

If XGr1 = Picture1.ScaleWidth Then

XGr1 = 0

Picture1.Cls

End If

End If

Similar se afiseaza si pentru c=2..4

End Sub

‘––––––––––––––––––––––––––––––––––

Pentru a implementa liniarizarea, am creat un vector in care am inserat valorile cunoscute. Indicii vectorului sunt reprezentati de valoarea citita in dreptul unei valori de temperatura cunoscute. Apoi am interpolat pentru completarea valorilor lipsa.

Aceasta metoda are dezavantajul de a necesita definirea fiecarui interval, in functie de valoarea afisata de senzorul respectiv pentru valori cunoscute la intervale fixe. Astfel, se pierde avantajul de a seta intervale fixe.

‘––––––––––––––––––––––––––––––––––

Sub LiniarizC1()

‘Plasarea valorilor cunoscute in vector

ValC1(30) = 0

ValC1(39) = 5

ValC1(49) = 10

ValC1(58) = 15

ValC1(68) = 20

ValC1(79) = 25

ValC1(91) = 30

ValC1(103) = 35

ValC1(115) = 40

ValC1(128) = 45

ValC1(139) = 50

ValC1(150) = 55

ValC1(161) = 60

ValC1(171) = 65

ValC1(179) = 70

ValC1(189) = 75

ValC1(196) = 80

ValC1(204) = 85

ValC1(210) = 90

‘Pentru fiecare interval intre doua valori cunoscute, se parcurg elementele necompletate ‘si se interpoleaza in functie de distanta intre cele doua valori cunoscute

k = 1

For i = 31 To 38

ValC1(i) = ValC1(30) + (ValC1(39) – ValC1(30)) / 8 * k

k = k + 1

Next i

k = 1

For i = 40 To 48

ValC1(i) = ValC1(39) + (ValC1(49) – ValC1(39)) / 9 * k

k = k + 1

Next i

k = 1

For i = 50 To 57

ValC1(i) = ValC1(49) + (ValC1(58) – ValC1(49)) / 8 * k

k = k + 1

Next i

k = 1

For i = 59 To 67

ValC1(i) = ValC1(58) + (ValC1(68) – ValC1(58)) / 9 * k

k = k + 1

Next i

k = 1

For i = 69 To 78

ValC1(i) = ValC1(68) + ((ValC1(79) – ValC1(68)) / 10 * k)

k = k + 1

Next i

k = 1

For i = 80 To 90

ValC1(i) = ValC1(79) + (ValC1(91) – ValC1(79)) / 11 * k

k = k + 1

Next i

k = 1

For i = 92 To 102

ValC1(i) = ValC1(91) + (ValC1(103) – ValC1(91)) / 11 * k

k = k + 1

Next i

k = 1

For i = 104 To 114

ValC1(i) = ValC1(103) + (ValC1(115) – ValC1(103)) / 11 * k

k = k + 1

Next i

k = 1

For i = 116 To 127

ValC1(i) = ValC1(115) + (ValC1(128) – ValC1(115)) / 12 * k

k = k + 1

Next i

k = 1

For i = 129 To 138

ValC1(i) = ValC1(128) + (ValC1(139) – ValC1(128)) / 10 * k

k = k + 1

Next i

k = 1

For i = 140 To 149

ValC1(i) = ValC1(139) + (ValC1(150) – ValC1(139)) / 10 * k

k = k + 1

Next i

k = 1

For i = 151 To 160

ValC1(i) = ValC1(150) + (ValC1(161) – ValC1(150)) / 10 * k

k = k + 1

Next i

k = 1

For i = 162 To 170

ValC1(i) = ValC1(161) + (ValC1(171) – ValC1(161)) / 9 * k

k = k + 1

Next i

k = 1

For i = 172 To 178

ValC1(i) = ValC1(171) + (ValC1(179) – ValC1(171)) / 7 * k

k = k + 1

Next i

k = 1

For i = 180 To 188

ValC1(i) = ValC1(179) + (ValC1(189) – ValC1(179)) / 9 * k

k = k + 1

Next i

k = 1

For i = 190 To 195

ValC1(i) = ValC1(189) + (ValC1(196) – ValC1(189)) / 6 * k

k = k + 1

Next i

k = 1

For i = 197 To 203

ValC1(i) = ValC1(196) + (ValC1(204) – ValC1(196)) / 7 * k

k = k + 1

Next i

k = 1

For i = 205 To 209

ValC1(i) = ValC1(204) + (ValC1(210) – ValC1(204)) / 5 * k

k = k + 1

Next i

End Sub

Similar se implementeaza si pentru ceilalti trei senzori, deci LiniarizC2..4. Valorile pentru acesti senzori pot fi consultate in tabelul de la pagina.

Subrutina de desenare a grilei pentru a da elementului “Picture” functia de grafic

‘––––––––––––––––––––––––––––––––––

Sub DrawGrid()

Picture1.DrawWidth = 1

For i=1 To 11

Picture1.Line (0, i*10)-(30000, i*10), vbGrey

Next i

For i=1 To 29

Picture1.Line (i*1000, 0)-(i*1000, 120), vbGrey

i=i+1

Next i

End Sub

‘––––––––––––––––––––––––––––––––––

Concluzii

Dezvoltari ulterioare

In ceea ce priveste dezvoltarile ulterioare ale acestui concept, se cunoaste faptul ca orice produs este generat printr-un proiect, iar orice proiect porneste de la o idee. Ideile insa nu sunt atotcuprinzatoare si nici transpunerea inspre produsul final nu are un procentaj maxim. Astfel este de la sine inteles ca in cadrul acestui proiect exista mai multe directii in care se poate continua dezvoltarea. In lumina celor prezentate anterior, voi elabora cateva dintre optiunile ca care m-am ganadit in acest sens.

O prima directie este aceea de imbunatatire a comunicarii, scop in care ar putea fi optima utilizarea de module transceiver, care au incorporate atat functia de emitator, cat si de receptor, avand o singura antena si un comutator care permite schimbarea modului de lucru. Folosirea unui transceiver ar aduce si un plus in ceea ce priveste gradul de integrare, reducand numarul modulelor care alcatuiesc un nod al retelei. In acest scop ar fi ideale modelele care opereaza in banda 433 MHz, oferite de Parallax[biblio], Linx Technologies[biblio] sau Micrel[biblio].

O alta directie importanta este cresterea gradului de autonomie al nodurilor din retea, care ar fi posibila prin implementarea de sisteme de captare a energiei solare, cu panouri fotovoltaice si baterii reincarcabile. Pentru aceasta se ia in considerare consumul de putere si se cauta o suprafata care sa asigure necesarul zilnic pentru incarcarea bateriilor. Astfel, cu o suprafata de captare de doar cativa centimetri patrati, nodurile ar avea o autonomie cu mult mai mare decat folosind baterii simple, care au o durata de viata limitata. Autonomia este esentiala in aplicatii care necesita plasarea nodurilor in zone greu accesibile sau periculoase, dar si in cazul in care se doreste un sistem cu impact minim asupra mediului inconjurator. Acest scenariu are, la randul sau, limitari, nefiind functional in cazul in care nodurile sunt plasate in incaperi cu luminozitate redusa, incorporate in structura cladirilor sau folosite in aplicatii de monitorizare a conditiilor atmosferice din conducte sau din pesteri.

Un alt domeniu de interes in ceea ce priveste posibilitati de dezvoltare este domeniul colectarii de date si al prelucrarii acestora. In cazul in care accentul ar cadea pe aceasta directie, s-ar putea implementa stocarea datelor intr-o baza de date, folosind deja existenta aplicatie dezvoltata in limbajul Visual Basic sau, pentru a crea functii independente, prin crearea unei noi aplicatii folosind chiar alte limbaje. Dupa crearea bazei de date se pot crea functii de interogare care sa satisfaca cerintele de prelucrare a datelor, furnizand statistici, rezultate comparative, etc. Colectarea de date se poate concentra si in fiecare nod, in acest caz fiind necesare memorii de capacitati mari.

In cazul extinderii retelei, exista motive intemeiate care sustin schimbarea topologiei retelei si a protocolului de acces la mediu. Existenta unui nod central este controversata chiar si in cazul retelelor mici dintr-un punct de vedere, si anume pericolul ca nodul central sa cedeze, determinand incetarea activitatii in intreg sistemul. Indreptarea spre o arhitectura distribuita poate fi raspunsul in acest caz. In plus, pozitionarea nodului de control in centrul retelei ii confera acesteia in mod automat o arie de actiune de forma circulara. Distribuirea controlului permite atingerea unor limite mai indepartate si acoperirea optima a unor zone de forme diverse.

Similar Posts