Search This Blog

Programmable Controller for Home Automation with ATmega32 (RO)

Automat programabil pentru sisteme domotice

Cuprins

Introducere
Capitolul 1.Structura de principiu și Programarea Automatelor Programabile 
1.1.Structura de principiu a Automatului Programabil
1.2.Programarea Automatelor programabile.Diagrama Scară
Capitolul 2.Automate programabile pentru sisteme domotice. Structura de principiu și particularitați
2.1.Structura de principiu a Automatului Programabil pentru sistemele domotice.
2.2.Particularități ale Automatului Programabil pentru sisteme domotice
Capitolul 3.Dezvoltarea Hardware 
3.1.Proiectarea schemei electronice
3.2.Proiectarea plăcii de circuit imprimat
Capitolul 4.Dezvoltarea Firmware
4.1 Descrierea și reprezentarea grafică al fluxului de execuție a programului din memoria microcontrolerului (firmware-ului) 
4.2.Descrierea algoritmului de interpretare a programului recepționat de la interfața software de programare 
Capitolul 5 .Dezvoltarea Software
5.1.Descrierea modului de operare a interfeței software de programare a automatului pentru sisteme domotice
5.2.Realizarea interfeței software în mediul de programare NetBeans utilizând limbajul de programare JAVA
Capitolul 6.Concluzii
6.1.Concluzii
6.2.Upgrade-ul sistemului în versiuni viitoare
Bibliografie

Introducere




  Automatele programabile sunt echipamente cu ajutorul cărora se realizează conducerea automată a proceselor industriale.
  Structura unui proces controlat automat de către un automat programabil este reprezentată cu ajutorul schemei bloc din Fig.1.1 [1]:



Fig.1.1 Structura unui proces automatizat cu ajutorul unui Automat Programabil.

  Astfel, asa cum se poate observa in Fig1.1 de mai sus, automatul programabil efectuează doua sarcini importante:
  • monitorizarea stării procesului, prin achiziția la intrările automatului programabil a varibilelor procesului și interpretarea sau măsurarea acestora;
  • prelucrarea datelor primite la intrări și generarea comenzilor către elementele de execuție din sistemul automatizat dupa un program specific.
   Principalul rol al automatului programabil este acela de a înclocui automatizarile discrete, realizate cu elemente electromecanice, pneumatice sau electronice în logică cablată, aducând, în procesul de realizare a automatizarilor, flexibilitate, structură compactă, fiabilitate marită, programare ușoară si rapidă.
  Un automat programabil este un sistem specializat în tratarea problemelor de logică secvențială si combinațională, simulând sistemele de automatizare realizate în logică cablată printr-o configurație flexibilă si programabilă. De asemenea, automatul programabil trebuie sa fie adaptat la mediul de lucru industrial, să fie capabil sa opereze într-o plajă largă de temperatură și umiditate,sa fie ușor adaptabil la interfațarea cu orice proces și, mai ales, utilizarea și programarea sa trebuie sa fie cât mai facile, astfel încât să nu ridice probleme majore privind formarea sau instruirea personalului de deservire.Toate aceste caracteristici, la care se mai poate adăuga si prețul relativ redus, fac ca automatul programabil sa fie elementul principal în procesele automatizate, atât din sfera industrială cât și din sfera tot mai largă al aplicatiilor domestice.
  Utilizarea logicii programate constituie o modalitate calitativ superioara de realizare a
echipamentelor de comanda. În cazul automatului programabil instrucținile executate și succesiunea acestora sunt implementate in programul înscris în memoria program, astfel asigurându-se o flexibilitate deosebită dispozitivelor de comandă, permițând modificări si dezvoltări ulterioare, în mod foarte ușor. Daca în cazul logicii cablate orice modificare în logica de functionare a echipamentului de comandă implică reproiectarea cablajului, efectuarea a noi conexiuni între elemente, în cazul automatului programabil, modificarea constă în simpla inserare a unor alte instrucțiuni sau linii de cod in programul din memoria program, fără a fi necesare modificari în cablarea inițială a conexiunilor în circuitul logic de comandă, realizându-se astfel economii însemnate de timp si de manopera.
  Totodată, această facilitate de a programa secvențele de execuție în memoria program a automatului permite eliminarea proiectarii hardware a unui sistem automatizat, și facilitează optimizarea procesului automatizat, într-un timp scurt si fără costuri semnificative. Ciclul clasic: conceperea schemei, realizarea cablajului, verificarea functionării, refacerea schemei, etc., se modifica în sensul că se implementeaza programul în memorie cu echipamentul de programare. Eventualele modificari la punerea în functiune a instalației, se fac prin echipamentul de programare fără a afecta cablajul realizat, eficiența activitii de proiectare si implementare crescând considerabil.
  Datorită progresului tehnologic in domeniul digital din ultimii ani, prețul microcontrolerelor cu arhitectura organizată pe 8 biți si a procesoarelor cu arhitectura ARM a scăzut semnificativ, facând posibilă utilizarea acestora în proiecte din afara spațiului industrial. De asemenea, trebuie menționat suportul software pe care firmele producătoare de circuite de acest tip, îl oferă.Acesta este foarte ieftin sau ca și în cazul firmei ATMEL, mediul de programare oferit de catre aceștia, ATMEL STUDIO, este gratis pentru descărcare de pe site-ul producătorului.Din aceste motive, în lucrarea de față mi-am propus proiectarea și realizarea practică a unui automat programabil destinat utilizării în afara mediului industrial, un sistem de automatizare destinat mediului domotic( ”Domotica este o aplicație a calculatoarelor și roboților pentru aplicații casnice. Este un cuvânt compus din domus (latină, însemnând casă) și informatică. ”[2]).




Capitolul 1.


Structura de principiu și Programarea Automatelor Programabile


1.1.Structura de principiu a Automatului Programabil


  Structura hardware de principiu a automatelor programabile este alcatuită, in general, din următoarele module funcționale principale:
  • Unitatea Centrală de procesare, microcontroler sau microprocesor si memorie;
  • Circuite de interfațare aferente semnalelor de Intrare si Iesire;
  • Modul de comunicație cu consola de programare(PC);
  • Sursa de alimentare cu energie.





Fig1.1 Structura de principiu a automatului programabil[1]

  Unitatea centrală de procesare care este raspunzătoare de prelucrarea semnalelor de intrare și execuția secvențială a instrucțiunilor din programul înscris în memorie, în plus față de microprocesor și memorie, conține, de asemenea, cel puțin o interfață la un dispozitiv de programare și poate conține interfețe către alte rețele de comunicație la distanță.
  Circuitele de interfațare aferente semnalelor de intrare și ieșire indeplinesc un rol important în preluarea tensiunilor si semnalelor de la elementele incluse în sistemele operaționale și auxiliare ale instalațiilor automatizate: butoane, comutatoare, limitatoare de cursă, senzori fotoelectrici, senzori de proximitate, traductoare de nivel, traductoare de deplasare incrementale sau absolute și traductoare al căror semnal de ieșire are o variație analogică. Pentru aceste traductoare analogice sau sensori analogici, automatele programabile conțin, de asemenea, ca parte integrată în blocurile de interfațare intrare/ieșire si convertoare analog-numerice cu rezolutii de 8, 10 sau chiar 12 biți , cu rate de eșantionare de pîna la 15kHz.
  De asemenea, un rol foarte important al circuitelor de intrare/ieșire este acela de a izola mărimile electrice vehiculate în procesul automatizat, mărimi ce pot atinge valori care afecteaza unitatea centrală de procesare.
  Cel mai utilizat circuit de izolare este optoizolatorul, informația este transmisă cu ajutorul luminii între un element transmițător (LED) si un element receptor (FOTOTRANZISTOR). Dispozitivul conectat la intrarea optoizolatorului va aprinde LED-ul, a carui lumină comandă intrarea în conducție a canalului colector-emitor al fototranzistorului. Dacă în cazul circuitului de intrare, dispozitivul conectat la intrare va aprinde LED-ul optoizolatorului, în cazul circuitului de ieșire, unitatea centrală de procesare va fi cea care va comanda optoizolatorul, iar fototranzistorul din interiorul optoizolatorului nu este conectat direct la iesirea automatului, el va comanda la rândul său, un circuit cu releu electromagnetic. Acest lucru a fost reprezentat in principiu in Fig1.2 de mai jos.





Fig1.2 Izolarea nivelelor de tensiune în circuitele de intrare/ieșire

  Modulul de comunicație cu consola de programare este în general o unitate de comunicație serială, automatele programabile moderne comunică cu unitatea de programare prin intermediul interfeței USB sau, chiar, Ethernet.
  Unitatea de programare permite introducerea si definitivarea programului în raport cu evolutia mașinii si cu modificarile impuse în secvențele functionale de bază ale acestuia. Soluțiile adoptate de catre fabricanți includ mai multe variante:
  • o consola autonomă cu memorie proprie, specifică metodei de programare off-line (soluție utilizată de catre firma Siemens, console de tip PG);
  • o consolă portabilă, de mici dimensiuni, ce operează împreună cu automatul, utilizând
memoria acestuia, (numit si dispozitiv “hand-held”), specifică metodei de programare on-line;
  • calculatorul personal de tip PC, soluție ce tinde sa înlocuiasca variantele amintite mai sus.
  Prima variantă oferă avantajul unei programări comode, într-un birou de proiectare, deci în varianta off-line, pe când cea de-a doua implică cuplarea directă la automat deci implicit programarea se realizează on-line, nemijlocit în intimitatea procesului tehnologic automatizat.
 Datorită memoriei de capacitate mare a consolei autonome, varianta de programare off-line utilizează de obicei un software complex cu posibilităti multiple de programare, cu o interfață grafică complexă, cu facilități de simulare si testare a programului realizat. Prin contrast, varianta on-line utilizeaza un software minimal, cu posibilități reduse de programare, limitate de obicei la introducerea de cuvinte de comandă, fără interfață grafică. Se poate deci concluziona că programele complexe se realizează, testează si simulează în varianta off-line, în etapa programării on-line făcându-se doar o “ajustare” finală a acestora.
  Utilizarea calculatorului personal tinde să înlocuiască însă ambele variante de mai sus, deoarece combină avantajele programării off-line cu mobilitatea pe care o ofera la ora actuală calculatoarele portabile (tip notebook), ceea ce face inutilă utilizarea dispozitivelor “handheld” și elimină practic delimitarea între metodele off-line și ”on-line”.
  Transmiterea programului de la dispozitivul de programare la automatul programabil și invers, în cazul utilizarii consolei de programare autonome sau a calculatorului personal se face utilizând interfața serială RS 232 sau USB. Pentru modele de automate mai vechi interfețele de programare sunt blocuri funcționale externe, adaptoare ce fac translatarea datelor de la USB la standardul RS232.   Automatele moderne însa , precum Siemens S7-1500, sunt capabile să comunice într-o rețea LAN cu ajutorul comunicației Ethernet.
  De asemenea, automatele programabile industriale moderne sunt prevazute cu sloturi de memorie tip SD externe pe care se pot memora mai multe programe, facând automatul programabil mult mai adaptabil la diferite tipuri de procese .


1.2.Programarea Automatelor programabile.Diagrama Scară


  IEC – International Electrotechnical Commission(Comisia Electrotehnică Internațională)
a definit pentru automatele programabile, standardul IEC 1131.Există patru limbaje de programare definite de acest standard[3]:

  1. Lista de instrucțiuni (eng. Instruction list)este un limbaj similiar cu codul asambler, a fost în mod tradițional utilizat în programarea automatelor programabile.

Exemplu:

FUNCTION D : BOOLEAN
VAR_INPUT
A, B, C : BOOLEAN;
END_VAR
LD A (* Load A and store it in the accumulator *)
OR B (* Or B with the accumulator and store the result in the accumulator *)
AND C (* And C with the accumulator and store the *)
(* result in the accumulator *)
ST D (* Store the accumulator value in D *)
END_FUNCTION

  1. Text Structurat (eng. Structured Text) este un limbaj similar cu limbajul de programare PASCAL.Acesta are instrucțiuni condiționale ca și IF sau CASE , precum și instrucțiuni repetitive ca și FOR...DO...END_FOR, WHILE...DO and REPEAT...UNTIL.

Exemplu:

FUNCTION D : BOOLEAN
VAR_INPUT
A, B, C : BOOLEAN;
END_VAR
D := A OR B AND C;
END_FUNCTION

  1. Diagrama scară (eng. Ladder Diagram) este unmod de programare grafic, asemănător cu descrierea electrică clasică sau desenarea schemei electrice a unui sistem complex.

Exemplu:






  1. Diagrama cu blocuri de funcții (eng. Function Block Diagram) este un limbaj în care toate funcțiile, ieșirile și intrarile sunt reprezentate ca blocuri grafice.Aceste blocuri sunt conectate cu linii, reprezentându-se astfel logica programului sau transmiterea datelor.Direcția este intotdeauna de la stânga la dreapta, excepție facându-se pentru buclele de reacție.

Exemplu:




  Diagramele scară sunt cele mai utilizate in programarea automatelor programabile moderne, pentru că acest tip de programare presupune transpunerea imediată a schemei logice de funcționare a sistemului de automatizare, folosind simboluri grafice pentru contacte, bobine, noduri ale schemelor de automatizare echivalente, realizate cu elemente discrete in logica cablată.Diagrama scara este o reprezentare simbolică a unor panouri cu relee, este constituită din linii orizontale plasate între liniile verticale ce simbolizează tensiunea de alimentare. Pe fiecare treaptă orizontală regăsim trei tipuri principale de simboluri: Contacte normal deschise si normal inchise; Bobine de releu activate de circulatia curentului; Casete ce pot reprezenta relee de timp sau relee numărătoare.
  În figurile de mai jos sunt exemplificate, o secvență de program reprezentată cu ajutorul diagramei scară, respectiv, câteva exemple de simboluri utilizate în aceste diagrame.Simbolurile sunt, dupa cum se poate observa in Fig 1.4, sugestive, facând facilă recunoașterea elementelor de intrare/ieșire la citirea diagramei.




Fig.1.3 Exemplu de program reprezentat cu ajutorul diagramei scară[4]




Fig1.4 Exemple de simboluri utilizate in diagramele scară[5]




Capitolul 2


Automate programabile pentru sisteme domotice. Structura de principiu și particularitați

