duminică, 19 februarie 2012

Panou Termic Solar DIY - Partea II (Electronica)

Comanda pompei - partea electronică
Având în vedere că e iarnă şi construirea instalaşiei e mai dificil de făcut, m-am gândit că cel mai simplu ar fi să mă ocup de partea electronică şi de partea sofware a instalaţiei. Astfel m-am pus pe treabă şi mi-am făcut o listă cu funcţionalităţile care trebuie să le aibă circuitul electronic. Am început prin a face o schiţă generală a montajului (schema bloc).
1. Schema bloc
Circuitul electronic controlează funcţionarea instalaţiei este compusă dintr-o parte de comandă şi una de control a pompei. Partea de comandă are rolul de a permite utilizatorului să modifice sau să verifice anumiţi parametri ai circuitului. Pe lângă asta, partea de comandă are şi rolul de a decide pornirea sau oprirea pompei, pe baza temperaturilor măsurate cu ajutorul celor doi senzori amplasaţi în panou, respectiv în bazinul de stocare.

M-am gândit că o să-mi fie mai uşor de realizat schema electrocnică dacă împart circuitul îm mai multe blocuri specializate: controlul pompei, afişarea datelor pe ecran, tastatura, citirea temperaturii etc. Toate aceste blocuri funcţionale vor avea ca punct central microcontroller-ul ATmega8, care va controla întregul montaj.
2. Schema electronică
Mai jos se poate vedea schema detaliată:


