sâmbătă, 23 aprilie 2011

Senzor de temperatură Auto - DIY

Motivaţia

În iarnă am ajuns la concluzia că e foarte important să ştii care e temperatura de afară atunci când conduci. Dacă afară sunt în jur, sau sub zero grade, e bine să ştii că poţi da de polei. Bucăţica asta de informaţie te poate scuti de multe neplăceri sau necazuri. Cum maşina mea (Logan) nu are un senzor de temperatură m-am gândit să-mi fac unul. Pe piaţă există aşa ceva de cumpărat, la un preţ cât de cât rezonabil, dar am fost curios să văd cât de greu poate fi să fac un astfel de senzor de la zero. Chiar dacă e mult mai eficient să cumperi ceva gata făcut, şi poate chiar mai ieftin, experienţa pe care o dobândeşti lucrând la aşa ceva e de nepreţiut... pentru mine.

Piesele necesare

Ca de obicei, am început prin a face o "plimbare" pe net, prin "curţile altora" pentru inspiraţie. Internetul e plin tot felul de soluţii. Am pornit cu ideea de a face ceva cât mai ieftin, aşa că am încercat să refolosesc cât mai multe componente. 

Mi-am făcut o listă de lucruri trebuincioase:

  • un microcontroller ATtiny13
  • un  display de la un Nokia 1100
  • 3 condensatori de 1, 10 şi 100 uF
  • 3 rezistenţe de 330 Ω
  • 1 rezistenţă de 1k Ω
  • 1 rezistenţă de 4.7k Ω
  • 1 rezistenţă de 510 Ω
  • 1 rezistenţă de 470 Ω
  • un stabilizator de tensiune LM317
  • un senzor de temperatură digital DS18S20
  • 4 metri de cablu panglică
  • 4 metri de cablu dublu
  • o doză electrică cu capac
  • nişte şuruburi
  • 1 led galben şi 1 led roşu
  • nişte şiruri de pini
  • două mufe luate de la o sursă de PC
  • o mufă Jack stereo mamă şi una tată

Microcontroller-ul

Am ales ATtiny13 pentru că e printre cele mai ieftine microcontroller-e de pe piaţă. E destul de rapid pentru ce vreau să fac şi are suficientă memorie pentru aplicaţii mici, cum e un senzor de temperatură. Un alt avantaj e că are şi puţină memorie internă  de tip EEPROM, pe care am folosit-o din plin. În schimb, are un dezavantaj evident: numărul mic de pini (8 pini, din care doar 5 pot fi folosiţi ca porturi generale de intrare-ieşire). Am preferat să folosesc cât mai mult din ce oferă acest microcontroller înainte să trec la ceva mai performant. Asta mi-a dat câteva bătăi de cap la partea de programare, dar până la urmă am reuşit să obţin un senzor funcţional.


Display-ul

Acasă aveam două display-uri de la nişte telefoane mobile mai vechi, unul de la un Nokia 3310 şi altul de la un Nokia 1100. Cum planul meu era să fac oricum doi senzori, unul pentru maşina mea, iar celălalt pentru maşina tatălui meu, am zis că asta ar fi o ocazie bună să învăţ să folosesc ambele display-uri. Avantajele acestor tipuri de display-uri e că necesită un număr mic de linii de comandă şi date pentru a putea afişa ceva pe ele. Lucru ăsta s-a potrivit cu faptul că microcontroller-ul nu are prea mulţi pini de risipit. Pentru display-ul de Nokia 3310 e nevoie de 4 linii de comandă şi date, iar pentru display-ul de Nokia 1100 e nevoie doar de 3 linii de comanda şi date. În articolul acesta o să prezint în detaliu senzorul la care am folosit display-ul de Nokia 1100. Celălalt circuit va fi prezentat mai târziu.


Senzorul