2.1.Structura de principiu a Automatului Programabil pentru sistemele domotice


  Așa cum am menționat în Introducere, în această lucrarea mi-am propus proiectarea și realizarea practică a unui automat programabil pentru sisteme domotice. În proiectarea acestuia am urmărit obținerea unui sistem programabil fiabil, ușor de instalat, ușor de utilizat, și posibilitatea realizarii practice la preț cât mai scăzut.Cea mai mare atenție s-a acordat interfeței de programare, aceasta fiind și cea mai mare provocare in procesul de concepere a acestui sistem programabil.
  Dupa cum am prezentat in capitolul anterior, programarea automatelor programabile industriale se face utilizând limbaje specifice. În cazul automatului pentru domeniul domotic nu se dorește utilizarea limbajelor specifice celor industriale,ci, am dorit o formă mult mai simplă pentru reprezentarea programului, o formă ușor de reprezentat de către persoane care nu au nici un fel de cunoștințe din domeniul industrial sau, mai mult, in domeniu automatelor programabile.
  Structura hardware de funcționare a automatului pentru sistemele domotice dorește să mențină, cât mai acurat posibil, structura generală a automatelor programabile industriale, structură prezentată în capitolul anterior:
  • Unitatea Centrală de procesare, microcontroler sau microprocesor si memorie;
  • Circuite de interfațare aferente semnalelor de Intrare si Iesire;
  • Modul de comunicație cu consola de programare(PC);
  • Sursa de alimentare cu energie.
  Unitatea centrală de procesare și memoria din automatul programabil propus sunt constituite în microcontrolerul ales, ATMEGA32, fabricat de firma ATMEL, un microcontroler cu arhitectura organizată pe 8 biți.
  Circuitele de interfațare a semnalelor de intrare și ieșire au fost proiectate urmărindu-se, ca și in cazul automatelor industriale, izolarea semnalelor de intrare/ieșire față de circuitul unitații centrale. S-a obținut astfel, nu numai protejarea microcontrolerului împotriva semnalelor de nivel periculos, dar și flexibilitate în utilizarea unei palete largi de dispozitive de intrare, senzori și elemente de comandă, ca exemplu utilizarea releelor cu diferite tensiuni de comandă.
  Comunicarea între automatul propus și interfața de programare sau între alte automate programabile de același tip, s-a dorit a fi o comunicație de tip ehernet ca și intr-o rețea locală de calculatoare (LAN). Această configurație a dus la posibilitatea expansiunii sistemului de automatizare, fiind posibilă conectarea mai multor automate programabile intr-o rețea, cât și la posibilitatea programării acestora de la distanță, de la unul sau mai multe calculatoare PC aflate în interiorul rețelei.
  Prețul tot mai scazut al ROUTERELOR wireless utilizate in rețele locale, cu predilecție cele concepute pentru uzul în rețele mici utiliazate în case si apartamente, a făcut ca securizarea acestei rețele locale formată din automatele programabile propuse sa fie o sarcină ce-i revine doar ROUTER-ului wireless folosit in această rețea. În figura 2.1 este reprezentată o configurație posibilă, utilizându-se patru automate programabile propuse in această lucrare, conectate intr-o rețea LAN cu ajutorul unui ROUTER wireless și programate sau comandate de către doua calculatoare PC aflate in interiorul acesei rețele.
  Sursa de alimentare cu energie a automatului este una externă, exact ca și în cazul automatelor programabile industriale. Sursa alimentează circuitele logice cu o tensiune stabilizată de 5V, iar pentru elementele exterioare de comandă și cele de intrare, sursa oferă o tensiune stabilizată de 12V. S-a ales o sursă externă, deoarece tensiunile de alimentare a elementelor externe de intrare/ieșire pot fi mai mari sau mai mici față de tensiunea de alimetare a circuitelor logice, datorită izolării realizate în circuitele de interfațare a semnalelor de intrare/ieșire.
  Spre deosebire de automatele programabile industriale, automatul programabil propus este proiectat pentru utilizarea sa în sisteme domotice și nu trebuie să fie adaptabil la funcționarea în mediul industrial. Deși, intrările automatului sunt capabile să preia semnale de la senzori utilizați în mediul industrial, aplicațiile în care se va folosi automatul programabil propus nu trebuie să ridice pretențiile întâlnite în cadrul sistemelor de automatizare industriale. De aceea, automatul programabil pentru sisteme domotice propus, a fost echipat, în structura sa, cu trei sensori pentru măsurarea temperaturii mediului ambiant, măsurarea umiditații în aer și măsurarea intensității luminii din mediul ambiant, elemente neîntalnite în cazul structurii interne a automatelor industriale. De asemenea, au mai fost adăugate un circuit de ceas și calendar (RTC-real time clock), un ecran alfanumeric lcd și butoane, pentru citirea sau introducerea anumitor date de către utilizator.
  Figura 2.2 delimitează structura automatului programabil pentru sisteme domotice propus în șase blocuri funcționale principale:
  1. Unitatea centrala de procesare realizată în jurul microcontrolerului ATMEGA32;
  2. Interfața cu utilizatorul formata din ecranul LCD alfanumeric și patru butoane;
  3. Circuitul de ceas și calendar;
  4. Blocul de senzori format din senzorul de temperatura TMP36, senzorul de umiditate HIH4030 și senzorul de masurare a intensității luminii care este un fotorezistor.
  5. Interfața de comunicare Ethernet realizată în jurul circuitul integrat ENC28J60, produs de firma Microchip;
  6. Circuitul de interfațare și izolare a semnalelor de intrare/ieșire.







Fig.2.2 Structura internă de principiu a automatului programabil pentru sisteme domotice propus spre realizare



Fig 2.1 Exemplu de configurație a unei rețele de automate programabile pentru sisteme domotice

2.2.Particularități ale Automatului Programabil pentru sisteme domotice


  O particularitate importantă o constitue structura internă a acestui automat. Așa cum s-a descris mai sus, în structura automatului programabil propus, s-au adaugat câteva elemente neîntalnite, in general, în structura internă a automatelor programabile industriale.
  Interfața cu utilizatorul conține un afișaj alfanumeric. Această componentă nu este des încorporată în structura automatului industrial propriu zis, ci , este o unitatea separată conectată, de obicei, prin cablu la automatul programabil cu care comunica cu ajutorul unui protocol serial. În figura 2.3 este reprezentată o astfel de configurație formată de un automat programabil industrial produs de firma Siemens, S7-400, conectat la o interfață cu utilizatorul.


Fig.2.3 Automatul programabil S7-400 produs de SIEMENS conectat cu ajutorul interfeței seriale cu un modul de interfațare cu utilizatorul[6]

  Trebuie menționat că există în prezent automate programabile industriale care au încorporate elemente de afișare, însă, acestea sunt afișaje lcd grafice sau în cazul automatelor industriale din seria S7-1000 SIEMENS, afișaje TFT color (vezi figura 2.4). Aceste tipuri de afișaje se pot achiziționa la prețuri mult mai ridicate față de afișajul alfanumeric propus.




Fig.2.4 Automate programabile Siemens echipate cu ecrane TFT color[7]

  O altă particularitate importantă a automatului programabil propus spre realizare în această lucrare sunt senzorii încorporați în structura sa internă. În general, in cazul automatelor industriale, elementele de intrare de acest tip fac parte din procesul urmărit si controlat de automatul programabil, astfel că, senzorii sunt conectați extern la interfața de intrare a automatului programabil. Automatul programabil propus, nu respectă rigorile cerute în mediul industrial, și nu necesită măsurarea cu precizie a semnalelor de intrare și, de aceea, nu s-a dorit implementarea unor circuite complexe pentru măsurarea cu precizie a caracteristicilor mediului ambiant. Senzorii atașați în structura automatului formează o particularitate ce s-a considerat a fi necesară în structura unui dispozitiv de acest tip, eliberând intrefața de intrare a automatului prin montarea lor în structura internă și nu în circuitul extern conectat la interfața de intrare a automatului. De asemenea, automatul programabil este propus pentru uzul în sisteme domotice, unde, se presupe că va fi operat de catre utilizatori fără cunoștințe în domeniul electric, așa deci, s-a preferat adăugarea acestor senzori în interiorul structurii automatului, scutind utiliazatorul de sarcina de a conecta exterior elemente de acest tip.
  Circuitul de ceas și calendar realizat în jurul circuitului integrat PCF8563 fabricat de firma NXP, este o particularitate importantă, atît pentru structura automatului programabil, cât și pentru interfața cu utilizatorul. Acest circuit este capabil să incrementeze un ceas de timp și calendar, având, în structura circuitului de alimentare, adăugat un condensator cu valoarea de 1 Farad, facând posibilă menținerea incrementării și în lipsa tensiunii de alimentare. Folosirea externă a unui astfel de circuit elimină din structura programului (firmware-ului), înscris în memoria microcontrolerului, implementarea software a unei astfel de funcții și face posibilă funcționarea pe perioadă îndelungată, fără resetarea sau pierdera incrementarii.
  O carcteristică foarte importantă a automatului programabil pentru sisteme domotice propus, este interfața de comunicare și programare. Așa cum s-a descris mai sus, automatul propus, poate fi connectat intr-o rețea ethernet de tip LAN, acesta având adresa de ip și adresa MAC proprie, înscrisă în memorie. Particularitea, insă, constă în protocolul de comunicare ales, acesta fiind UDP(eng. User Datagram Protocol), un protocol neutilizat in spațiul industrial, deoarece acest protocol nu asigură integritatea datelor transmise și nu verifică recepționarea datelor de către destinatar dupa transmitere. Acest protocol a fost ales pentru automatul programabil propus, pentru că este compatibil cu resursele oferite de microcontrolerul utilizat. Protocolul UDP nu necesită, în implementarea sa software, resurse foarte mari în ceea ce privește memoria de tip RAM din interiorul microcontrolerului.
  Inițial, la începutul dezvoltării acestui proiect, am încercat implementarea protocolului și transmisia datelor utilizând TCP (eng. Transmission Control Protocol) , folosind microcontrolerul ATMEGA16 produs de firma ATMEL, microcontroler similar cu ATMEGA32, însă cu resurse mai mici în ceea ce privește memoria RAM. Înlocuirea microcontrolerului ATMEGA16 , care deține 1kOctet memorie RAM, cu ATMEGA 32, echipat cu 2kOcteți memorie RAM, nu a dus la implementarea cu succes a transmisiei datelor utilizând protocolul TCP.
  Resursele limitate oferite de microcontrolerele AVR (ATMEGA32) ATMEL, utilizate în dezvoltarea automatului programabil propus, au dus la conceperea unui algoritm de transmitere, analiză și memorare a datelor, eficient în utilizarea resurselor și fiabil.
  Protocolul corespunde nivelului transport din stiva TCP/IP. TCP oferă un serviciu de comunicare la un nivel intermediar între o aplicație și Protocolul Internet (IP). Atunci când o aplicație dorește sa trimită o bucată mare de date pe Internet, în loc sa fragmenteze datele în pachete IP de dimensiuni mici și sa emită o serie de cereri pentru protocolul IP, software-ul poate emite o cerere unică pentru TCP și să lase protocolul TCP să se ocupe de detaliile de manipulare.
  Protocolul Internet (IP) se ocupa cu schimbul de blocuri de informații numite pachete. Un pachet este o secvență de octeți și constă dintr-un antet, urmată de secțiunea de date propriu-zise. Antetul furnizează informații despre destinația pachetului și, opțional, informații de rutare utilizate pentru transmitere, până când acesta ajunge la destinația sa finală. Secțiunea de date conține informația necesara pe care IP trebuie sa o transmită.
  Un segment TCP este format dintr-un antet segment și o secțiune de date. Antetul TCP conține 10 câmpuri obligatorii, și un câmp opțional de extensie (fundal roz în tabelul din fig.2.5).Secțiunea de date urmează antetul. Lungimea secțiunii de date nu este specificată în antetul segmentului TCP. Aceasta poate fi calculată prin scăderea lungimii combinate a antetului TCP și antetului IP încapsulate, din lungimea totală a datagramelor IP (specificat în antetul IP).




Fig.2.5 Structura antetului TCP[8]

În cazul protocolului UDP, antetul UDP este alcătuit din patru câmpuri, fiecare având lungimea de 2 octeți.



Fig.2.6 Structura antetului UDP[9]

  Portul sursa (eng. Source Port) - în adresarea bazata pe IPv4 acest câmp este opțional. Daca nu este utilizat acest câmp, are valoarea zero; când reprezintă informație semnificativă, el va indica portul inițiator al procesului de transmisie a datagramelor.
  Portul destinție (eng. Destination Port) - spre deosebire de portul sursă, câmpul este obligatoriu și indică portul de recepție
  Lungimea (eng. Length) - acest câmp indica lungimea în octeți a datagramei: antet plus secțiune de date (valoarea minima a lungimii este 8).
  Suma de control (eng. Checksum) - asigură imunitatea la erori; se calculează ca fiind complementul fată de 1 (pe 16 biți) a pseudo-antetului cu informații extrase din antetul IP, antetului UDP și a câmpului de date, eventual se completează cu zerouri pentru a atinge lungimea stabilită.
  Pseudo-antetul prefixează antetul UDP și va conține, printre altele, adresele sursă, destinație, lungimea pachetului UDP.
  Așa cum se observă în descrierea scurtă, de mai sus, utilizarea protocolului de transport UDP, este cel mai potrivit pentru transportarea datelor dintre automatul programabil propus și rețeaua din care face parte. Față de protocolul TCP, sunt mult mai puțini octeți de reținut in memorie pentru formarea antetului în procesul de comunicare, folosind protocolul UDP.
  Ca și în cazul automatelor programabile industriale, automatul propus are nevoie de o interfață de programare, pentru a recepționa instrucținile ce trebuiesc executate, sub forma unui program. Interfața este o aplicație software pe care am realizat-o utilizând limbajul Java si care este capabilă sa ruleze atât în sistemul de operare Windows 7 și 8 , cât și în versiunile Ubuntu ale sistemului de operare Linux. Interfața nu este un mediu de programare specific limbajelor de programare pentru automatele programabile industriale, cum ar fi, spre exemplu, diagramele scară, ci, dorește a fi o interfață ușor de folosit, în care, utilizatorul va trebui doar să selecteze condițiile în care dorește ca un anumit element de control să fie acționat. Această interfață software de programare va fi descrisă în detaliu în capitolul 5 a acestei lucrări.
  Modul în care automatul primește și memorează programul de la interfața de programare este un protocol conceput special pentru acest automat. Practic, interfața de programare formează un șir de caractere și numere, în funcție de logica de funcționare a automatului impusă de utilizator și definită prin utilizarea interfeței software. Secvența carcaterelor din șir respectă reguli stabilite, astfel încât permite algoritmului care citește acest șir, să determine acțiunile pe care automatul trebuie sa le execute. Șirul este memorat într-un tablou cu o singură dimensiune, apoi citit, urmărind fiecare caracter în parte și cu o serie de instrucțiuni de tipul IF..ELSE sunt luate deciziile necesare pentru acționarea dispozitivelor conectate la ieșirea automatului.
  Detaliile privitoare la structura programului din memoria microcontrolerului (firmware-ului) și la structura interfeței software de programare vor fi descrise în capitolele 4, și respectiv 5.



Capitolul 3


Dezvoltarea Hardware


3.1.Proiectarea schemei electronice


  Schema electronică de principiu a automatului programabil pentru sisteme domotice propus spre realizare practică în această lucrare, se poate împarții în câteva blocuri funcționale principale:
  1. Circuitul unității logice de procesare realizat cu microcontrolerul ATMEGA32;
  2. Circuitul de interfațare a semnalelor de intrare/ieșire realizat în jurul circuitului integrat MCP32017 fabricat de firma Microchip;
  3. Circuitul de Ceas și Calendar construit cu ajutorul circuitului integrat PCF8563 fabricat de firma NXP;
  4. Circuitul de măsurare a temperaturii, umidității și intensității luminii mediului ambiant, construit cu TMP36, senzor de temperatură analogic, fabricat de firma Analog Devices, HIH4030, senzor de umiditate analogic, fabricat de firma Honeywell și un fotorezistor într-un circuit divizor de tensiune.
  5. Circuitul intefeței de comunicare Ethernet construit cu circuitul integrat ENC28J60, fabricat de firma Microchip;
  6. Circuitul interfeței cu utilizatorul.