2.1 Partea de alimentare
Partea de alimentare e compusă din două stabilizatoare de tensiune (IC1 şi IC2), pentru tensiunile de 12V şi 5V folosite în motaj. Pe lângă stabilizatoare mai sunt şi o serie de condensatori folosiţi în mare parte pentru filtrarea zgomotului ce poate să apară.
Între cele două stabilizatoare am montat o diodă urmată de doi condensatori de capacitate mai mare. Din cauze ce ţin de aranjarea pieselor pe placă, unul din condensatori a fost montat după 7805. Rolul acestor condensatori împreună cu dioda e de a acumula energie, care poate fi folosită în cazul unei căderi a tensiunii de alimentare.
Astfel, în momentul în care tensiunea de alimentare scade suficient de mult, dioda se va bloca, iar energia stocată în condensatori va menţine montajul alimentat o perioadă scurtă de timp. Această perioadă e proporţională cu capacitatea condensatorilor folosiţi. Am folosit doi condensatori de 1000uF şi 3300uF, care în total însumează peste 4000uF. În cazul montajului de faţă, această capacitate permite menţinerea tensiunii de 5V aproximativ o jumătate de secundă după ce tensiunea de alimentare a fost oprită. Această perioadă e suficient de mare pentru a permite microcontroller-ului să salveze starea curentă a sistemului în memoria EEPROM internă.
2.2 Monitorizarea tensiunii de alimentare
Nivelul tensiunii de alimentare e monitorizat permanent de către microcontroller prin cele două intrări ale comparatorului său analogic (AIN0 şi AIN1). AIN0 este intrarea neinversoare a comparatorului, iar AIN1 este cea inversoare. Pe pinul AIN0 va cădea o tensiune ce e obţinută din cea de 5V printr-un divizor de tensiune. Rezistenţele din divizorul de tensiune (R5 şi R6) au fost alese în aşa fel încât să obţin 4.5V la AIN0. Aceasta va fi tensiunea de referinţă. Pe pinul AIN1 va ajunge o tensiune obţinută din tensiunea de 12V. Rezistenţele R7 şi R8 fac ca din celălalt divizor de tensiune să ajungă, pe AIN1, aproximativ 5.5V.
În momentul în care tensiunea de alimentarea începe să scadă (din cauza unei pene de curent), tensiunea de 12V va fi prima afectată, şi va începe să scadă. Astfel tensiunea  pe pinul AIN1 va coborî sub valoarea tensiunii de pe pinul AIN0. În acel moment comparatorul analogic va declanşa o întrerupere (Analog Comparator IRQ) care va scrie în EEPROM-ul intern toate configuraţiile sistemului, data, ora, etc. Datorită circuitului descris în paragraful precedent (2.1), tensiunea de 5V va fi menţinută suficient de mult timp pentru a permite microcontroller-ului să stocheze toate datele în EEPROM.
2.3 Comunicarea cu senzorii de temperatură
De microcontroller-ul sunt legaţi doi senzori de temperatură (DS18B20) ce pot comunica prin protocolul 1-Wire. Acest protocol permite transmiterea bidirecţională a datelor pe un singur cablu pe distanţe foarte lungi (peste o sută de metri). Eu am folosit un cablu lung de aproximativ 20 metri. Distanţa la care se pot transmite date depinde foarte mult de tipul cablului, şi poate varia de la câţiva centrimetri, până la zeci de metri. După mai multe teste cu diferite cabluri am ales să folosesc cablu panglică (asemănător cu cel de la Hard-disk-urile pe IDE).
Viteza protocolului 1-Wire nu e foarte mare. Transmisia unui bit prin protocolul 1-Wire se face în 60us, ceea ce înseamnă că viteza de transmisie a datelor e de aproximativ 16k Baudrate (adică 16 kilo-biţi de date pe secundă sau 2 kilo-octeţi pe secundă).
Linia de date a protocolului are nevoie de o rezistenţă la plus externă (pull-up extern) de 4.7k ohmi (poate să difere cu distanţa).
Deşi protocolul suportă mai mulţi senzori pe aceelaşi cablu de date, am ales să folosesc câte un cablu separat pentru fiecare cablu. Motivul e coplexitatea ridicată a algoritmului folosit pentru identificarea senzorilor de pe magistrala de date.
2.4 Tastatura
Tastatura e formată din patru butoane: Enter, Escape, Plus şi Minus. Cu ajutorul lor se poate naviga prin meniu şi se pot face toate setările necesare instalaţiei. Circuitul pentru fiecare buton e foarte simplu. Fiecare pin al microcontroller-ului e configurat în aşa fel încât să aibă o rezistenţă internă la plus ("internal pull-up resistor" de 20k ohmi). Pe partea celalată, butonul, odată închis va lega la masă pinul. Astfel, de fiecare dată când butonul va fi apăsat, pe pin vor fi 0V, iar în rest 5V.
2.5 Afişarea datelor pe ecran
Am folosit un ecran alfa-numeric cu două rânduri şi 16 coloane RC1202D. Ecranul se alimentează de la 5V, poate fi comandat prin 4 linii de control şi 8 (respectiv 4) linii de date. Liniile de control ale ecranului sunt digitale, cu excepţia pinului VO, care e analogic şi prin care se poate regla contrastul display-ului. Pentru aceasta am folosit un semi-reglabil de 4.7k (P1).
Linia de control R/W a fost conectată la masă deoarece, pentru aplicaţia asta e nevoie doar de transmisia datelor de la microcontroler la ecran şi nu viceversa.
Display-ul mai are doi pini (LED+ şi LED-) pentru alimentarea led-urilor care luminează ecranul. Am vrut ca iluminarea ecranului să poată fi controlată de microcontroller, aşa că am legat pinul LED+ la portul PD5 al microcontroller-ului.
Toţi pinii de date ai display-ului (DBx) sunt legaţi la portul PBx (x = 0 .. 7).
2.6 Controlul pompei prin releu
Circuitul de comandă al pompei este realizat prin comanda unui releu de 220Vac. Aceasta este şi partea de putere a montajului. Comanda releului se face printr-un optocuplor (IC6) care deschide tranzistorul T1, care comandă, la rândul lui bobina releului K5.
La cuplarea, respectiv decuplarea, bobinei releului vor apărea vârfuri scurte de tensiune care pot afecta restul circuitului. Aceste impulsuri sunt aşa de scurte încât ele pot trece prin circuitul de alimentare, şi pot ajunge la microcontroller, cauzând un Reset. Pentru a filtra aceste impulsuri, am adăugat de o parte şi de alta a releului câte un condensator de 100pF (C9 şi C10).
Pentru protejarea tranzistorului T1 am legat dioda (D8) paralel cu bobin releului, în sens invers de conducţie. Această diodă are rolul de a descărca bobina cât mai repede, în momentul în care T1 este blocat. Fără această diodă, energia acumulată în bobina releului, ar putea străpunge tranzistorul.