Cea mai scumpă piesă, la care nu am vrut să fac rabat a fost senzorul de temperatură DS18S20. Până la urmă am reuşit să-l obţin gratis, direct de pe site-ul celor de la Maxim prin oferta lor de mostre gratuite ("free samples"). În magazine se găseşte la aproximativ 10 roni. Acest senzor are mai multe avantaje: e calibrat din fabrică, transmite valoarea temperaturii direct în format digital, face măsurători în grade Celsius, în plaja -55 şi +124 °C, are o precizie de până la 0.5 °C. Dezavantajul ar fi că foloseşte protocolul 1 Wire pentru transmiterea temperaturii, care e puţin mai complicat, dar permite folosirea mai multor senzori pe aceelaşi cablu. Am descris mai în detaliu acest protocol în secţiunea detaliată a algoritmului folosit.

Restul pieselor sunt uşor de găsit pe la magazinele de electronice, şi sunt foarte accesibile.


Schema eletronică

Schema pentru senzorul de temperatură la care am folosit display-ul de Nokia 1100 este asta:

Circuitul are o parte de alimentare formată dintr-un LM317 reglat să scoată aproximativ 3.3V. Tensiunea de 3.3V a fost aleasă pentru a nu afecta display-ul. Microcontroller-ul e legat prin 3 pini (PB2, PB0 şi PB3) la liniile de date ale display-ului (SDA = linia de date seriale, SCK = linia de impulsuri de tact, XRES = linia de reset). Aceşti trei pini sunt suficienţi pentru a putea comunica cu display-ul. Un alt din pin al microcontroller-ului (PB1 = Alarm) e legat la un LED roşu, care va indica o temperatură sub 4°C (adică pericolul apariţiei poleiului). Linia de date a senzorului e legată la pinul PB4 al microcontroller-ului, printr-un cablu lung (4 metri). Senzorul are nevoie pe linia de date de o rezistenţă de 4.7K Ω legată la plus pentru a putea transmite date. Valoarea rezistenţei am luat-o din foaia de catalog a senzorului, deşi pe internet unii spuneau că dacă se folosesc cabluri lungi, valoarea rezistenţei trebuie scăzută. Pentru cei 4 metri de cablu panglică (cu 3 fire) folosiţi de mine, 4.7K Ω a fost suficient.

Menţiune: Pe schemă nu apare condensatorul de 10 uF (am uitat de el), dar el e legat între 3.3V şi masă, cât mai aproape de microcontroler.

Schema la care am folosit ca şi afişare display-ul de Nokia 3310 va fi prezentată într-un alt articol. Între cele două scheme nu sunt diferenţe foarte mari, diferă puţin ordinea pinilor de la display-uri.

Asamblare

Am început asamblarea cu mufarea cablului ce merge la senzor. Senzorul trebuie să poată fi montat şi demontat cât mai uşor, iar cea mai simplă metodă a fost să folosesc mufe Jack stereo. Am ales mufe metalice pentru că sunt mai robuste şi pentru că o să înlesnească transferul termic către senzor.  

Senzorul a fost montat într-o mufă tată pentru a putea fi schimbat cât mai uşor. Pinii senzorului au fost lipiţi de contactele mufei jack, după cum urmează: Pinul de masă al senzorului este legat la carcasa mufei. Pinul de date de la senzor este legat la contactul din mijloc al mufei, iar alimentarea este legat la contactul din vârful mufei. Nu ştiu dacă asta e cea mai bună modalitate de conectare, e doar alegerea mea.

După lipirea senzorului pe mufă a urmat izolarea lui, şi montarea capacului. Capătul capacului prin care ar fi trebuit să intre cablul a fost astupat de o picătură de silicon. Acum senzorul e gata pentru a fi conectat la cablul de date.

Aşa arată senzorul montat pe cablu:

Pasul următor a fost pregătirea cablului de date pentru display. Aici am avut nevoie de un cablu panglică cu 8 fire. Am ales să folosesc unul colorat pentru a putea identifica liniile de date mai uşor. De un capăt al cablului panglică am lipit 8 pini mamă, dintr-un şir dublu de pini. Celălalt capăt al cablului panglică l-am lipit (cu mare grijă) de contactele display-ului. Aici a fost nevoie de puţină atenţie şi îndemânare, pentru că lipitura trebuie facută bine din prima încercare. Din câte am înţeles temperatura ridicată poate afecta traseele suflate pe sticla display-ului. Probabil din acest motiv în telefon, contactul este făcut mecanic cu pinii display-ului.