Fig.3.1 Schema bloc a automatului programabil pentru sistemele domotice

   În Fig.3.1 este reprezentată structura automatului propus sub forma unei scheme bloc de principiu și, de asemenea, sunt reprezentate cu diferite culori, magistralele de date, cu protocoalele de comunicare aferenete. Semnalele senzorilor analogici sunt recepționate de către portul echipat cu convertor analog numeric al microcontrolerului. Afișajul LCD și cele patru butoane folosite în circuitul interfeței cu utilizatorul sunt conectate printr-un bus paralel de date, la porturi paralele digitale ale microcontrolerului. Circuitul interfeței semnalelor de intrare/ieșire a fost construit utilizându-se circuitul integrat MCP23017 (Microchip), care comunică cu microcontrolerul pe busul serial I2C (eng. Inter-Integrated Circuit), la fel ca și în cazul circuitului de ceas și calendar construit cu circuitul integrat PCF8563(NXP), iar pentru realizarea circuitului intefeței de comunicare ethernet s-a folosit ENC28J60 (Microchip) , care comunică cu microcontrolerul pe busul serial de date SPI (eng. Serial Peripheral Interface).
 Elementul principal al circuitului electronic, al automatului programabil propus, este microcontrolerul cu arhitectura RISC (eng. Reduced instruction set computing), ATMEGA32 fabricat de firma ATMEL, care are următoarele caracteristici importante, conform foii de catalog oferite de producător[10]:
  1. Capacitatea memoriei program de tip flash este 32kOcteți;
  2. Capacitatea memoriei SRAM este 2kOcteți;
  3. Capacitatea memoriei EEPROM este 1024 Octeți;
  4. Frecvența de tact maximă de operare este 16MHz;
  5. Numărul maxim de pini intrare/ieșire este 32;
  6. O singură interfață de comunicare SPI implementată în structura internă;
  7. O singură interfață de comunicare I2C implementată în structura internă;
  8. O singură interfață de comunicare UART(comunicație serială asincronă) implementată în structura internă;
  9. Convertor analog-numeric cu 8 canale, construit în interiorul structurii microcontrolerului;
  10. Rezoluția convertorului analog-numeric este de 10 biți;
  11. Viteza maximă de eșantionare la conversia analog-numerică este de 15ksps;
  12. Trei circuite de temporizare (eng TIMER)sunt implementate în structura microcontrolerului;
  13. Patru circuite de PWM (eng. pulse width modulation), modulare în pulse, sunt implentate în interior.








Fig.3.2 Schema electronică de principiu a circuitului unității centrale de procesare realizată cu ATMEGA32


  Așa cum se observă în fig.3.2 microcontrolerul operează cu o frecvență de tact de 16MHz, stabilită cu ajutorul quartzului XT1, conectat la oscilatorul intern al microcontrolerului, la pinii 12 și 13 și condensatorii C1, C2. Tensiunea de +5V, aplicată întregului circuit logic, alimentează microcontrolerul la pinul 10, fiind filtrată în prealabil de condensatorul C3. Filtrele R1,C5 și R2,C4, elimină eventualele elemente parazite aflate în tensiunea de alimentare, pentru a fi aplicată, în continuare, pinilor AVCC, pentru alimentarea convertorului anlog-numeric aflat în interiorul microcontrolerului și AREF, pentru stabilirea tensiunii de referință a converorului analog-numeric.
  Porturile PA, PB, PC și PD sunt porturi de 8 octeți ale microcontrolerului a căror rol funcțional poate fi stabilit intern, prin configurarea regiștrilor aferenți fiecarui port. Astfel, portul PA a fost configurat ca intrare pentru convertorul analog-numeric. Trebuie menționat că microcontrolerul este echipat cu un singur CAN, iar un multiplexor selectatează una din cele 8 intrari ale portului, pentru conversie. Senzorii analogici au fost conectați la acest port la pinii PA1, PA2, PA3, iar pinii PA4, PA5, PA6 și PA7 preiau semnale analogice de la eventualii senzori analogici externi ce pot fi conectați de utilizator prin intermediul unui conector așezat pe placa de circuit imprimat. Tensiunea aplicată acestor pini de intrare CAN trebuie sa fie cuprinsă între 0 și +5V.
  La portul PB al microcontrolerului sunt conectate butoanele interfeței cu utilizatorul, la pinii PB0, PB1, PB2, PB3, configurați ca intrări digitale cu ajutorul regiștrilor aferenți acestui port. Butoanele au fost conectate utilizând un circuit pull-up cu rezistori, pentru a asigura nivel logic high
(1 logic) la intrarile digitale ale microcontrolerului, pe perioada cât aceastea nu sunt acționate. Pinii PB4, PB5, PB6 și PB7 reprezintă portul SPI al microcontrolerului, utilizat în comunicarea cu interfața Ethernet. Interfața SPI folosește 4 fire (eng. 4 wire communication) pentru transmiterea și recepționarea datelor. O observație importantă referitoare la acest bus de comunicație este faptul că se utilizează fire diferite pentru transmiterea și recepționarea datelor, ceea ce face transmisia de date, pe acest bus, foarte rapidă față de busul I2C sau UART.
            Semnalele SPI sunt:

SCK – Semnal de tact pentru sincronizarea transmisiei și recepționării datelor;

MISO – (eng. Master In Slave Out) Pin pentru recepționarea datelor de la dispozitivului sclav, în cazul de față , interfața de comunicare Ethernet;

MOSI – (eng. Master Out Slave In) Pin pentru transmiterea datelor către dispozitivul sclav, în cazul de față, interfața de comunicare Ethernet;

CS – (eng. Chip Select) Pin pentru selectarea dispozitivului conectat pe busul SPI, pentru că busul permite conectarea mai multor circuite.

  Interfața SPI este folosită de asemenea, la înscrierea programului (firmware-ului) în memoria program de tip flash a microcontrolerului. În figura 3.2 este reprezentat conectorul pentru programare, denumit ICSP (eng. In Circuit Serial Programming), care respectă standardul de conectare a programatoarelor ATMEL. Pentru înscrierea programului (firmware-ului) în memoria program a microcontrolerului, pentru acest proiect, am folosit programatorul AVRISP mkII, fabricat de producătorul microcontrolerului ATMEGA32 , ATMEL.
  Afișajul LCD alfanumeric este de tipul 24 caractere x 2 rânduri[11], iar pentru comunicarea cu acesta este nevoie de 4 biți de date și 2 biți de control:

D4, D5, D6, D7 – Biți de date;

E - Selectare LCD (eng. Enable);

RS – Selectarea Înscriere/Citire Regiștrii Interni (eng. Register Select) .

  Aceste semnale sunt conectate la portul PC al microcontrolerului , așa cum se observă în fig.3.2.
  Pinii PC0 și PC1 reprezintă busul de comunicare cu circuitele integrate PCF8563(circuit RTC)[12] și MCP23017(Expandor intrare/ieșire)[13]. Acest tip de comunicare, I2C, necesită utilizarea a doua semnale:

SCL - (eng. Serial Clock) Semnal de tact pentru sincronizarea transmisiei și recepționării datelor;

SDA – (eng. Serial Data) Semnal ce conține datele comunicate pe acest bus, în mod serial.

  Din punct de vedere al circuitului electronic, busul I2C de comunicare serială, necesită folosirea unui circuit rezistiv de pull-up, deoarece, spre deosebire de busurile UART sau SPI, pinii utilizați pentru aceast tip de comunicare sunt de tipul Drena în gol (eng. Open-Drain). În figura 3.3 se pot observa rezistoarele R4 și R5, care îndeplinesc acest rol.
  Portul PD al microcontrolerului, nu este utilizat în construcția automatului programabil propus, însă a fost conectat la bornele unui conector, denumit în schema de principiu EXTENSIE I/O,PWM,INT,UART, pentru eventualele înbunătațiri care vor fi aduse, în viitor, acestui proiect.




Fig.3.3 Schema electronică de principiu. Conectarea interfeței cu utilizatorul la porturile microcontrolerului.Conectorul ICSP de programare.Conector extensie.Rezistori pull-up pentru I2C și butoane.


Pentru măsurarea temperaturii s-a folosit senzorul TMP36 (Analog Devices), care oferă la ieșire o tensiune electrică proporțională cu temperatura în grade Celsius, a mediului ambiant. Conform datelor de catalog oferite de producător, senzorul, nu necesită nici un fel de calibrare externă și are o precizie tipică de ± 1 ° C la + 25 ° C si ± 2 ° C la intervalul de temperatura de la -40 °C pana la + 125 ° C. Funcționează cu o tensiune de alimentare de 2.7 - 5.5 V DC. În figura 3.4 de mai jos, se poate urmării evoluția tensiunii de ieșire proporțional cu valoarea temperaturii mediului ambiant, prezentat în foaia de catalog oferită de producător.





Fig.3.4 Graficul evoluției tensiunii de ieșire în funcție de valoarea temperaturii mediului ambiant[14]

  De asemenea, conform foii de catalog, senzorul oferă la ieșire o tensiune de 750mV la 25° C. Tensiunea citită la pinul de ieșire poate fi convertită în grade Celsius folosind factorul de scalare de 10 mV / ° C, ținîndu-se cont și de tensiunea de offset specificată în foaia de parametrii a senzorului (eng. Datasheet), 0,5V.
  Măsurarea umiditații relative în mediul ambiant, este realizată folosind senzorul HIH4030, fabricat de firma Honeywell. Producătorul recomndă, în foaia de catog, folosirea acestui senzor, intr-un mediu cu valori ale temperaturii între 0 și 50 ° C, pentru valori ale umiditații între 0 și 100%.



Fig.3.6 Mediul de operare recomandat de producător pentru folosirea senzorului HIH4030[15]

  Dupa cum se poate observa în figura 3.6, senzorul se poate utiliza în acest proiect, având în vedere că automatul programabil pentru sisteme domotice propus, va funcționa la valori ale temperaturii și umiditații specifice imobilelor, case sau apartamente.
  Senzorul HIH4030 este analogic, drept urmare, ca și în cazul senzorului de temperatură, acesta oferă la ieșire o tensiune electrică proporționla cu valoarea umiditații în aer. Foaia de catalog menționeaza o valoare de 0,958V , ca fiind offsetul tensiunii de ieșire la 0% umiditate. Umiditatea relativă măsurată se obține folosind formula Sensor RH = (VOUT – 0.958)/0.0307, conform foii de catalog, unde VOUT este tensiunea electrică măsurată la pinul de ieșire a senzorului. De asemnea, valoarea obținută este compensată cu temperatura folosind formula True RH = (Sensor RH)/(1.0546 – 0.00216 T), unde T este valoarea temperaturii în ºC.
  Măsurarea intensității luminii am realizat-o utilizând un fotorezistor conectat într-un circuit divizor rezistiv. În figura 3.7 este reprezentat acest circuit împreună cu formula de calculc a tensiunii de ieșire din acest circuit. S-a avut în vedere că fotorezistorul are valori cuprinse între 100Ohm în întuneric și 100kOhm pentru lumina zilei. Valorile au fost determinate prin măsurarea rezistivitații la pinii fotorezistorului, în mod experimental, expunând fotorezistorul la diferite valori ale intensitații luminii.Astfel, am obținut valori ale tensiunii de ieșire a circuitului divizor cu fotorezistor, cuprinse între aproximativ 0,5V și 4,5V. Această tensiune este aplicată portului analogic la pinul PA3 al microcontrolerului.




Fig.3.7 Circuitul divizor rezistiv cu fotorezistor. Formula de calcul a tensiunii electrice obținute la ieșire

  Valoarea măsurată la ieșirea acestui circuit, este afișată de microcontroler pe LCD-ul de 24 x 2 carcatere, astfel, facându-se facilă determinarea aproximativă a intensitații luminii în mediul de operare a automatului, în procesul de programare a automatului de către utilizator.
  La portul analogic, pinii PA4, PA5, PA6, PA7, așa cum am menționat și mai sus, se aplică tensiuni electrice de la ieșirea eventualilor senzori care pot fi montați în exterior, de către utilizator.
  Tensiunile electrice citite la acești pini sunt afișate de asemenea, urmând ca, etalonarea și interpretarea valorilor achiziționate și afișate, sa fie facute de către utilizator. Pentru testarea automatului programabil propus, s-au montat potențiometre , prin intermediul cărora s-au aplicat tensiuni variabile în plaja 0V - +5V, și s-au facut programe pentru automat, care comandă una din ieșirile automatului, în funcție de depașirea unui prag de tensiune impus.
  Trebuie menționat că fiecare ieșire aferentă senzorilor descriși mai sus, a fost filtrată de eventualele elemente parazite, cu ajutorul unor condensatoare cu valoarea de 100nF. Aceste condensatoare introduc întârzieri în determinarea valorilor de la ieșirea senzorilor, însa , așa cum am mai precizat și în rândurile de mai sus, automatul programabil propus este proiectat să lucreze în medii domestice, fără a avea pretenția caracteristicilor unui automat programabil industrial, prin urmare, nu s-a dorit viteză și precizie înaltă la citirea valorilor oferiți de acești senzori.
  Circuitul integrat PCF8563 este folosit pentru a construii un modul de ceas de timp real (eng. Real Time Clock). Acest circuit integrat comunică cu microcontrolerul prin intermediul interfeței seriale I2C, oferind date ce conțin ora, minutul și secunda ceasului, precum și ziua, luna și anul calendarului. Din punct de vedere al schemei electronice de principiu, circuitul integrat necesită un cristal de quartz cu frecvența de 32,768kHz, conectat la oscilatorul intern, pentru funcționarea corectă. Așa cum se poate observa în figura 3.8, circuitul este alimentat cu tensiune electrică de 5V, prin dioada D10, asigurându-se, în același timp și încărcarea capacitorului cu valoarea de 1F, SC1, prin rezistorul R35. Capacitorul SC1, asigură alimentarea circuitului și implicit funcționarea acestuia și în lipsa tensiunii de alimentare +5V. Dioda D10, blocheaza scurgerea tensiunii de alimentare către borna de +5V, asigurând astfel alimentarea exclusiva a circuitului integrat PCF8563. Condensatorul C8 filtrează local tensiunea de alimentare, de eventualele elemente parazite induse în circuitul de alimetare. Rezistorul R35 previne consumul de curent excesiv, în cazul în care condensatorul SC1 este descărcat și prezintă o rezistivitate scăzută la bornele sale.


Fig.3.8 Circuitul de ceas de timp real (eng. Real Time Clock) construit cu PCF8563

  Pe acelși bus de date serial I2C, comunică cu microcontrolerul și circuitul integrat MCP23017, folosit la construcția interfeței semnalelor de intrare și ieșire. Acesta este, în fapt, un expandor al porturilor digitale de intrare/ieșire, utilizat pentru a elibera porturile digitale implementate în microcontroler. Circuitul are două porturi de 8Octeți ce pot fi configurați ca intrari sau ieșiri digitale și trei pini pentru stabilirea adresei hardware pentru comunicarea I2C , ceea ce face posibilă utilizarea a opt astfel de circuite, conectate în paralel pe busul de date I2C, lărgind numarul de porturi a unui microcontroler până la 16 porturi digitale de 8 Octeți. Pinii de adresare A0, A1, A2, au fost conectați la masa circuitului , obținându-se astfel, o adresă diferită de cea a circuitului de ceas. Condensatorul C10 are rolul de a filtra local tensiunea de alimentare.
  Portul GPA a circuitului integrat expandor MCP23017 a fost configurat, cu ajutorul regiștrilor interni, ca și port de ieșire. Acesta, prin intermediul optocuploarelor OK9, OK10, OK11, OK12, OK13, OK14, OK15, OK16, asigură comanda dispozitivelor de control conectate la ieșirea automatului programabil. Tranzitorii T1, T2, T3, T4, T5, T6, T7 și T8, elibereaza portul digital al circuitului MCP23017 de sarcina electrică pe care o reprezintă ledurile interne optocuploarelor.
   Automatul programabil pentru sistemele domotice propus, prezintă la fiecare ieșire, atât colectorul în gol, cât și emitorul în gol, al tranzistorului intern optocuplorului. Această configurație face flexibilă conectarea oricărui element de control extern, ca exemplu, module echipate cu relee, tranzistoare mosfet, triace, ș.a.m.d., și proiectarea ușoară a acestora. Un astfel de modul poate fi schema prezentată în figura 3.14, acesta este echipat cu opt relee electromagnetice ce pot comuta curenți de pâna la 10 A și tensiuni de pâna la 250V. Alte module de acest gen sunt prezentate în ultimul capitol al cestei lucrări.
  Portul GPB a circuitului MCP23017 a fost configurat, cu ajutorul regiștrilor interni aferenți, ca și port de intrare. Acesta preia, prin intermediul optocuploarelor OK1, OK2, OK3, OK4, OK5, OK6, OK7 și OK8, semnalele digitale aplicate intrărilor automatului programabil. Se poate observa în schema electronică de principiu din figura 3.9, că semnalele digitale de intrare sunt negativate de catre circuitul de la ieșirea optocuploarelor, format din tranzistorii interni și rezistorii aflați in colectorii acestora. Acest lucru este ”corectat” în programul din memoria microcontrolerului (firmware-ului), făcându-se o negativare software la citirea acestor porturi.