Comanda începe prin punerea pinului PD4 pe "1" logic, adică o tensiune de aproximativ 5V. Asta va face ca optocuplorul IC6 să se deschidă şi să deschidă, la rândul lui tranzistorul T1. În momentul în care T1 s-a deschis, bobina releului este alimentată, iar releul va cupla, alimentând astfel pompa.
Rolul optoculplorului e de a izola cât mai bine parte de putere de partea de comandă. În cazul în care T1 este străpuns (din orice motiv), tensiunea de 12V nu poate ajunge la pinii microcontroller-ului, datorită optocuplorului.
2.7 Detectarea prezenţei releului
E foarte important ca atunci când apare o defecţiune, aparatul cu care lucrezi să îţi poată da cât mai mute informaţii legate de problema apărută. Din acest motiv am încercat să fac montajul să detecteze cât mai multe defecţiuni. M-am gândit că partea de comandă a releului e foarte împortantă aşa că am vrut să am o confirmare (feedback) că releul e conectat la regulator şi că funcţionează.
Pentru a face lucrul ăsta m-am folosit de un amplificator operaţional, care compară tensiunea ce cade pe rezistenţa R10, cu tensiunea de alimentare de 12V. În cazul în care releul lipseşte (sau cablul de comandă e întrerupt), pe R10 nu va fi nici o cădere de tensiunea (nu circulă curent prin rezistenţă). În situaţia asta amplificatorul va semnaliza microcontroller-ului lipsa releului prin intermediul pinului PD4 (pompă feedback).

În cazul în care releul e prezent în circuit, la comanda de pornire a pompei, prin R10 va trece curent. Asta va duce la apariţia unei căderi de tensiune pe R10, care va face ca amplificatorul să nu comute din 0V în 12V.
Desigur partea asta de circuit nu e esenţială, ea poate lipsi. Pentru mine a fost o provocare să găsesc o metodă de a face detecţia releului, folosindu-mă de ce am avut la dispoziţie prin casă.
3. Programarea
În schemă nu apare şi interaţa pentru AVR Prog, prin care am programat microcontroller-ul.
În asta constă circuitul electronic al regulatorului. Nu am experienţă în electronică aşa că schema are cu siguranţă multe greşeli de proiectare, aşa că orice sfat sau observaţie e binevenită! :-)