După ce partea de afişare a fost facută, am trecut la montajul propriuzis. Am încercat să-l fac cât mai compact, având în vedere că am folosit plăcuţe de test (o dată şi o dată o să învăţ să fac cablaje corodate). Pentru a putea face teste cât mai uşor am pregătit pe montaj pini prin care să pot accesa aproape orice linie a montajului. Cum trebuie să alimentez două led-uri ce vor fi prinse de "carcasă" am pregătit şi pini de pe care să pot culege uşor cei 3.3V de alimentare şi masa. Cei 8 pini dubli din dreapta montajului sunt pentru controlul display-ului. Pentru partea de intrare am folosit 4 pini, aflaţi în stânga montajului. Doi pini din cei patru formează partea de alimentare, adică 12V şi masa, iar ceilalţi doi pini reprezintă alimentarea pentru senzor (3.3V) şi linia de date de la senzor.

Înainte să decupez partea de cablaj nefolosită am făcut un test să văd cum se comportă montajul "în aer", adică înainte să-l pun în carcasă. Pentru asta am folosit un sul de 4 m de cablu panglică în capătul căruia am prins senzorul. Display-ul funcţiona, iar temperatura era afişată corect, deci primul test a fost trecut.

Pe post de carcasă am folosit o doză simplă de curent, care să aibă şi capac. Pentru a putea scoate mufa senzorului am decupat o partea din spate a dozei. Mufa e luată de la o sursă de calculator. , la care am prins de cele patru cabluri un şir de patru pini mamă, care urmează să intre pe cablaj.

Pe capacul dozei am montat display-ul de Nokia 1100 având grijă ca să scot pe partea cealaltă cablul panglică.

De o parte şi de alta a display-ului am prins led-urile cu ajutorul unor pini. Pinii sunt suficient de lingi ca să iasă pe partea celalaltă a capacului. Ei vor fi legaţi la cablaj prin nişte cabluri de care s-a montat câte o rezistenţă de 330 Ω, pentru limitarea curentului la aproximativ 10 mA. De menţionat ar fi aici faptul că acest dispay vine cu două led-uri albe mici, montate în partea de sus. Din această cauză am montat doar un singur led galben pentru luminarea ecranului.

Montarea pe maşină

După ce m-am interesat de poziţia normală a senzorilor de temperatură de la celalte automobile mi-am propus să aleg între a monta senzorul în bara de protecţie, sau în oglinda din stânga şoferului. Am ales să montez senzorul în bara din faţă deoarece mi se pare un loc mai ferit de razele soarelui. Suportul oglinzii e făcut din plastic negru, care se încălzeşte mai tare când e soare afară şi asta va afecta temperatura "simţită" de senzor. Desigur că înainte de a mă apuca de treabă am făcut câteva teste pentru a mă asigura că transmisia datelor de la senzor la microcontroller şi viceversa nu e afectată de câmpul electro-magnetic produs de motorul în funcţiune.

Pentru început a trebuit dată jos masca de sub bord. E prinsă în câteva cleme de plastic şi se poate da jos uşor (imaginea din stanga). Sub bord se vede un burduf de cauciuc (imaginea din dreapta), prin care iese un mănunchi de cabluri din habitaclu, în spaţiul de sub capotă. Înainte de a tăia burduful, trebuie să găsiţi locul cel mai prielnic de a face tăietura. Burduful are o serie de nervuri din cauciuc plasate în jurul găurii prin care trece mănunchiul de cabluri. Tăietura cablului pentru senzor trebuie făcută între aceste nervuri. Asta înseamnă că trebuie să pipăieşti punctul mai "moale" de la burduf şi acolo trebuie făcută o tăietură de cca 1 cm (ca să încapă mufa senzorului).