Fig.3.9 Circuitul interfeței semnalelor digitale de intrare/ieșire


  Circuitul intefeței de comunicare ethernet este realizat cu circuitul integrat ENC28J60, sub forma unui modul atașat la placa de circuit imprimat a automatului programabil.Modulul MOD-ENC28J60 este construit de firma OLIMEX (www.olimex.com) și are următoarele caracteristici, conform foii de catalog oferite de această firmă:
  1. MOD-ENC28J60 este un mod ușor de a adăuga o interfață de comunicare ethernet la viteza de 10MB/s;
  2. Modulul este echipat cu două tipuri de conectori pentru o compatibilitate sporită cu majoritatea placilor de dezvoltare, cu microcontroler;
  3. Conectorul ethernet (LAN) are transformatorul încorporat;
  4. Conectorul ethernet este echipat cu două leduri pentru a indica starea comunicației;
  5. Folosește interfața de comunicare SPI pentru comunicarea cu microcontrolerul;
  1. placa de circuit imprimat este de tipul FR-4, cu grosimea de 1.5 mm ;
  2. Dimensiunile placii de circuit imprimat sunt 40x24 mm ;
  Figura 3.10 prezintă acest modul și sunt indicate elementele principale montate pe placa de circuit imprimat.


Fig.3.10 Modulul de comunicare ethernet

  Comform specificațiilor, modulul trebuie alimentat cu o tensiune electrică de 3,3V. Aceată tensiune a fost obținută prin stabilizarea tensiunii de +5V, cu ajutorul circuitului integrat LM1117-3.3. Schema electronică a circuitului de stabilizare a tensiuniide 3,3V este reprezentată în figura 3.12. Condensatoarele C9 și C18 filtreaza tensiunea de intrare în circuit, în timp ce, condensatoarele C16 și C17, tensiunea de ieșire, +3,3V. Circuitul integrat LM1117-3.3[16] este fabricat de firma Texas Instruments, oferă la ieșire o tensiune fixă stabilizată de 3,3V, la un curent maxim de 800mA, având în vedere diferența de tensiune dintre intrare și ieșire, care va fi disipată pe circuitul integrat. Curentul maxim consumat de circuitul integrat ENC28J60, conform foii de catalog, este de 160mA, la care s-a mai adăugat , cu aproximație, o valoare de 100mA, apreciată pentru consumul celorlalte componente din structura modului. Prin urmare, curentul susținut de stabilizatorul tensiunii de 3,3V , 800mA, este suficient pentru alimentarea acestui modul, fără riscul căderilor semnificative de tensiune.
  În ceea ce privește conectarea semnalelor digitale, acestea sunt de nivele diferite, 3,3V, în cazul interfeței de comunicare și 5V în cazul microcontrolerului. Pentru a nu distruge, circuitul ENC28J60[17], în timpul operării, aplicându-se nivele mai mari de 3,3V, s-a folosit un circuit de translatare a nivelelor logice, conectat pe busul de date SPI, între cele două elemente, conform cu recomandările oferite de producătorul circuitului integrat, în foaia de catalog. Schema de principiu, ce conține de asemenea conectorii de legătură a modului de comunicare ethernet și translatoarul de nivel logic, construit cu ajutorul circuitului integrat 74125N[18], este reprezentată în figura 3.13 de mai jos.



Fig.3.12 Circuitul de stabilizare a tensiunii de 3,3V





Fig.3.13 Interfața de comunicare ethernet a automatului programabil pentru sisteme domotice





Fig.3.14 Modul extern echipat cu relee


3.2.Proiectarea plăcii de circuit imprimat


  Placa de circuit imprimat a fost proiectată, pentru a fi plantată cu componente de tipul THT (eng. Through Hole Technology - componente elecronice ce necesită găuri de fixare) și caracteristici care fac posibilă manufacturarea în regim de amator. Atât schema electronică a prototipului automatului programabil pentru sisteme domotice propus, cât și placa de circuit imprimat, au fost proiectate utilizând mediul de proiectare EAGLE CAD, un software specializat pentru proiectarea în domeniul electronicii.
  EAGLE, așa cum este prezentat pe site-ul producătorului http://www.cadsoftusa.com/eagle-pcb-design-software/about-eagle/, este un instrument software puternic pentru proiectarea placilor de circuit imprimat, conceput să îndeplinească cerințele mediului profesional de proiectare, dar și mediului edicațional.
  EAGLE a fost conceput de firma CadSoft Computer GmbH în anul 1988 ca și o aplicație pentru sistemul de operare Microsoft DOS. Astăzi, Software-ul EAGLE CAD este oferit în versiuni compatibile cu cele mai importante sisteme de operare, Windows, Linux și MacOS.
  La aranjarea componentelor pe placa de circuit imprimat, am urmărit obținerea unei imagini estetice a plăcii, dar și aspectul ergonomic al produsului final.
  În fugura de mai jos este reprezentată o captură de ecran, care surprinde imaginea plăcii de circuit imprimat în mediul de proiectare EAGLE.



Fig.3.15 Captura de ecran reprezentând placa de circuit imprimat în mediul de proiectare EAGLE CAD
  Din punct de vedere electric, pentru traseul de masă, am folosit un plan de masă (eng. Ground plane), urmărind reducerea cât mai mare a zgomotului parazit indus în traseele circuitului.
  De asemenea, se poate observa, detailiat în figura 3.16 de mai jos, lipsa acestui plan de masă pentru semnalele de ieșire și intrare, urmărindu-se izolarea cât mai bună a semnalelor de intrare/ieșire față de restul circuitului logic.




Fig.3.16 Placa de circuit imprimat a automatului programabil pentru sisteme domotice

  În imaginea reprezentată în figura 3.16, se poate observa aranjamentul componentelor pe placa de circuit imprimat, traseele de cupru ale circuitului aflate pe partea cu lipiturile (culoarea albastră), precum și planul de masă întins pe aproape întreaga suprafață a placii, exceptând zona de izolație față de interfața semnalelor de intrare/ieșire, precum și traseele de cupru aflate pe partea unde sunt montate componentele electronice (culoarea roșie). Aceste trasee nu au fost realizate practic, prin corodarea chimică a suprafeței aflate pe partea cu componentele electronice, ci am montat ștrapuri de legătură făcute din segmente de sârma de cupru, deoarece fabricarea unei placi de circuit imprimat cu două suprafețe, în regim de amator, este mult mai dificilă și necesită un preț mai ridicat în achiziționarea materialelor de contrucție.
  O observație importantă o reprezintă traseul care alimenteaza circuitele cu tensiunea de +5V.
Acesta este singurul care are o grosime mult mai mare decât celelalte trasee, pentru a asigura suportul de curent necesar circuitului.
  Fotografiile de mai jos reprezintă placa de circuit imprimat, după realizarea acesteia prin corodare chimică și plantarea componentelor. Fig.3.17 și Fig.3.18 prezintă partea cu componentele electronice și, respectiv, partea cu lipiturile.



Fig.3.17 Placa de circuit imprimat, partea cu componentele




Fig.3.18 Placa de circuit imprimat, partea cu lipiturile


Capitolul 4


Dezvoltarea Firmware


4.1 Descrierea și reprezentarea grafică al fluxului de execuție a programului din memoria microcontrolerului (firmware-ului)


  Așa cum am menționat și în capitolele anterioare, automatul programabil pentru sisteme domotice, poate fi programat de către utilizator, pentru a executa diferite sarcini, într-un sistem automatizat. Spre exemplu automatul poate fi programat să activeze pompele de irigație a spațiului verde din fața casei, numai la anumite ore și numai daca umiditatea și temperatura măsurate cu ajutorul senzorilor externi sau interni, sunt sub anumite valori predefinite. Pentru aceasta, automatului i se transmite un program, o serie de instrucțiuni și date , pe care acesta le meorează, le interpretează, și acționează elementele de control. Așa deci, este nevoie să se facă o distincție foarte clară între secvența de instrucțiuni care formează programul aflat în memoria program a microcontrolerului, firmware-ul și programul recepționat de acesta de la consola de programare.
  Pentru a urmării cu ușurință fluxul de execuție a programului microcontrolerului (firmware-ului) este necesară prezentarea modului de operare a automatului programabil realizat și prezentat în această lucrare. Așa cum am menționat în capitolul anterior, automatul este echipat cu o interfață cu utilizatorul locală, formată din, ecranul LCD alfanumeric și butoane de comandă.
  Rolul acestor butoane sunt indicate în figua 4.1 și pot fi descrise astfel:
  1. Configurare – Selectează și afișează meniul de ajustare a ceasului și a adresei IP a interfeței de comunicare Ethernet. De asemenea, acest buton, pe perioada activă a meniului de ajustare, are rolul de a selecta parametrul dorit pentru ajustare (ora, minutul, ziua, luna, anul, adresa IP);
  2. Valoare + – Buton de incrementare a valorii ajustate în meniul de ajustare. De asemenea, pe perioada activă a meniului principal, acest buton are și rolul de a activa un al doilea meiu principal, care afișează date achiziționate de la intrările analogice externe și a senzorului de lumină;
  3. Valoare - – Buton de decrementare a valorii ajustate în meniul de ajustare.
  4. Esc – Buton cu un rol asemănător tastei ”Escape” întâlnită pe tastaturile PC-urilor, asigură întoarcerea dintr-un meniu secundar în cel principal;
  5. Reset – Buton de RESET a microcontrolerului.



Fig.4.1 Butoanele interfeței cu utilizatorul și rolul acestora

  La punerea în funcțiune a automatului programabil, după executarea funcției de inițializare a perifericelor, este afișat pe ecranul LCD meniul principal. Automatul afișează ceasul, calendarul, temperatura și umiditatea relativă, măsurate cu ajutorul senzorilor. De asemenea, automatul execută programul recepționat de la interfața software de programare, comutând starea ieșirilor digitale, în funcție de instrucțiunile recepționate de la consola de programare.



Fig.4.2 Meniu principal afișat pe ecranul LCD al automatului programabil

  Acționând butonul ”Configurare”, se apelează o funcție care face posibilă ajustarea ceasului , calendarului, precum și a adresei IP folosită de interfața de comunicare ethernet. Prin acționarea repetată a acestui buton, pe perioada activă a acestui meniu, se face posibilă selectarea datelor ce doresc a fi ajustate. Cursorul afișat sub date (in figura 4.3, sub cifra zecilor orei afișată), indică valoarea curentă ce poate fi ajustată. Incrementarea și decrementarea datelor se face prin acționarea butoanleor ”Valoare +” și respectiv, ”Valoare -”.




Fig.4.3 Meniu pentru ajustarea ceasului, calendarului și adresei IP

  Pe perioada activă a meniului principal (Fig.4.2), acționarea butonului ”Valoare +” apelează un al treilea meniu, în care vor fi afișate valorile obținute de la eventualii senzori externi conectați la intrările analogice A1, A2, A3 și A4, precum și valoarea obținută de la senzorul de lumină.
Valorile măsurate la intrările analogice reprezintă valoarea tensiunii electrice aplicată acestor intrări, cuprinse între 0 și +5V, așa cum se poate observa în figura 4.4 de mai jos.
  Valoarea obținută de la senzorul de măsurare a intensității luminii, este afișată sub forma unui număr cuprins între 0 și 1024, reprezentând, în fapt, valoarea minimă și respectiv, maximă, la ieșirea convertotului analog-numeric. Aceste valori afișate pe ecranul LCD al automatului programabil, vor ajuta utilizatorul în conceperea programului automatului, cu ajutorul interfaței software de programare.
  Ca exemplu, se poate determina o valoare de prag la care se comută una din ieșirile digitale ale automatului programabil, citind pe ecranul LCD valoarea obținută de la senzorul de lumină, expunându-l la intensități diferite ale luminii. Una din valorile citite poate fi pragul de comutare a unei ieșiri digitale ale automatului.




Fig.4.4 Meniul de afișare a valorilor obținute de la intrările analogice externe și de la senzorul de măsurare a intensității luminii


  Fluxul de execuție a programului din memoria automatului programabil (firmware), începe cu o funcție de inițializare a circuitelor periferice, urmată de funcția principală (main), a carei instrucțiuni sunt executate în buclă închisă, întreruptă doar de comanda reset aplicată microcontrolerului sau de lipsa tensiunii de alimentare.
  Funcția de inițializare a perifericelor, configurează modulele de comunicare SPI și I2C implementate în structura microcontrolerului, pentru comunicația cu interfața ethernet, respectiv, comunicația cu circuitul de ceas (PCF8563) și interfața intrare/ieșire (MCP23017).
  Pentru a putea fi utilizată interfața SPI a microcontrolerului ATMEGA32, aceasta trebuie activată prin înscrierea în 1 logic a bitului 6 (SPE), al registrului SPCR. Comunicația este de tipul stăpân-sclav (eng. Master-Slave), în cazul acestui proiect, ATMEGA32 este master și perifericele sunt slave. Pentru configurarea microcontrolerului ca și master pe acest bus de comunicare, trebuie înscris în 1 logic bitul 4 (MSTR) al registrului SPCR. De asemenea, interfața SPI folosește semnalul de tact a microcontrolerului prelucrat de un circuit divizor, numit prescaler, pentru a obține un semnal de tact utilizabil pentru transmisia de date pe aceast bus. Semnalul de tact pentru SPI a fost stabilit cu ajutorul prescalerului la jumătate din frecvența de tact al microcontrolerului.
  Comunicația serială de tip I2C a fost activată prin înscrierea bitului 2 (TWEN) al registrului de control al acestei interfețe (TWCR). Această interfață de comunicare este de tip serial, datele fiind transmise sincron cu un semnal de tact. Acest semnal de tact este obținut prin divizarea semanlului de tact principal al microcontrolerului. Prelucrarea acestuia se face în două blocuri distinte, un divizor de tip prescaler și un generator de baudrate (bit rate).Prin configurarea acestor două module interne de prelucrare a ratei de baud, am stabilit o rată de transmisie de 100kHz pentru aceast bus de comunicație.
  De asemenea, în interiorul funcției de inițializare am configurat și convertorul ananlog-numeric implementat în interiorul structurii microcontrolerului, care a fost activat prin înscrierea bitului 7 (ADEN) al registrului ADCSRA. Pentru a utiliza convertorul cu tensiunea de referință aplicată la pinul AREF (pin32) al microcontrolerului, am configurat registrul aferent acestui bloc, ADMUX.