8 comentarii:

  1. Daca spui ca orice sfat si observatie e binevenita, indraznesc sa imi spun opinia :)

    1. Cum vei tine minte timpul cand nu mai ai alimentare? Nu e mai simplu sa ai un modul de real time clock de la care sa citesti timpul pe I2C? De exemplu DS1302, costa vreo 3-4 dolari pe dx.com. Cred ca e mai precis si mai elibereaza din resursele microcontrolerului (nu mai calculezi timpul intern).

    2. Impotriva caderii alimentarii, eu am folosit cu succes acumulatori cu litiu de la aparate foto, spre exemplu acumulatori tip NB-7L si incarcator modificat a.i. sa am acumulatorul incarcat tot timpul si cand pica alimentarea sa poata fi salvate datele si eventual sa pot butona aplicatia, eventual sa citesc una alta de pe LCD

    3. De ce folosesti 8 linii de date pt LCD? Merge foarte bine si cu 4 linii de date (D7..D4), poate mai vrei sa adaugi ceva in plus pe cei 4 pini eliberati in acest mod de la microconctroler.

    4. Pentru impresia artistica, poti folosi un LED bicolor care sa indice starea sistemului. Am vazut ca ai si un modul soft "key timeout", credeam ca vei pune un tranzistor care sa intrerupa alimentarea la LCD dupa un timp X, atunci un LED va ramane sa indice starea sistemului cat LCDul este stins.

    5. Merg bine pull-up-urile interne? De ce nu pui 10kOhm extern la butoane? De obicei nu sunt rezistente interne, sunt simulate cu tranzistoare MOS. Ocupa loc pe placa, dar prefera sa vad componentele :)

    Oricum, e un proiect fain, ma bucur sa vad ca mai sunt romani care creaza si nu iau totul de-a gata. Sper ca spiritul Tehnium nu s-a pierdut :)

    RăspundețiȘtergere
    Răspunsuri
    1. Salut Cătălin,
      Să ştii că m-aş bucura foarte mult dacă aş primi mai multe comentarii de genul ăsta. :-)
      1. În momentul în care controller-ul simte căderea de tensiune, el va salva starea sistemului în EEPROM-ul intern. Printre datele salvate e şi ora şi data de la momentul întreruperii alimentării. Pe durata penei de curent, ceasul nu o să meargă, dar o dată ce revine alimentarea, ceasul o să fie iniţializat cu ora care a fost salvată în EEPROM. În cazul în care aş folosi un controller care are interfaţa I2C, s-ar preta folosirea unui DS1302, dar Atmega8 nu ştie protocolul ăsta. Implementarea protocolului I2C pe Atmega8 mănâncă din resurse aşa că nu aş câştiga prea mult.
      2. Asta e o idee foarte bună, dar ar însemna un circuit electric care să încorporeze şi partea de încărcare a acumulatorului, iar eu nu stăpânesc prea bine partea electronică. Pe de altă parte, dacă pică alimentarea, atunci nici pompa nu merge, aşa că regulatorul n-ar mai avea ce să controleze.
      3. Bună întrebare! Ideea mea era să trec la 4 linii de date doar dacă aveam nevoie de acele linii. Momentan m-am încadrat la fix în numărul de pini ai controller-ului, dar, oricum, rezerva asta o să rămână şi pe viitor.
      4. Bine zici! Două leduri, din care unul bicolor, ar fi suficiente pentru a indica starea sistemului. Nu m-am gândit la asta. În momentul în care evenimentul "key timeout" porneşte, controler-ul stinge backlight-ul de la LCD, printre altele. Cu LCD-ul oprit s-ar reduce întrucâtva consumul de curent al montajului.
      5. Nu ştiam ce e în spatele acestor rezistenţe interne. Credeam că sunt rezistenţe în toată regula. Oricum, mă scutesc de lipituri în plus şi eliberează puţin montajul.
      Merci mult pentru sugestii şi informaţii, Cătălin! Mai am încă multe de învăţat la capitolul electronică, dar încet, încet... :-)
      Numai bine şi multă sănătate!

      Ștergere
  2. salut am incercat sa fac montajul si imi apar niste linii in plus pe display am folosit pony prog2000 si imi apar cateva linii in rest daca intru in meniu tot e ok imi afisaza corect datele poate ai vreo idee oricum e fain proiectul tine tot asa

    RăspundețiȘtergere
    Răspunsuri
    1. Salut,
      Trimite-mi un mail, te rog, în care să-mi dai mai multe detalii despre defect şi încerc să te ajut.
      Numai bine!

      Ștergere
  3. nu am inteles foarte bine... rezistentele pentru tastele k1..k4 se mai pun sau nu ?

    RăspundețiȘtergere
    Răspunsuri
    1. Salut,
      Nu sunt necesare rezistenţe pentru taste, deoarece se folosesc rezistenţele pull-up interne ale microcontroller-ului Atmega8.
      Numai bine!

      Ștergere
  4. salut
    am realizat si eu montajul , am programat microcontrolerul insa pe dysplai imi apar patratelele pline sau imi apar numai ciudatenii ca sa spun asa as dori daca se poate setarile pentru fusebits ma gandesc ca din aceasta cauza nu imi afiseaza ce trebuie . multumesc

    RăspundețiȘtergere
    Răspunsuri
    1. Salut,
      Problema asta pare să fie legată de conţinutul EEPROM-ului. Pentru început îţi sugerezi să verifici conţinutul EEPROM-ului, să vezi dacă e identic cu ce am postat în articolul cu partea de software.
      Spor!

      Ștergere