Pe partea cealaltă, sub capotă, cablul pentru senzor e prins cu nişte coliere de mănunchiul de cabluri şi merge o dată cu manunchiul până în dreptul farului.

Am încercat pe cât posibil să trec cablul pentru senzor cât se poate de aproape de celelalte cabluri. Arată mai frumos aşa, pe de o parte, pe de altă parte pentru că mi-a fost frică ca altfel să nu am probleme din cauza perturbaţiilor electromagnetice venite de la motor.

Chiar în dreptul farului din dreapta (cum stai cu faţa spre maşină), cablul pentru senzor părăseşte mănunchiul de cabluri, pentru a coborî până la farul de ceaţă.

Pentru a avea acces mai uşor la farul de ceaţă trebuie desfăcute cele trei şuruburi care ţin masca desub bara de protecţie. Cablul de la senzor trece pe lângă claxon până în dreptul mufei de la farul de ceaţă.

Mufa senzorului a fost prinsă cu două coliere de plastic de cablul de alimentare de la farul de ceaţă. După ce m-am asigurat că nu există părţi mecanice care ar putea să afecteze, sau să fie afectate de cablul meu, am închis totul la loc şi m-am mutat în habitaclu.

Am vrut ca montajul meu să aibă o siguranţă de protecţie, iar cel mai simplu a fost să folosesc o siguranţă deja existentă. Dintre toate aparatele din maşină, radioul e cel mai puţin "vital", aşa că am ales să montez senzorul meu pe aceeaşi siguranţă. Pentru început, am identificat locul siguranţei, folosindu-mă de desenul de pe capacul tabloului de siguranţe.

Pasul următor a fost demontarea tabloului de siguranţe, pentru a avea acces mai uşor la cablurile ce ies din el. Tabloul de siguranţe e prins în două şuruburi tip stea de 20 şi în două cleme de plastic mici situate lângă fiecare şurub. Siguranţa căutată de mine e cea roşie de 10A.

Fiecare siguranţă are o intrare (dinspre baterie) şi o ieşire (spre consumator). Firul de intrare e întotdeauna gros, iar cel de la ieşire e mai subţire. Aşa se identifică cel mai uşor alimentarea oricărui consumator de pe maşină. După ce am găsit firul de alimentare pentru radio, l-am tăiat şi am legat în paralel cablul meu pentru alimentarea senzorului. Pentru o prindere mai bună am folosit papuci de cablu, izolaţi cu cablu termo-contractil.

Masa pentru montajul meu am cules-o de la şurubul care ţine tabloul de suguranţă. Pentru a mă asigura că am masă acolo am verificat cu un multimetru dacă există contact între şurub şi caroseria maşinii, care e legată la borna de minus a acumulatorului.

Intenţionat mi-am lăsat mai mult cablu pentru a putea muta senzorul dacă vreau altundeva, aşa că surplusul de cablu l-am făcut sul şi l-am ascuns sub mochetă, lângă chedăr.

Cablurile le-am tras pe lângă locul unde vine prins chedărul, pentru a putea fi mascate cât mai bine. Pentru început semzorul a stat în stânga volanului, dar ulterior a trebuit să schimb locul senzorului în urma unor plângeri repetate din partea co-pilotului, care nu vedea temperatura de afară.

După ce s-a terminat montarea senzorului, am făcut câteva încercări să mă asigur că totul funcţionează. Am pus contactul, iar apoi am pornit motorul să văd cum se comportă senzorul.

Testare

Înainte de a descrie felul în care am verificat dacă senzorul merge bine, trebuie să menţionez că testele au fost făcute pe senzorul montat pe maşina mea, adică pe cel care are display de nokia 3310.

Am vrut să verific trei părţi ale senzorului

  1. Programul de pe microcontroller
  2. Comportamentul senzorului în situaţii normale
  3. Comportamentul senzorului în situaţii anormale