Pe durata fluxului de execuție a funcției principale (main) reînprospătarea afișajului LCD alfanumeric și achiziția analog-numerică, se fac la intervale de timp stabilite prin intermediul unui bloc temporizator (eng. Timer), implementat electronic în structura internă a microcontrolerului. Atmega32 este echipat cu trei astfel de circuite temporizatoare, denumite în foaia de catalog oferită de producător, Timer/Counter 0, Timer/Counter 1 și Timer/Counter 2. Timer-ul 0 și 2 au rezoluția de 8 Octeți , iar Timer-ul 1 are rezoluția de 16 Octeți.
  Temporizatorul Timer/Counter 0 folosit în acest proiect, este controlat de un semnal de tact, preluat de la semnalul de tact al microcontrolerului și prelucrat de un block divizor, prescaler. Registrul TCCR0 este registrul de control al acestui temporizator care configurează și valoarea prescaler-ului, cu ajutorul căruia am stabilit divizarea semnalului de tact cu valoarea de 1024, punând biții CS00 și CS02 în 1 logic. Registrul OCR0 stabilește o valoare de comparare cu valoarea incrementată de Timer 0, înscrisă la fiecare tranziție a semnalului de tact al temporizatorului în registrul TCNT0. De asemenea, prin înscrierea bitului OCIE0 al registrului de control al întreruperilor TIMSK, în 1 logic, s-a activat un fanion, OCF0 (eng. Output Comapre Flag), care indică egalitatea dintre cele două valori comparate(eng. Output Compare Match Interrupt). Astfel, am obținut un interval de timp, indicat de acest fanion, cu valoarea de aproximativ 10ms. Pentru calculul acetui inerval de timp am folosit formula recomandată de producător:




  Pentru perioada de timp dorită de 10ms, valoarea înscrisă în registrul de comparare este 155,
înlocuind valorile descrise mai sus în formulă, obținem 16000000Hz/(1024)x(155+1) = 100,160Hz, prin urmare 1/100,160 = 0,009984, deci 9,984ms. Funcția apelată la intervalul acesta de timp, o funcție care trateaza această întrerupere, resetează numărătorul timerului și incrementează o variabilă de tip întreg, denumită ”refresh”.
  Variabilele de tip întregi, ”menu”, ”refresh” și ”flags”, joacă un rol important în desfășurarea execuției funcției principale (main). Valoarea variabilei de tip întreg ”menu”, determină devierea fluxului de execuție spre secvența de instrucțiuni pentru realizarea meniului de ajustare a ceasului. Valoarea variabilei ”flags”, determină executarea secvenței de instrucțiuni pentru meniul de afișare a valorilor obținute de la senzorul de lumină și a intrărilor analogice ale automatului programabil. Valoarea variabilei ”refresh” este incrementată în interiorul funcției ce tratează întreruperea generată de blocul temporizator, iar, astfel prin compararea valorii acesteia cu o valoarea stabilită în program am obținut intervale de timp, la care se pot executa diferite instrucțiuni, așa cum se poate observa în figura 4.5 de mai jos, care prezintă fluxul de execuție a programului principal (main).
  În reprezentarea fluxului de execuție a programului principal (main) sunt distinct afișate două blocuri importante, ”Ajustare ceas, calendar sau IP.” (marcat cu culoarea verde) și ”Funcție de interpretare și execuție a programului recepționat de la interfața software” (marcat cu culoarea portocaliu).
  Secvența de instrucțiuni ”Funcție de interpretare și execuție a programului recepționat de la interfața software” este partea cea mai importantă din programul microcontrolerului (firmware-ului), acesta fiind algoritmul de interpretare a instrucțiunilor primite de la consola de programare a automatului programabil. Acesta este în detaliu descirs în subcapitolul următor, facându-se aici precizarea că, programul este recepționat de către automatul programabil, de la interfața software de programare sub forma unui șir de caractere, care trebuie să conțină la începutul acestuia secvența de caractere ”cmd” sau ”conf”, în funcție de care se execută o comandă sau se execută programul configurat cu ajutorul interfeței software de programare. Dacă prima secvență de caractere din șir este ”cmd”, atunci se va evalua cifra scrisă în șir ce urmează dupa secvența ”cmd” și se va comuta starea ieșirii digitale corespunzătoare cifrei respective, de exemplu daca secvența de caractere recepționată este ”cmd0”, se va comuta starea ieșirii digitale 0, astfel făcându-se posibilă comutarea ieșirilor digitale de la distanță. Dacă, prima secvență de caractere este ”conf”, atunci se va urmării șirul de caractere urmat, evaluându-se astfel execuția programul recepționat de la interfața software de programare. Întregul program recepționat de automat de la consola de programare (computer personal) este memorat în memoria de tip EEPROM a microcontrolerului, astfel, facându-se posibilă reluarea procesului automatizat la punerea sub tensiune a automatului programabil, după o perioadă în care tensiunea de alimentare a lipsit (exemplu poate fi o pană de curent). Din această cauză, funcția de inițializare a perifericelor, descrisă mai sus, încarcă, de asemenea, programul recepționat de la interfața software de programare și memorat în EEPROM, în memoria de tip RAM a microcontrolerului, înainte de pornirea secvenței de interpretare și execuție a acestui program.
  Secvența de instrucțiuni pentru ajustarea ceasului, calendarului și adresei IP, urmărește, în desfășurarea fluxului de execuție, starea butoanelor ”Valoare +” și ”Valoare -” pentru incrementarea și, respectiv, decrementarea valorilor selectate. Selectarea acestor valori, precum și deplasarea cursorului pe ecranul LCD, pentru a indica utilizatorului data în curs de ajustare, se face prin urmărirea stării butonului ”configurare”. De asemenea, în interiorul acestei secvențe, este urmărită și starea variabilei ”menu”, a cărei valoare va determina întroarcerea la meniul principal. Pentru selectarea succesivă a datelor ce vor fi ajustate s-a declarat o variabilă de tip întreg, ”submenu”. Rolul acestei variabile și cursul funcțional al acestui bloc de instrucțiuni poate fi urmărit în figura 4.6, care prezintă fluxul de execuție a acestei secvențe de instrucțiuni, ”Ajustare ceas, calendar sau IP.”.




Fig.4.5 Fluxul de execuție a funcției principale ”main”



Fig.4.6 Fluxul de execuție a funcției pentru ajustarea ceasului, calendarului și adresei IP


4.2.Descrierea algoritmului de interpretare a programului recepționat de la interfața software de programare



  În subcapitolul anterior, am menționat că programul sau comenzile transmise de la interfața software de programare, sunt sub forma unui șir de caractere. Înainte de a descrie șirul de caractere care reprezintă programul realizat și transmis cu ajutorul interfeței software de programare, de către utilizator, voi descrie, în rândurile următoare, șirul de caractere care reprezintă comanda comutării uneia din ieșirile digitale. În subcapitolul anterior spuneam că șirul recepționat de la consola de programare sau comandă, trebuie sa conțină secvența de caractere ”cmd” pentru ca microcontrolerul să execute comutarea stării logice a uneia dintre cele opt ieșiri digitale.
  Așa cum se poate observa și în figura 4.5, din subcapitolul anterior, la recepționarea unui șir de caractere de către interfața ethernet de comunicare, se caută, printre primele caractere, secvența ”cmd”, iar dacă, aceasta este găsită, se va citi caracterul ce urmează imediat dupa secvența ”cmd”, care trebuie să reprezinte o cifră cuprinsă în intervalul 0 – 7 și se comută ieșirea digitală indicată de această cifră. Acestă secvență de instrucțiuni este reprezentată în figura 4.5 din subcapitolul anterior, în prezentarea grafică a fluxului de execuție a funcției principale (main).
  Spre deosebire de cazul recepționării și interpretării unei comenzi de comutare a unei ieșiri digitale, la recepționarea unui program de la interfața software de programare, prima secvență de caractere din șirul recepționat trebuie sa fie ”conf”, iar daca, aceasta este găsită, se va memora în memoria EEPROM întreg șirul ce urmează după secvența ”conf”.
  În ceea ce privește interpretarea programului primit de către automatul programabil, am stabilit câteva reguli în formarea șirului de carcatere, ceea ce face ca algoritmul de citire și interpretare a datelor din acest șir să fie rapid și ușor de urmărit. Automatul poate executa operații logice de tipul ”și” și ”sau” între diferite intrări ale automatului, valori ale temperaturii, umidității, intensității luminii, a ceasului. De asemena, poate face operația de comparare a volorilor obținute de la senzori, cu valori înscrise în program de către utilizator. Daca operația logică ”și” se poate executa între toate intrările automatului, deci poate fi folosită de mai multe ori pentru a obține un șir de condiții înseriate, operația logică ”sau” nu poate fi folosită mai mult de patru ori pentru o ieșire digitală. Deci, prin urmare, nu pot fi realizate mai mult de patru conexiuni de tip paralel a condițiilor de comutare a uneia din ieșirile digitale ale automatului. În figura de mai jos, este reprezentat printr-o diagramă scară, un exemplu de conexiune a intrărilor digitale, folosind operațiile logice ”și” și ”sau”, unde s-a folosit numărul maxim de operații de tip ”sau”.



Fig.4.7 Reprezentarea în diagrama scară a unui program pentru automatul porgramabil, în care s-a folosit numărul maxim de operații ”sau”.


  Așa cum se poate observa în figura 4.7 starea ieșirii digitale 0 va fi comutată, conform acestui program, doar când intrarea digitală 0 și intrarea digitală 1 sunt în logic 1, sau numai daca intrarea digitală 2 și intrarea digitală 3 sunt în logic 1 ș.a.m.d..
  Pentru formarea șirului de caractere transmis de către interfața de programare software, am definit un caracter pentru fiecare tip de intrare, senzor și ceas, după cum urmează :
  1. Intrările digitale vor fi reprezentate în șirul de caractere de ”d”;
  2. Intrarile analogice vor fi reprezentate în șirul de caractere de ”a”;
  3. Senzorul de temperatură va fi reprezentat în șirul de caractere de ”t”;
  4. Senzorul de umiditate va fi reprezentat în șirul de caractere de ”h”;
  5. Senzorul de lumină va fi reprezentat în șirul de caractere de ”l”;
  6. Ceasul va fi reprezentat în șirul de caractere de ”c”;
  7. Pentru determinarea operației logice ”sau”, am folosit caracterul ”v”;
  8. Caracterul ”e” delimitează condițiile pentru ieșiri digitale diferite.
  Fiecare dintre aceste caractere descrise mai sus sunt urmate în acest șir, de caractere cifre. Acestea reprezintă numărul intrării sau ieșirii digitale respective ori numere care trebuie comparate cu valorile citite de la intrările analogice sau de la senzori. Astfel, secvențele de caractere ”r0”, ”r1”, ”r2”, ”r3”, ”r4”, ”r5”, ”r6”, ”r7”, reprezintă ieșirea digitală 0,1,2,3,4,5,6 sau 7 ce urmează a fi comutată, în funcție de condițiile impuse în program. Intrările digitale 0,1,2,3,4,5,6 și 7 sunt reprezentate în șir, cu ajutorul secvențelor de carcatere ”d0”, ”d1”, ”d2”, ”d3”, ”d4”, ”d5”, ”d6” și ”d7”.
  În ceea ce privesc intrările analogice, se va considera condiția îndeplinită pentru comutarea unei ieșiri digitale, conform programului, numai dacă valoarea citită de la intrarea analogică se află cuprinsă într-un interval impus de utilizator în cadrul programului. Astfel, dacă se stabilește un interval de valori cuprins între 1V și 2V pentru a se comuta ieșirea digitală 0, la citirea valorii obținute de la intrarea analogică 1, condiția va fi îndeplinită numai dacă valoarea citită va fi mai mare decât 1V sau mai mică decât 2V. Acest lucru este reprezentat în șirul de caractere, respectându-se convențiile descrise mai sus, prin secvența ”confr0a11-2ve”, unde, ”conf” reprezintă secvența de caractere care indică recepționarea unui program și nu a unei comenzi, ”r0” reprezintă ieșirea digitală 0, deci condițiile ce urmează vor comuta această ieșire dacă acestea sunt îndeplinite, ”a1” reprezintă intrarea analogică 1 care trebuie citită, cifra ”1”, imediat următoare, reprezintă valoarea minimă din interval, așa cum am descris mai sus, ”-” este un simbol reprezentând un interval de valori, cifra ”2” reprezintă valoarea maximă din acest interval. Caracterul ”v” reprezintă operația logică ”sau” , executată între condițiile descrise pâna la apariția acestuia și cele care urmează, în cazul de fața operația ”sau” nu se va executa, pentru că ”v” nu este urmat de alte condiții. Caracterul ”e” indică sfârșitul șirului de condiții pentru acestă ieșire digitală.
  Regula folosită pentru intrarile analogice, este aplicată și senzorilor de temperatură, umiditate și lumină. Astfel, valorie obținute de la acești senzori, trebuie să fie cuprinse în intervale de valori impuse în cadrul programului. Urmărindu-se explicația de mai sus, referitoare la reprezentarea în șirul de caractere a condițiilor impuse pentru intrările analogice, pentru senzorul de temperatură, secvența de caractere este reprezentată ca ”t20-23”, deci, pentru acest exemplu, valoarea citită de la sezor va trebui să fie cuprinsă între 20° C, și respectiv 23° C, pentru a se considera condiția îndeplinită, pentru senzorul de umiditate, șirul de caractere va fi ”h30-40”, deci, pentru acest exemplu, valoarea citită de la senzorul de umiditate va trebui sa fie cuprinsă între 30% și 40% pentru a se considera condiția îndeplinită, iar pentru senzorul de lumină, secvența de caractere este ”l300-500”, deci, valoarea obținută de la senzorul de măsurare a intensității luminii, va trebui să fie cuprinsă în intervalul de valori 300 și , respectiv, 500.
  Utilizatorul poate programa un interval de timp, în care una sau mai multe ieșiri digitale sunt comutate. Spre exemplu, ieșirea digitală 0 comută la ora 12:00 și revine la starea inițială la ora 12:05. Acest exemplu este reprezentat în șirul de caractere, prin secvența ”c12-12-00-05”. După cum se observă, repectînd convențiile descrise pâna acum, ”c” reprezintă ceasul automatului programabil și este urmat de ora la care se va comuta ieșirea, ora la care ieșirea revine la starea inițială, minutul la care se comută ieșirea și, respectiv , minutul la care se revine la starea inițială.
  Folosindu-se convențiile descrise mai sus, programul reprezentat în figura 4.7, va fi transmis automatului programabil sub forma unui șir, astfel: ”confr0d0d1v0d2d3v1d4d5v2d6d7v3e”. Șirul va fi ”citit” de către firmware-ul înscris în memoria program a microcontrolerului, caracter cu caracter. După gasirea secvenței de caractere ”conf ”, aceasta este eliminată, șirul devenind : ”r0d0d1v0d2d3v1d4d5v2d6d7v3e”. Acest șir de caractere, obținut dupa eliminarea secvenței ”conf” este memorat în memoria de tip EEPROM a microcontrolerului.
  Conform figurii 4.7, stările logice ale intrarilor digitale 0 ,”d0” și respectiv 1 ”d1” sunt condiții înseriate, deci între acestea se execută operația logică ”și”. La fel pentru intrarile digitale 2 și 3, 4 și 5, 6 și 7. În secvența de caractere care reprezintă programul recepționat de la interfața software de programare, operația logică ”și” este executată între toate condițiile adiacente descrise în șir, pîna la apariția primului caracter ”v”, caracter care indică executarea operației logice ”sau”, între condițiile aflate în conexiune paralelă. Cifra ce urmează caracterul ”v” este numărul operațiilor ”sau” executate în program și nu trebuie să fie mai mare de 4. Prin urmare, șirul descris în exemplul de mai sus, ”r0d0d1v0d2d3v1d4d5v2d6d7v3e”, descrie un program care va comuta ieșirea digitală 0 (”r0”), numai dacă intrarea digitală 0 (”d0”) și intrarea digitală 1 (”d1”) sunt în 1 logic, sau daca intrarea digitală 2 (”d2”) și intrarea digitală 3 (”d3”) sunt în 1 logic, sau daca intrarea digitală 4 (”d4”) și intrarea digitală 5 (”d5”) sunt în 1 logic, sau daca intrarea digitală 6 (”d6”) și intrarea digitală 7 (”d7”) sunt în 1 logic.
  Din punctul de vedere al firmware-ului, algoritmul citește șirul de caractere în mod secvenșial și fiecare apariție a unui caracter care reprezintă o condiție, ”d”, ”a”, ”t”, ”l”, ”h”, ”c”, pâna la prima întâlnire a caracterului ”v”, este numărată. De asemenea, după testare, fiecare condiție adevărată este numărată. Daca suma condițiilor întâlnite la citirea secvențială a șirului și suma condițiilor adevărate sunt egale, atunci, într-o variabilă de tip tablou cu o singură dimensiune, se înscrie valoarea 1 în primul element al tabloului. Acest ciclu se repetă pentru următorul șir de caractere aflat după ultimul ”v” întâlnit în secvență, de la stânga la dreapta și continuă pâna la următoarea întâlnire a caracterului ”v”, daca și următorul șir de condiții între care se va executa operația logică ”și” , îndeplinește condiția de comutare a ieșirii dorite, se va înscrie valoare 1 în al doilea element al tabloului. Acest proces se reia, pâna la întâlnirea caracterului ”e”. Apoi, se execută operația logică ”sau”, între valorile tabloului. Prin urmare, dacă oricare din elementele tabloului este egal cu 1, atunci ieșirea digitală specificată la începutul șirului este comutată.
  Luându-se ca exemplu, programul descris mai sus și reprezentat de schema din figura 4.7, se poate urmării secvența de execuție a algoritmului, presupunând intrările digitale 2 și 3, ca fiind în 1 logic. Șirul recepționat de la interfața de programare, devine după eliminarea secvenței de caractere ”conf”, ”r0d0d1v0d2d3v1d4d5v2d6d7v3e”. La citirea primelor caractere ”r0”, se reține faptul că toate condițiile adevărate, reprezentate în șirul ce urmează, vor comuta ieșirea digitală 0. Următorul caracter, ”d”, este citit și interpretat ca fiind o intrare digitală, deci o condiție ce trebuie îndeplinită, prin urmare se incrementează variabila în care se reține numărul condițiilor între care există relația logică ”și” întâlnite la citirea șirului de la stînga la dreapta. Citirea acestei intrări, ”d0” va returna valoarea logică 0 , deci nu este îndeplinită condiția ca această intrare sa fie în 1 logic pentru a comuta ieșirea digitală 0, prin urmare , nu se va incrementa variabila folosită pentru a reține numărul condițiilor adevărate. Următoarea secvență din șirul de caractere este ”d1” și reprezintă condiția ca intrarea digitală 1 să fie în 1 logic pentru a se comuta ieșirea digitală 0. Citirea acestei intrări digitale va returna, de asemenea, 0 logic, conform inițierii acestui exemplu, prin urmare variabila în care se reține numărul condițiilor adevărate nu este incrementată. Următoarea secvența de caractere, ”v0”, determină compararea valorilor obținute prin incrementarea variabilelor declarate pentru reținerea numărului de condiții impuse de program și numărul condițiilor adevărate. S-au numărat două condiții întâlnite în program și niciuna dintre aceste condiții nu sunt adevărate, prin urmare, se va scrie în elementul 1 valoarea 0 (cifra care urmează după caracterul ”v” indică adresa din interiorul tabloului cu o singură dimensiune la care se va înscrie valoarea dorită).
  Pentru intrările digitale 2 și 3, algoritmul descris mai sus, se repetă, cu deosebirea că, numărul condițiilor impuse de program și numărul condițiilor adevărate sunt egale, deci, în elementul 2 al tabloului cu o singură dimeniune se va înscrie valoarea 1. Ciclul se repetă pentru intrările digitale 4 și 5, apoi, 6 și 7 , înscriindu-se în valorile elementelor 3 și 4 ale tabloului valori egale cu 0.