Programul ce rulează pe microcontroller a fost testat din faza de proiectare, dar am vrut să văd ce se întamplă dacă se sterg datele din memoria EEPROM a microcontroller-ului. Ei bine, în cazul ăsta cifrele nu vor mai fi afişate corect. Ăsta e un indicator foarte bun cum că nu s-a programat şi EEPROM-ul. Nu e obligatoriu ca led-ul roşu să se aprindă.

A urmat apoi testarea senzorului în situaţii anormale. Asta înseamnă, deconectarea senzorului în timpul funcţionării, care ar simula o întrerupere a cablului, sau un scurt la plus. În acest caz pe ecran va apărea valoarea "-88°". Un alt test făcut e acela de a face scurt la masă, caz în care pe ecran se va afişa "-99°".  Ulterior am făcut (fără să vreau) un alt test, în care am pus pe linia de date a senzorului o rezistenţă la masă. În acest caz senzorul va afişa întotdeauna valoarea "0°". În acest caz pot apărea probleme în anotimpul rece, când nu se poate determina dacă problema e cauzată de temperatura de afară sau de un contact rezistiv la masă pe linia de date. Singurul reper ar fi acela că la pornire, senzorul trebuie să afişeze temperatura de "85°". Dacă această temperatură nu apare la pornire după câteva încercări repetate, atunci cu siguranţă e o problemă la cablul ce merge la senzor.

La urmă am testat funcţionarea senzorului în condiţii normale, adică:

  • temperaturi pozitive
  • indicatorul de temperatură sub 4°C
  • iluminarea ecranului
  • temperaturi negative

Verificarea temperaturii pozitive am făcut-o folosid un termometru din comerţ. Pentru măsurarea temperaturilor mai joase m-am folosit de un cub de gheaţă proaspăt scos din congelator. Aici nu am mai verificat cu un alt termometru.

Probleme care pot să apară

Aici o să trec în revisă o parte din posibilele defecţiuni ce pot să apară, şi care ar fi "simptomele":

  1. Cablul pentru senzor e întrerupt - pe ecran apare "-88°"
  2. Cablul pentru senzor face scurt la pluspe ecran apare "-88°"
  3. Cablul pentru senzor face scurt la masă - pe ecran apare "-99°"
  4. Cablul pentru senzor face contact rezistiv la masă - pe ecram apare la pornire "0°" în loc de "85°"
  5. Cablul de date pentru display nu face contact - pe ecran nu apare nimic, sau apar pete aleatoare
  6. Cablul de la led-uri e întrerupt - ecranul nu e luminat deloc sau nu e luminat complet, dar temperatura e afişată
  7. Cablul de alimentare e întrerupt - ecranul nu e luminat şi nu apare nimic pe ecran
  8. Lipsesc datele din EEPROM - pe ecran apar două dreptughiuri negre în loc de cifre

Descrierea funcţionării senzorului

Montajul porneşte în momentul în care se pune cheia în contact. În aproximativ 2-3 secunde este iniţializat display-ul. Imediat după asta, microcontroller-ul va "căuta" senzorul  şi va afişa prima valoarea citită de la senzor (ar trebui să fie întotdeauna "85°"). Dacă îl găseşte, începe să citească temperatura la fiecare 1.5 secunde. Imediat după conectarea senzorului la montaj, acesta trebuie să înceapă să afişeze temperatura, fără a fi nevoie de oprirea şi pornirea montajului. Plaja de valori pe care le poate afişa montajul este -55°C şi 99°C, deoarece am vrut să afişez cifre cât mai mari, iar mai mult de 2 cifre mari şi un minus, nu încap pe afişaj. Pentru mine nu contează dacă afară sunt 1.5 grade, ce contează e dacă afară e 1 grad sau sunt 8 grade. Aşa că am decis să nu afişez valorile subunitare ale temperaturii.

Download

Fişiere Hex (Cod şi EEPROM) se găsesc aici.

Fişierele sursă se găsesc aici.

Algoritmul e prezentat în detaliu aici.