La apariția caracterului ”e”, în procesul de citire a șirului, prin intermediu unei funcții de tipul IF...ELSE, se execută o operație logică ”sau” între valorile înscrise în elementele tabloului cu o singură dimensiune, și daca una din valorile acestor elemente este egală cu 1, atunci se comută ieșirea digitală dorită. În exemplul de mai sus , ieșirea digitală 0 va fi comutată, penru că unul din elementele tabloului are o valoare egală cu 1.
  Caracterele urmate după ”e” reprezintă condițiile care trebuiesc îndeplinite pentru a comuta o altă ieșire digitală, însă algoritmul se desfășoară în mod similar și pentru celelalte ieșiri digitale. Exemplu de program recepționat de la interfața software de programare, în care s-au folosit mai multe ieșiri digitale, precum și intrări analogice, senzorul de temperatură și ceasul sistemului, este reprezentat în șirul de caractere următor:
     ”confr0d0d1v0d2d3v1er1d4d5v0d6d7v1er2a1214-401-v1er3c07-08-30-00-v0t20-24-v1e”.

  Pentru a face mai clară reprezentarea fluxului de execuție a acestui algoritm, sunt prezentate în rândurile de mai jos, secvențele de instrucțiuni care preiau și memorează șirul de caractere de la interfața ethernet de comunicare sau, în cazul unei comenzi, prelucrează acest șir în vederea executării comenzii primite.
  Secvența de instrucțiuni care preia șirul de caractere recepționat de la interfața de programare, elimină caracterele nedorite în algoritmul de interpretare a programului și-l înscrie în memoria EEPROM a microcontrolerului, este :

strcpy(strRX,(char*)&buf[UDP_DATA_P]);// copie în ”strRX” mesajul string primit pe UDP

if(strncmp("conf",strRX,4)==0)// daca primul șir din mesaj este 'conf', atunci copiaza stringul in                                  eeprom si in functia Eventcheck() incepe decodificarea
{
strcpy(strRX,(char*)&strRX[4]);//'conf' este eliminat
eeprom_update_block(&strRX,(void*)0,200);//șirul obținut este înscris în memoria EEPROM
}

  De asemenea, instrucțiunile executate la recepționarea unei comenzi, de la unul din dispozitivele aflate în rețeaua ethernet de comunicare, se pot urmării în rândurile ce urmează.
if(strncmp("cmd",strRX,3)==0)// daca primul șir din mesaj este 'cmd', atunci...
{
strcpy(strRX,(char*)&strRX[3]);//'cmd' este eliminat
switch(strRX[0]){//caracterul rămas după eliminarea lui 'cmd'
case '0' :
RelayToggle(0);//comută ieșirea digitală 0
break;
case '1' :
RelayToggle(1);//comută ieșirea digitală 1
break;
case '2' :
RelayToggle(2);//comută ieșirea digitală 2
break;
case '3' :
RelayToggle(3);//comută ieșirea digitală 3
break;
case '4' :
RelayToggle(4);//comută ieșirea digitală 4
break;
case '5' :
RelayToggle(5);//comută ieșirea digitală 5
break;
case '6' :
RelayToggle(6);//comută ieșirea digitală 6
break;
case '7' :
RelayToggle(7);//comută ieșirea digitală 7
break;
}
for(i=0;i<200;i++)
{
strRX[i] = 0; // șterge șirul de caractere
}
i=0;
eeprom_read_block((char*)strRX,(void*)0,200);// reîncarcă programul din EEPROM pentru a fi evaluat și executat

  Funcția EventCheck() din structura firmware-ului, care reprezintă algoritmul de interpretare a programului recepționat de la interfața software de programare, verifică starea intrărilor digitale și citește fiecare caracter din șir, într-o buclă FOR, pâna la sfârșitul șirului.
  Figura 4.8 prezintă fluxul de execuție a algoritmului de interpretare a programului recepționat de la interfața software de programare. Variabilele, ”eventsRX” și ”eventsTRUE”, rețin numarul condițiilor întâlnite în program și respectiv, numărul condițiilor adevărate obținute la testarea intrărilor, în cursul desfășurării acestui algoritm. Variabila de tip tablou cu o singură dimensiune este ”validare[4]”, ”relay” este variabila în care se reține numărul ieșirii digitale care se dorește a fi comutată, iar, ”strRX” este o variabilă care conține șirul de caractere recepționat de la interfața de programare.
  Figura 4.9 reprezintă diagrama de secvență a firmware-ului, în care se poate observa folosirea timer-ului 0 a microcontrolerului pentru afișarea informațiilor dorite pe ecranul LCD. Așa cum este reprezentat în figura 4.9, desfășurarea programului este întreruptă de către timer o data la aproximativ 50ms sau 30 ms, în funcție de meniul selectat.
  Diagrama reprezentată în figura 4.9 încheie acest capitol încercându-se reprezentarea cât mai clară a desfășurării secvențelor care formează structura programului microcontrolerului.







Fig.4.8 Fluxul de execuție a algoritmului de interpretare a programului recepționat de la interfața software de programare



Fig.4.9 Diagrama de secvențe a firmware-ului











Capitolul 5


Dezvoltarea Software


5.1.Descrierea modului de operare a interfeței software de programare a automatului pentru sisteme domotice


  Interfața de programare este o aplicație ce poate rula, atât în sistemul de operare Windows, cât și în Linux, fiind construită utilizând limbajul de programare Java, în mediu de programare NetBeans. Netbeans oferă posibilitatea construirii interfeței cu utilizatorul, în mod grafic, eliminându-se astfel, necesitatea scrierii liniilor de cod pentru fiecare element vizual din structura interfeței. Programul propriu zis tratează evenimentele generate de elementele interfeței și rulează instrucțiunile necesare formării șirului de caractere ce va reprezenta programul automatului programabil, precum și transmiterea acestuia către rețea.
  Așa cum am precizat în capitolul 2, protocolul de comunicare între interfața de programare și unul sau mai multe automate programabile conectate într-o rețea de tip LAN (eng. Local Area Network) este UDP . Acest protocol nu asigură integritatea datelor transmise sau nu verifică dacă recepționarea acestora s-a făcut cu succes. Sarcina aceasta, însă, este îndeplinită cu succes de această interfață.
  Integritatea datelor și confirmarea recepționării acestora de către destinatar este asigurată de interfața de programare cu ajutorul firmware-ului din memoria microcontrolerului. După transmiterea șirului de caractere de către interfața de programare, aceasta așteaptă de la automatul programabil receptor, șirul de caractere primit. Procesul de verificare a datelor constă în compararea celor două șiruri, inegalitatea acestora generând un mesaj de eroare.
  Interfața de programare nu este un mediu de programare a automatelor industriale și nu necesită cunoștințe de programare a acestora. Utilizarea automatului programabil în sisteme domotice trebuie să fie facilă, iar interfața de programare să fie intuitivă. Din această cauză, interfața nu folosește niciunul din limbajele specifice programării automatelor industriale. Crearea unui program pentru automatul programabil cu ajutorul acestei interfețe software, constă în selectarea și editarea condițiilor ce trebuiesc îndeplinite pentru a acționa un dispozitiv conectat la una din ieșirile digitale ale automatului programabil. Modul de operare a acestei interfețe software de programare este prezentată, în detaliu, în rândurile următoare.
  Pentru a asigura utilizarea ușoară a interfeței, am stabilit folosirea următorilor termeni pentru definirea intrărilor automatului și a operațiilor logice ”și”, ”sau”:
  • Dispozitiv – reprezintă ansamblul comandat de automatul programabil prin intermediul ieșirilor digitale. Exemplu poate fi o pompă electromecanică aflată într-un sistem de irigare și care poate fi comandată de automatul programabil cu ajutorul unui releu electromagnetic;
  • Condiție – reprezintă starea intrărilor automatului. O condiție se consideră îndeplinită pentru a comuta un dispozitiv conectat la ieșire, atunci când se află în 1 logic, pentru intrările digitale sau în cazul intrărilor analogice, a senzorilor și a ceasului, atunci când valoarea citită la ieșirea acestora se află cuprinsă în intervalul de valori stabilit de utilizator;
  • Eveniment – reprezintă suma condițiilor îndeplinite între care se execută operația logică ”și”, pentru a comuta dispozitivul comandat;
  • Variantă – reprezintă operația logică ”sau” executată între două intrări ale automatului sau între maximum 4 evenimente editate în program.
  Crearea unui program pentru automat, presupune respectarea unui singur principiu: dispozitivul selectat va fi actionat numai daca toate conditiile selectate in panoul de editare a evenimentelor sunt indeplinite sau daca oricare din cele 4 variante de evenimente editate sunt indeplinite.
  Considerând pompa electromecanică, din exemplul de mai sus, ca fiind un dispozitiv conectat la una din ieșirile automatului programabil, utilizatorul poate edita un proces de comandă a sistemului de irigare, în care acesta va fi acționat numai într-un anumit interval de timp al zilei și numai dacă temepratura și umiditatea măsurată în aer vor avea valori cuprinse într-un interval prestabilit sau dacă este acționat un întrerupător conectat la una din intrările automatului. În acest exemplu, evenimentul care va acționa dispozitivul conectat la una din ieșirile automatului, este produs de momentul încadrării valorilor citite de la ceasul automatului, în intervalul de timp stabilit de utilizator și numai dacă temperatura și umiditatea măsurată se află, de asemenea, în intervalul prestabilit. Dispozitivul din acest exemplu, pompa electromecanică, poate fi pornită în orice moment cu ajutorul întrerupătorului conectat la una din intrările automatului, realizându-se astfel operația logică sau între seria de condiții descrise mai sus și starea întrerupătorului, care reprezintă o altă variantă de eveniment.
  Interfața de programare a automatului pentru sisteme domotice este prezentată, printr-o captură de ecran, în figura de mai jos.


Fig.5.1 Interfața software de programare a automatului pentru sisteme domotice

  Pentru a face operarea facilă, această interfață software de operare este constituită din patru blocuri distincte, după cum urmează:
  1. Bara de meniuri, ”File” și ”Help”, care conține comenzi de operare a fișierelor, facând posibilă salvarea programelor editate cu ajutorul acestei interfețe software și respectiv, instrucțiuni de operare;
  2. Interfața de editare a datelor de comunicare, care conține câmpuri text pentru configurarea adresei IP a automatului și butoane pentru transmiterea programului sau a comenzilor către automatul programabil;
  3. Interfața de editare a evenimentelor , cu ajutorul căreia utilizatorul poate configura logica programului;
  4. Afișarea evenimentelor sau afișarea condițiilor de comutare a dispozitivului dorit.
  Figura 5.2 prezintă meniul ”File” desfășurat și comenzile conținute. Cele cinci opțiuni ale acestui meniu îndeplinesc funcții distincte, după cum urmează:
  1. Opțiunea ”New” aduce interfața de programare la starea inițială, așa cum este ea prezentată în fugura 5.1, reinițializând toate câmpurile text, inclusiv lista de evenimente.
  2. Opțiunea ”Open” deschide o fereastră nouă, așa cum este prezentat în figura 5.4, cu ajutorul căreia, utilizatorul poate încărca un program salvat, specificând locația acestui program în mediul de operare;
  3. Opțiunea ”Save” rescrie în memoria calculatorului un program editat și salvat în trecut, sub același nume și în aceași locație;
  4. Opțiunea ”Save As...” deschide o fereastră nouă, similară cu cea prezentată în figura 5.4, însă cu ajutorul acesteia, utilizatorul poate salva pe una din mediile de stocare a calculatorului, un program editat, specificând locația de stocare dorită și numele fișierului memorat.
  Figura 5.3 prezintă opțiunile disponibile în meniul ”Help”, iar comenzile executate la acționarea acestor opțiuni sunt prezentate în figurile 5.5 și 5.6. Opținea ”Instrucțiuni editare eveniment” afișează o descriere succintă a modului de creare a programelor pentru automatul programabil, iar meniul ”About” afișează într-o nouă fereastră informații despre acest proiect.





Fig.5.2 Meniul ”File”



Fig.5.3 Meniul ”Help”






Fig.5.4 Fereastra de selectare a programului din mediul de stocare a calculatorului






Fig.5.5 Afișarea instrucțiunilor de editare a unui program pentru automatul programabil


  Configurarea datelor de comunicare se face prin editarea câmpurilor text, indicate de etichetele ”Adresa IP Controller” și ”Nume Controller”. La inițializarea aplicației, aceste câmpuri conțin textele ”Name” și ”IP”, așa cum este prezentat în figura 5.1 și nu sunt editabile. Aceste câmpuri pot fi modificate de către utilizator, doar prin acționarea mouse-ului. Trecerea cursorului deasupra câmpului care se dorește a fi configurat și acționarea butonului din stânga a mouse-ului, face posibilă editarea acestor casete.
  La acționarea butonului indicat de eticheta ”Trimte Configurația”, interfața construiește șirul de caracatere care reprezintă programul automatului și-l trimite la automatul cu adresa IP editată în câmpul indicat de eticheta ”Adresa IP Controller”.
  La acționarea butonului indicat de eticheta ”Acționare Manuală” interfața trimite către automatul programabil cu adresa IP editată, comanda de acționare a ieșirii digitale selectată din lista indicată de eticheta ”Selectați Dispozitiv”.
  Listele indicate de etichetele ”Selectați Dispozitiv” și ”Selectați Varianta”, împreună cu blocul de comenzi indicat de eticheta ”Editare Eveniment” formează inerfața de editare a programului pentru automat. Cu ajutorul listei ”Selectați Dispozitiv” utilizatorul alege una din cele opt ieșiri digitale, care se dorește a fi acționată de logica programului sau de acționarea butonului ”Acționare Manuală”.          Lista ”Selectați Varianta” oferă posibilitatea introducerii în logica programului a patru operații de tip ”sau” distincte, între două intrari ale automatului sau între mai multe evenimente. Numele ieșirilor automatului din lista menționată mai sus și a intrărilor sale, indicate de către etichete, pot fi modificate și memorate o dată cu salvarea programului.
  Blocul etichetat ”Listă Evenimente”, va afișa logica programului editat cu ajutorul interfeței descrise mai sus.
  Modul de operare a acestei interfețe este prezentat detaliat în rândurile următoare, utilizându-se un exemplu care presupune folosirea automatului programabil într-un sistem automat de irigare a grădinii. Sistemul de irigare are în componența sa un bazin pentru stocarea apei, o pompă de umplere a bazinului, un senzor digital care va indica umplerea bazinului și o pompă de irigare sau golire a bazinului. Pentru controlul acestui sistem automat se vor folosi și datele obținute de la senzorii de temperatură și umiditate încorporați în structura internă a automatului programabil pentru sistemele domotice. De asemenea, ambele pompe vor putea fi acționate în orice moment, cu ajutorul a două întrerupătoare conectate la intrările digitale ale automatului. În acest exemplu, se dorește irigarea automată a grădinii, numai în intervalul de timp cuprins între orele 7:00 și 7:30, numai dacă temperatura măsurată în mediul ambiant este cuprinsă în intervalul 20 și 25 grade Celsius și numai dacă umiditatea măsurată in mediul ambiant este cuprinsă în intervalul 30 și 40 %.
  În figura 5.7 este reprezentată logica de funcționare a sistemului automat de irigare utilizându-se diagrama scară și considerând sensorul de nivel montat în interiorul bazinului ca fiind normal-deschis. Pompele electromecanice sunt acționate de către ieșirile digitale prin intermediul a două relee electromagnetice.
  În ceea ce privește conexiunile electrice, se stabilesc următoarele:
  1. Senzorul de nivel al apei este conectat la intrarea digitală 0;
  2. Întrerupătorul de acționare a pompei de irigare este conectat la intrarea digitală 1;
  3. Întrerupătorul de acționare a pompei de umplere a bazinului este conectat la intrarea digitală 2;
  4. Pompa de irigare este acționată de ieșirea digitală 0 a automatului programabil;
  5. Pompa de umplere a bazinului este acționată de ieșirea digitală 1 a automatului.


Fig.5.7 Diagrama scară a sistemului automat de irigare

  Utilizându-se convențiile descrise la începutul acestui capitol și urmărind diagrama scară din figura 5.7, se pot distinge două variante de evenimente care vor acționa dispozitivele, pompa de irigare și pompa de umplere a bazinului, conectate la ieșirile digitale a automatului programabil. Una din variantele evenimentului care pune în funcțiune pompa de irigare este produs numai dacă toate condițiile impuse pentru ceas, temperatură și umiditate sunt îndeplinite. Cea de a doua variantă a evenimentului este produs la acționarea manuală a întrerupătorului pentru acționarea pompei de irigare. În același mod se poate descrie și logica de acționare a pompei de umplere a bazinului, prima variantă a evenimentului care aclanșează pompa este produs de senzorul de nivel, iar cea de a doua variantă de întrerupătorul de acționare manuală a pompei de umplere a bazinului.
  Înainte de a transpune programul reprezentat cu ajutorul diagramei scară din figura 5.7, se modifică numele afișate de către interfața de programare ale dispozitivelor și condițiilor din acest exemplu, respectând conexiunile electrice stabilite mai sus.
  Numele fiecărei intrări a automatului poate fi modificat așezând cursorul mouse-ului în interiorul etichetei ce se dorește a fi modificată și acționând butonul din stânga a mouse-ului. Figura 5.8 prezintă interfața software, după modificarea acestor etichete.
  Pentru redenumirea ieșirilor digitale din lista dispozitivelor, este necesară selectarea din listă a unei ieșiri, tastarea literei ”n”, tastarea unui nou nume în câmpul text aflat în fereastra nou deschisă și acționarea butonului ”ok”.


Fig.5.8 Redenumirea intrărilor și ieșirilor automatului programabil

  Noile denumiri editate mai sus sunt imediat afișate în ”Lista Evenimente”. Numele controlerului și adresa IP sunt și ele editate(vezi figura 5.9):
  • Nume Controller = Sistem Irigare;
  • Adresa IP Controller = 192.168.0.10;
  Editarea primei variante de eveniment pentru punerea în funcțiune a pompei de irigare constă în selectarea variantei 1 din lista ”Selectați Varianta” și bifarea căsuțelor din dreptul etichetelor ”Ceas”, ”Temperatura” și ”Umiditate”. Pentru stabilirea intervalului de valori în care condiția se consideră îndeplinită se va acționa butonul de tip radio din dreptul uneia dintre condiții și se acționează cursoarele potențiometrelor aflate în dreapta sus a blocului ”Editare Eveniment”. Figura 5.9 prezintă selectarea condițiilor pentru această variantă, stabilirea cu ajutorul potențiometrelor valorile minime și maxime ale intervalelor stabilite pentru temperatură și umiditate.
  Stabilirea intervalului de timp presupune introducerea datelor menționate mai sus în câmpurile text din dreptul etichetelor ”Ore”, ”Minute” , ”ON” pentru valorile minime și ”OFF” pentru valorile maxime. Pentru memorarea acestui eveniment și afișarea lui în lista de evenimente se acționează butonul ”OK” din componența blocului ”Editare eveniment”(vezi figura 5.9).






Fig.5.9 Editarea variantei 1 a evenimentului care va acționa pompa de irigare


  Urmârind blocul ”Lista Evenimente” se poate observa modul în care condițiile impuse pentru temperatură, umiditate și ceas sunt înseriate, între ele executându-se operația logică ”și”, iar rândurile pentru celelalte trei variante sunt afișate în paralel, executându-se operația logică ”sau” între acestea.   Acest mod de afișare a logicii programului se dorește a fi un mod similar cu diagrama scară.

Pompa irigare:
Varianta 1:Temperatura: ON = 20 OFF = 25C-> Umiditate: ON = 30 OFF = 40->Ceas: ON = 07:00 OFF = 07:30->|
Varianta 2:-
Varianta 3:-
Varianta 4:-”

  Pentru configurarea variantei a doua a evenimentului, sau a condițiile paralele, se alege ”Varianta 2” din lista ”Selectați Varianta” și se selectează intrarea automatului la care s-a conectat întrerupătorul pentru acționarea pompei de irigare, bifând căsuța adiacentă etichetei denumite ”Într irigare”. La acționarea butonului ”OK” această variantă este introdusă în logica programului și afișată în dreptul variantei 2, în blocul ”Lista Evenimente”(vezi figura 5.10).

Varianta 2:Într Irigare->|”




Fig.5.10 Editarea variantei 2 a evenimentului care va acționa pompa de irigare

  Diagrama scară din figura 5.7 și modul în care datele sunt afișate de către interfața software în blocul ”Lista Evenimente” descriu, până acum, faptul că pompa de irigare va fi pusă în funcțiune numai dacă valorile citite de la senzori și valorile citite de la ceasul aflat în structura internă a automatului programabil se află cuprinse în intervalele de valori stabilite sau dacă este acționat întrerupătorul conectat la intrarea digitală 1 a automatului.

Pompa irigare:
Varianta 1:Temperatura: ON = 20 OFF = 25C-> Umiditate: ON = 30 OFF = 40->Ceas: ON = 07:00 OFF = 07:30->|
Varianta 2:Într Irigare->|
Varianta 3:-
Varianta 4:-”

  În mod similar se procedează pentru configurarea evenimentelor care pun în funcțiune pompa de umplere a bazinului cu apă. Se alege din lista de dispozitive ”Pompa umplere”, iar din lista de variante ”Varianta 1” și se bifează căsuța adiacentă etichetei ”Senzor nivel”. Pentru varianta 2 , se va bifa căsuța din dreptul etichetei ”Într Bazin”. Figura de mai jos prezintă interfața de programare după editarea condițiilor pentru aclanșarea pompei de umplere a bazinului.
  Butonul ”Clear” va șterge toate câmpurile text ce conțin intervalele de valori pentru ceas, intrări analogice și senzorii de temperatură, umiditate și lumină.


Fig.5.11 Editarea evenimentelor care vor acționa pompa de umplere a bazinului cu apă


Pompa irigare:
Varianta 1:Temperatura: ON = 20 OFF = 25C-> Umiditate: ON = 30 OFF = 40->Ceas: ON = 07:00 OFF = 07:30->|
Varianta 2:Într Irigare->|
Varianta 3:-
Varianta 4:-
Pompa umplere:
Varianta 1:Senzor nivel->|
Varianta 2:Într Bazin->|
Varianta 3:-
Varianta 4:-”

  Pentru a transmite acest program automatului programabil cu adresa de IP stabilită (192.168.0.10) se va acționa butonul indicat de eticheta ”Trimite Configurația”. Important de menționat este și faptul că pompele folosite în acest exemplu pot fi acționate și prin intermediul acestei interfețe software, acționându-se butonul etichetat ”Actionare Manuală”. Pentru memorarea acestui program se va folosi meniu ”File”, iar cu ajutorul ferestrelor specifice operațiilor de salvare a fișierelor se vor menționa numele dorit pentru fișierul memorat și locația unde acesta este salvat. Dacă fișierul este memorat cu succes sau memorarea a creat o eroare interfața va genera o fereastră nouă informând utilizatorul despre aceasta.

5.2.Realizarea interfeței software în mediul de programare NetBeans utilizând limbajul de programare JAVA

  Interfața software de programare a automatului pentru sistemele domotice a fost realizată utilizând limbajul Java în mediul de programare Netbeans. Acest mediu de programare permite construirea interfeței folosind elemente grafice în mod similiar cu mediu Microsoft Visual. Figura 5.12 prezintă printr-o captură de ecran fereastra ”Design” care permite așezare elementelor interfeței pe panoul aplicației (Form).


Fig.5.12 Mediul de programare Netbeans, interfața Design
  O dată cu plasarea elementelor folosite la construcția acestei interfețe și editarea proprietăților acestora cu ajutorul ferestrei ”properties”, Netbeans instanțiază obiectele Java și generează liniile de cod necesare descrierii proprietăților acestora în metoda initComponents().
  Elementele de tip JtextField pot fi editate de către utilizator doar la acționarea mouse-ului, iar apoi, la apăsarea tastei ”enter” aceastea ies din ”focus”, scrierea textului în aceste elemente nu mai fiind permisă. Astfel s-a făcut posibilă denumirea intrărilor și ieșirilor automatului de către utilizator, conform cu senzorii sau întrerupătoarele conectate. Liniile de cod următoare tratează evenimentele generate de mouse și tastatură, pentru editarea numelui intrării digitale 0.

private void Dig0NameMousePressed(java.awt.event.MouseEvent evt) {
Dig0Name.setFocusable(true);
}

private void Dig0NameKeyPressed(java.awt.event.KeyEvent evt) {
if(evt.getKeyCode() == KeyEvent.VK_ENTER){
Dig0Name.setFocusable(false);
}
}
  Așa cum am menționat în subcapitolul anterior, intervalul de valori impus de către utilizator, în care intrările analogice, temperatura, umiditatea și lumina trebuiesc încadrate pentru a îndeplinii condiții adevărate în structura logică a programului, este stabilit cu ajutorul potențiometrelor de tip ”JSlider”. Urmărind figura 5.13, ”JSlider1” este cel care stabilește valoarea minimă a intervalului, iar ”JSlider2” cel care stabilește valoarea maximă. Codul Java care tratează preluarea, prelucrarea și afișarea valorilor de la aceste două elemente de tip ”JSlider” urmărește ca valorile stabilite de ”JSlider1” să fie intotdeauna mai mici decât valorile stabilite cu ajutorul potențiometrului ”JSlider2”, în caz contrar, preluarea valorilor de la aceste potențiometre este oprită, iar câmpul care afișează valoarea potențiometrului acționat este colorat în roșu. Această excepție este exemplificată în figura 5.14.



Fig.5.13 Elementele de tip ”JSlider” folosite la stabilirea intervalului de valori




Fig.5.14 Valoarea minimă a intervalului este mai mare decât valoarea maximă stabilită

  Afișarea valorilor și memorarea lor în câmpurile și, repectiv, în variabilele corespunzătoare intrării analogice sau a senzorului dorit sunt realizate urmărind starea butoanelor radio de tip ”JRadioButton”, aflat în dreapta câmpurilor de afișare a valorilor intervalului. În cadrul liniilor de cod Java acestea sunt An1Adj, An2Adj, An3Adj, An4Adj, TempAdj, HumAdj și LightAdj.      Câmpurile pentru afișarea valorilor minime sunt Ain1ON, Ain2ON, Ain3ON, Ain4ON, TempON, HumON, LightON, iar cele pentru afișarea valorilor maxime sunt Ain1OFF, Ain2OFF, Ain3OFF, Ain4OFF, TempOFF, HumOFF, LightOFF. Figura 5.15 prezintă fluxul de execuție a funcției care tratează preluarea și afișarea datelor ajustate cu ajutorul potențiometrului JSlider1, considerându-se ca exemplu ajustarea valorilor pentru intrarea analogică 1 .



Figura.5.15 Ajustarea valorii cu ajutorul potențiometrului JSlider1

  Valoarea minimă a potențiometrelor de tip ”JSlider” este egală cu 0, iar cea maximă cu 1023.
Prin urmare, în ceea ce privesc valorile de comparare pentru intrările analogice ale automatului programabil preluate de la aceste potențiometre sunt transmise către automatul programabil fără a fi prelucrate, procesarea acestor date de către firmware fiind ușor de implementat având în vedere rezoluția de 10 biți a convertoarelor analog-numerice din structura microcontrolerului.
  Spre deosebire de valorile de comparare pentru intrările analogice, valorile de comparare pentru senzorii de temperatură, umiditate și lumină sunt prelucrate de către interfață, cu scopul de a se obține valori cuprinse în intervalul 10 , 40 grade C pentru temperatură și 0 %, 100% pentru umiditate, pentru valori ale potențiometrelor cuprinse în intervalul 0, 1023.
  Butonul ”OK” aflat în interiorul blocului ”Editare Eveniment” este de tip ”JButton” și are rolul de a construi șirul de caractere pentru varianta selectată, conform convențiilor descrise în capitolul 4.2 și afișarea condițiilor impuse de către utilizator în câmpul text aflat în blocul ”Lista evenimente”.    Aceste sarcini sunt îndeplinite de către metoda SetBtnActionPerformed, apelată la apăsarea acestui buton. Construirea șirului de carcatere pentru varianta selectată constă în adăugarea caracterelor stabilite și descrise în capitolul 4.2, folosindu-se variabila de tip String denumită ”RelConfig”. Pentru construirea textului afișat în câmpul de tip ”JTextArea” aflat în interiorul blocului ”Lista Evenimente”, s-a folosit variabila de tip String ”SetText”. Prin intermediul instrucțiunilor de tip IF se verifică validarea căsuțelor de tip ”JCheckBox”, prioritar construirii acestor șiruri.
  Pentru fiecare variantă de eveniment a celor 8 dispozitive s-a creat o variabilă de tip string:
String Rel0v0, String Rel0v1, String Rel0v2, String Rel0v3, String Rel1v0, String Rel1v1, String Rel1v2, String Rel1v3, String Rel2v0, String Rel2v1, String Rel2v2, String Rel2v, String Rel3v0, String Rel3v1, String Rel3v2, String Rel3v3, String Rel4v0, String Rel4v1, String Rel4v2, String Rel4v3, String Rel5v0, String Rel5v1, String Rel5v2, String Rel5v3, String Rel6v0, String Rel6v1, String Rel6v2, String Rel6v3, String Rel7v0, String Rel7v1, String Rel7v2, String Rel7v3, iar șirul ”RelConfig” este copiat în variabila corespunzatoare dispozitivului sau ieșirii digitale selectate. Această metodă este prezentată sub forma uni diagrame în figura de mai jos.




Fig.5.16 Modul de execuție a metodei SetBtnActionPerformed

  La acționarea butonului ”Trimite configurația”, se apelează metoda TxBtnActionPerformed care îndeplinește sarcina de a concatena șirurile memorate cu ajutorul variabilelor descrise mai sus, obținându-se șirul de caractere complet care reprezintă programul pentru automatul programabil și transmiterea lui în rețea utilizând protocolul UDP. Rândurile următoare prezintă concatenarea și adăugarea secvenței de caractere ”conf” la șirul obținut.

RelConfig = "";
RelConfig = "r0" + Rel0v0 + Rel0v1 + Rel0v2 + Rel0v3 + "e" + "r1" + Rel1v0 + Rel1v1 + Rel1v2 + Rel1v3 + "e" + "r2" + Rel2v0 + Rel2v1 + Rel2v2 + Rel2v3 +
"e" + "r3" + Rel3v0 + Rel3v1 + Rel3v2 + Rel3v3 + "e" + "r4" + Rel4v0 + Rel4v1 + Rel4v2 + Rel4v3 + "e" + "r5" + Rel5v0 + Rel5v1 + Rel5v2 + Rel5v3 +
"e" + "r6" + Rel6v0 + Rel6v1 + Rel6v2 + Rel6v3 + "e" + "r7" + Rel7v0 + Rel7v1 + Rel7v2 + Rel7v3 + "e";
RelConfig = "conf" + RelConfig;

  Transmiterea datelor cu ajutorul protocolului UDP, presupune copierea șirului de caractere într-o matrice de tip byte, crearea unui pachet de date care conține adresa IP a automatului și portul pe care se transmite, iar, în sfârșit, crearea unui socket și transmiterea datelor.
  Verificarea integrității datelor recepționate de către automatul programabil este realizată în interiorul acestei metode. După executarea instrucțiunilor de transmitere a șirului de caractere, interfața software așteaptă ca automatul programabil să răspundă cu șirul de caractere recepționat. Interfața software compară șirul transmis cu cel recepționat de la automat și informează utilizatorul cu ajutorul mesajelor de tip JoptionPane.showMessageDialog despre rezultatul comparării. De asemenea, se va genera un mesaj de eroare și în cazul în care transmisia nu a avut succes după mai multe încercări facute în intervalul de timp 1000ms. Figura de mai jos prezintă modul în care se face verificarea datelor transmise către automat.



Fig.5.17 Modul în care se face verificarea datelor transmise către automat

  La acționarea butonului ”Actionare Manuala” se apelează metoda ManualBtnActionPerformed care îndeplinește sarcina de a crea șirul de carcatere care reprezintă comanda de acționare a uneia din cele 8 ieșiri digitale și transmiterea acestuia către automatul programabil. Așa cum s-a descris în capitolul 4.2 acest șir este format prin adăugarea la secvența de caractere ”cmd” a carcaterului cifră care reprezintă numărul ieșirii digitale. Ieșirile digitale sunt așezate în mod cronologic în lista indicată de eticheta ”Selectati Dispozitiv”, prin urmare acest șir este format din secvența ”cmd” și indexul elementului selectat din această listă. Rezultatul concatenării celor două secvențe este memorat intr-o variabilă de tip String denumită ”Cmd” și transmisă automatului cu ajutorul protocolul UDP. Instrucțiunile pentru executarea formării și transmiterii pachetelor UDP sunt similare cu cele folosite în metoda TxBtnActionPerformed descrisă mai sus.


Fig.5.18 Fluxul de execuție a metodei ManualBtnActionPerformed

  Butonul ”Clear” aflat în interiorul blocului ”Editare Eveniment” apelează funcția ClearBtnActionPerformed care șterge textul din interiorul tuturor câpurilor editate de utilizator, cu excepția câmpurilor de editare a numelui controllerului și a adresei IP, cu ajutorul metodei setText().
Una din caracteristicile importante ale acestei interfețe software este posibilitatea de memorare a întregului program realizat de către utilizator, intr-un fișier text. Așa cum am prezentat în subcapitolul anterior, ”salvarea” programului se face utilizând meniul ”File - Save As...” sau ”File - Save”. Aceste meniuri apelează metode diferite, însă ambele vor executa formarea în formă finală a șirului de caractere care reprezintă programul automatului, precum și formarea unui șir de caractere care conține numele intrărilor, ieșirilor, numele și adresa IP a automatului stabilite de către utilizator. De asemenea, se va memora în acest fișier textul afișat de câmpul aflat în blocul ”Lista Evenimente”.
  Meniul ”File-Open” apelează metoda MenuOpenActionPerformed care va genera o fereastă de tip FileChooser.showOpenDialog(this) care permite utilizatorului să selecteze fișierul memorat, înscrie câmpurile text cu șirurile de caractere salvate și memorează în variabilele descrise mai sus secvențele de caractere care vor fi utilizate în formarea programului pentru automat după efectuarea modificărilor de către utilizator.
  În componența programului se află clasa principală ”MainFrame” care este derivată din superclasa ”javax.swing.JFrame”. Constructorul clasei ”public MainFrame()”, obiectele, metodele care tratează evenimentele generate de obiectele interfeței cu utilizatorul și tipul variabilele globale folosite ăn acet program sunt reprezentate ăn diagrama din figura 5.19




Fig.5.19 Elementele din structura clasei principale ”MainFrame”












Capitolul 6

Concluzii

6.1.Concluzii

  În cadrul acestei lucrări s-a dorit proiectarea unui sistem de automatizare a mediului domotic, în scopul realizării unui produs finit care să aibă un cost redus de producție și să fie ușor de folosit și întreținut, astfel încât să poată reprezenta o soluție viabilă în automatizarea proceselor de întreținere sau măsurare în cadrul mediului domestic, pentru persoanele cu dezabilități sau pentru sporirea confortului în imobile.
  Studiul bibliografic realizat la începutul acestui proiect a evidențiat faptul că progresul tehnologic din ultimii ani a dus la realizarea tot mai ușoară și mai ieftină a sistemelor de comandă automată și a transmiterii datelor la distanță facând posibilă înbunătățirea confortului în mediul domotic. Sistemele de tip IoT (Eng. Internet of Things) sunt dovada progresului tehnologic major din ultimii ani care aduc în sistemele domotice controlul facil al diferitelor dispozitive. Prețul scăzut al microcontrolerelor cu arhitectura organizată pe 8 biți, precum și dezvoltarea fenomenului ”Open   Hardware” face posibilă astăzi, realizarea diferitelor proiecte de automatizare și control la distanță, folosindu-se viteze mari de transmisie a datelor, utilizându-se diferite protocoale sau soluții hardware de comunicare.
  Prima etapă în realizarea acestui proiect a fost selectarea unui microcontroler cu ajutorul căruia s-a construit partea hardware, care să prezinte un cost relativ scăzut de achiziționare, să dețină suficientă memorie de program și de date, să fie echipat cu interfețele de comunicare propuse spre utilizare în acest proiect și să fie disponibil în capsulă de tip THT (eng. Trough Hole Technologie) pentru a face posibilă construcția și testarea prototipului cât mai ușor.
  Cea de-a doua etapă a constat în crearea unui protocol simplu de transmitere a datelor către automatul programabil, astfel încât memorarea și interpretarea acestuia să nu consume resurse majore din structura microcontrolerului, iar implementarea acestuia în firmware să fie posibilă pentru arhitectura organizată pe 8 biți. De asemenea, în ceea ce privește interfața de comunicare cu acest automat programabil, s-a dorit încă de la început posibilitatea conectării mai multor astfel de automate într-o rețea locală de tip LAN, oferindu-se astfel posibilitatea extinderii ariei automatizate de către utilizator și, mai ales, facând posibilă comunicarea cu acestea de la distanță prin intermediul conexiunii WiFi (wireless).
  Cea de-a treia etapă în dezvoltarea acestui proiect a constat în conceperea unui model pentru interfața software de programare și comandă a automatului, ușor de utilizat de către utilizatorii care nu dețin cunoștințe despre domeniul automatelor programabile și programarea lor.
  Cea de-a patra etapă a fost proiectarea și crearea plăcii de circuit imprimat folosindu-se resurse financiare scăzute.
  Cea de-a cincia etapă și cea de a șasea au constat în scrierea firmware-ului pentru microcontroler și, respectiv a software-ului.
  În final se poate spune că automatul programabil împreună cu interfața software de programare și control formează un sistem perfect funcțional, care prezintă posibilități de înbunătățire în viitor. Odată cu crearea protocolului de transmisie și memorare a programului de către automat, odată cu realizarea unui mod facil de programare a automatului și crearea unei interfețe prietenoase cu utilizatorul, în acest proiect s-a creat un sistem flexibil și viabil care aduce ajutor și confort în locuințele oamenilor.



6.2.Upgrade-ul sistemului în versiuni viitoare


  Acest automat programabil pentru sisteme domotice poate fi dezvoltat și mai mult prin adăugarea unor noi blocuri hardware și implementarea unor noi funcții în structura firmware-ului. Din punct de vedere al hardware-ului este posibilă extinderea numărului de intrări și ieșiri digitale, precum și adăugarea ieșirilor capabile să ofere semnale de tip PWM (eng. pulse width modulation). De asemenea, se vor putea adăuga sisteme de comunicare serială, având în vedere că prototipul prezentat în această lucrare nu folosește portul serial al microcontrolerului (portul UART).
  Se vor proiecta și dezvolta mai multe tipuri funcționale de module externe care pot fi conectate la ieșirile automatului, ca exemplu module de comandă echipate cu triace sau tranzistoare de putere mosfet.
  O înbunătățire majoră a sistemului constă în înlocuirea microcontrolerului Atmega32 cu Atmega644 sau Atmega1284, care sunt compatibile pin la pin cu microcontrolerul utilizat și care prezintă resurse superioare în ceea ce privește memoria de program și de date.
  Dimensiunile placii de circuit imprimat vor fi reduse și se va concepe o carcasă corespunzătoare pentru montarea acestui sistem.
  Din punctul de vedere al firmware-ului toate blocurile hardware adăugate vor fi implementate în program oferindu-se astfel noi funcții, exemplu fiind controlul în PWM a sistemului de iluminat.
Din punctul de vedere a interfeței software de programare și comandă a automatului, se vor adăuga funcții noi conforme cu upgrade-ul hardware și mai ales, se va dezvolta o aplicație de comandă a automatului, capabilă să ruleze sub sistemul de operare Android, oferindu-se astfel posibilitatea de comandă la distanță a diferitelor dispozitive conectate la ieșirile automatului, cu ajutorul telefonului mobil sau a tabletei.
 Posibilitatea conectării acestui automat programabil la mediul IoT (eng. Internet of Things) reprezintă una din cele mai importante funcții care vor fi adăugate acestui sistem în viitor. Din acest motiv, pentru interfața de comunicare s-a ales comunicația ethernet, iar pe viitor, doar prin dezvoltare firmware se va implementa conectarea la serverele de tip nori IoT.
În concluzie se poate spune că automatul programabil pentru sistemele domotice realizat și prezentat în această lucrare prezintă posibilități majore de upgrade, conforme cu sistemele moderne de control și transmitere a datelor.
















Bibliografie


  1. Laurean_Bogdan,_PLC1,(06.06.2016) http://web.ulbsibiu.ro/laurean.bogdan/html/PLC1.pdf_
  2. Stefan Johansson, Martin Öhman, Prototype implementation of the PLC standard IEC 1131-3_(06.06.2016)_http://citeseerx.ist.psu.edu/viewdoc/download?doi=10.1.1.17.2253&rep=rep1&type=pdf
  3. Florian Mircea Boian, Servicii Web; Modele, Platforme, Aplicații, Editura Albastă, An2011
  4. O.G.Popa, Învață Hardwarew Frirmware și Software Design, Editura Complement Control, An 2010
  5. Jim Keogh, Java fără mistere, Editura Rosetti Educational , An 2006
  6. Ștefan Tanasă, Ștefan Andrei, Cristian Olaru, Java de la 0 la expert, Editura Polirom, An 2011
  7. Elecia White, Making Embedded Systems, Editura O'Reilly, An 2011
  8. Stanciu, I.R., Molnar-Matei, F., Sisteme de monitorizare şi control în timp real, Editura Eurostampa, Timişoara 2013, ISBN 978-606-569-542-9
  9. Florin Molnar-Matei, Ioan Rareş Stanciu, Introducere în electronică analogică şi digitală. Note de curs şi îndrumător de laborator, ISBN: 978-606-569-968-7, 2015.
  10. Muhammad Ali Mazidi, Janice Mazidi, Sarmad Naimi, Avr Microcontroller and Embedded Systems: Using Assembly and C, Editura Pearson, 2010
  11. Ying Bai, Practical Microcontroller Engineering with Arm Technology: Marginalized Subjects and Sources, Editura Wiley-IEEE Press, 2016
  12. Daniel J. Pack , Steven Barrett, Microcontroller Programming and Interfacing, Editura Morgan & Claypool, 2011, ISBN-13: 9781608457137
  13. Dogan Ibrahim, Microcontroller-Based Temperature Monitoring and Control, Editura NEWNES, 2002, ISBN-13: 9780750655569














































No comments:

Post a Comment