Nume proiect

Thermo T-Shirt

Autori

  • Grandl Liviu-Anton, 331CC
  • Scoică Adrian, 332CC

Introducere

Monitorizarea temperaturii corpului este un proces cu aplicații variate în lumea medicală. Dintre utilizările deja consacrate amintim:

  • Monitorizarea activității musculare prin măsurarea căldurii degajate în condiții de efort
  • Depistarea anomaliilor termice la nivelul pielii, de origine infecțioasă, alergică (flushing) sau inflamatorie (inflamație în jurul unei luxații - Fig. 1)

Figura 1

  • Depistarea anomaliilor contractile ale vaselor de sânge prin monitorizarea evoluției căldurii la suprafață pielii post-efort sau în staționare (simptomele paraliziei cerebrale - Fig. 2)

Figura 2

  • Depistarea distribuției căldurii la intrarea în hipotermie/hipertermie

Printre aplicațiile care se depărtează puțin de sfera medicală se numără:

  • monitorizarea temperaturii la suprafața corpului pentru a determina necesarul de îmbrăcăminte izolatoare în condiții de mediu nefavorabile (îmbrăcăminte de schi/scufundări) (exemplu de informații relevante - Fig. 3)

Figura 3

  • monitorizarea temperaturii corporale pentru a determina corelația între reacțiile emoționale și cele fiziologice (de exemplu, frica duce la scăderea temperaturii periferice)

Descriere generală

Proiectul nostru constă în realizarea unui dispozitiv utilitar care să poată fi folosit pentru a monitoriza temperatura locală la suprafața pielii pentru o persoană, în timp. Exista două moduri de monitorizare:

  • Temperatura instantanee
  • Temperatura medie

Proiectul dezvoltat prezintă următoarea interfață de utilizare:

  • Un număr de senzori de temperatură, care se vor aplica direct pe piele în punctele în care se dorește monitorizarea temperaturii. Senzorii sunt conectați prin intermediul unor fire flexibile care la capătul opus se termină cu niște conectori care se introduc în pinii de pe plăcuță.
  • Un modul de Ethernet, prin care plăcuța va putea face streaming la rezultate în timp real prin intermediul cererilor HTTP.
  • Un viewer portabil scris în Java care se poate conecta la plăcuță, poate prelua rezultatele și le poate suprapune peste un model grafic spre a fi analizate vizual sau le poate salva într-un log spre a fi prelucrate de altă aplicație.

Schema bloc

Hardware Design

Schema generală

Extensii

Plăcuța principală conține următoarele extensii:

  • placa de extensie Ethernet ce are următoarele componente:
  • senzori de temperatura conecati prin fire
Modul Ethernet

Componentele de bază ale plăcuței sunt:

  • controller Ethernet ENC28j60 (datasheet). Acesta comunică cu microcontroller-ul prin intermediul interfeței SPI.
  • jack de tip MagJack (datasheet)
  • stabilizator tensiune TS1086 (datasheet)

Lista pieselor folosite:

Cantitate Denumire
1ENC28J60
1crystal 25 MHz
5R47
3R270
1R2K7
2R10K
1R240
2C18pF
1C10uF
2C10nF
2C100nF
1TS1086
1soclu
1placă de test
Modul Senzori

Senzorii folositi sunt DS18B20, senzori de temperatură digitali. Senzorii sunt conectati între ei și totodată cu ATMega 16. (datasheet)

Lista pieselor folosite:

Cantitate Denumire
6DS18B20
6R4K7

Software Design

Viewer-ul

Compilator: javac 1.6.0_06

Mediu de dezvoltare: Eclipse Galileo 3.5

Viewer-ul este scris în Java peste SWING, și se folosește de API-ul nativ Java pentru a lansa conexiuni HTTP. Interfața cu utilizatorul se poate observa în imaginea de mai jos:

Din interfață se pot realiza următoarele operații:

  1. Se poate alege, înainte de începerea eșantionării de date de la plăcuța conectată in rețea, care senzori să fie monitorizați. Nu este necesar să se folosească toți senzorii la o sesiune de monitorizare. Pentru o mai bună vizualizare a datelor, utilizatorul poate alege să amplaseze grafic punctele de măsură folosindu-se de un model uman.
  2. Se poate specifica adresa IP a plăcuței. Aceasta va implementa un server Web care va răspunde la cereri HTTP prin comunicarea temperaturilor.
  3. Se poate comuta în orice moment (chiar și în timpul monitorizării) între monitorizarea temperaturilor instantanee sau a temperaturilor medii dintre eșantionări (temperaturile instantanee pot avea fluctuații irelevante pentru o serie de aplicații, dar cele medii pot ascunde detalii importante la alte aplicații)
  4. Se poate salva log-ul tuturor monitorizărilor dintr-o sesiune pentru a putea permite prelucrări statistice ulterioare (în format text). Fiecare eșantionare este prefixată în log de ora, minutul și secunda la care au fost făcute măsurătorile.

Codul de pe microcontroller

Compilator: avr-gcc

Mediu de dezvoltare: Notepad++

Codul programat pe microcontroller se compune din două module logice importante:

  1. Implementarea serverului WEB, construită cu ajutorul scheletului de cod al laboratorului 5.
  2. Implementarea folosind întreruper a codului care citește datele de la senzorii de temperatură.

1. Codul pentru serverul web va crea ca raspuns la cererile HTTP o pagina cu sintaxa celei asteptate de Viewer:

uint16_t print_webpage(uint8_t *buf, uint8_t on_off)
{
        char buffer[30];
        uint16_t plen;
		page=0;
        plen = fill_tcp_data_p(buf, 0, PSTR("HTTP/1.0 200 OK\r\nContent-Type: text/html\r\n\r\n"));
        
        plen = fill_tcp_data_p(buf, plen, PSTR("<HTML><BODY bgcolor=LightCyan>\n"));
	sprintf(buf, "%2d %2d %2d %2d %2d %2d\n", temp[0], temp[1], temp[2], temp[3], temp[4], temp[5]);
	plen = fill_tcp_data(buf, plen, buffer);
        plen = fill_tcp_data_p(buf, plen, PSTR("</BODY>\n</HTML>\n"));

        return plen;
}

2. Codul pentru citirea senzorilor se foloseste de biblioteca implementata in “ds18x20lib.h”:

//-----------------------------------------
// Stabilim porturile folosite de biblioteca
//-----------------------------------------
#define DS1820_PIN	PINA                   //DS1820 PIN
#define DS1820_PORT	PORTA                  //DS1820 PORT
#define DS1820_DDR	DDRA                   //DS1820 DDR
//-----------------------------------------
// Headerele functiilor folosite in biblioteca
//-----------------------------------------
uint8_t ds1820_reset(uint8_t);
void ds1820_wr_bit(uint8_t,uint8_t);
uint8_t ds1820_re_bit(uint8_t);
uint8_t ds1820_re_byte(uint8_t);
void ds1820_wr_byte(uint8_t,uint8_t);
float ds1820_read_temp(uint8_t);
uint8_t  ds1820_init(uint8_t);

3. Codul care fare “refresh la temperaturi sta intr-o intrerupere care se executa periodic (pe timer-ul 2 al lui atmega16):

// Output compare interrupt handler for timer2.
SIGNAL(SIG_OUTPUT_COMPARE2)
{
        // Update-eaza temperaturile periodic cu ceea ce citeste de la senzori
	sprintf(buf, "%d %d %d %d %d %d\n", temp[0], temp[1], temp[2], temp[3], temp[4], temp[5]);
	temp[0] =  ds1820_read_temp(PA1);
	temp[1] =  ds1820_read_temp(PA2);
	temp[2] =  ds1820_read_temp(PA3);
	temp[3] =  ds1820_read_temp(PA4);
	temp[4] =  ds1820_read_temp(PA5);
	temp[5] =  ds1820_read_temp(PA6);
	// Decomenteaza linia de mai jos pentru debugging pe seriala:
	// printf("Has read temperatures: %d %d %d %d %d %d\n", temp[0], temp[1], temp[2], temp[3], temp[4], temp[5]);
}

4. Cea mai mare parte din debugging a avut loc pe portul serial. Codul pentru initializarea serialei este:

	// Initializeaza seriala si ataseaza stdin si stdout
	USART_init();
	stdin = &mystdin;
	stdout = &mystdout;
	// Fa un prim test de functionalitate:
	printf("Serial Initialized\n");

Pentru sursele complete si alte detalii de implementare, downloadati arhiva de la sectiunea de Downloads.

Jurnal

  • Ziua I (shopping): Am fost la 4 magazine, am întrebat și ne-am informat despre senzorii și interconectorii disponibili în stoc. Nu am găsit inițial ceea ce ne doream. Am plecat acasă să ne cântărim opțiunile și să medităm.
  • Ziua II (shopping): Înarmați cu un plan B, am plecat din nou dis de dimineață să cumpărăm componente. Am găsit controllerul de Ethernet abia la ultimul magazin de pe listă. Ne-am întors din drum de două ori pentru ca am realizat că am uitat să cumpărăm senzorii și apoi soclul. N-am găsit pastilă de cuarț de 25MHz. Am decis să revenim la o dată ulterioară. Ne-a venit ideea să cumpărăm conectori mamă pentru atașarea senzorilor (pentru a nu fi nevoie să îi lipim permanent pe plăcuță, având fire lungi și care altfel s-ar fi smuls ușor.
  • Ziua III (shopping): Am reușit să găsim și pastila de cuarț la frecvența corectă.
  • Ziua IV (scheme și lipit): Am început să lucrăm la plăcuță. Am avut probleme cu conectorul RJ45, am dat peste scheme conflictuale de conectare și nu găsim nicărieri o hartă a pinilor relevantă. Am decis să urmărim exemplul de pe wiki.
  • Ziua V (lipit și implementat): Continuă lipitul, și începe lucrul și la Viewer în același timp (care până după masă ajunge la 500 de linii și ne decidem că este deja suficient de complicat). Continuăm în forță toată noaptea cu lipitul, ca să nu ne oprim tocmai acum.
  • Ziua VI (debugging, lipit în continuare și documentație): Probleme la plăcuță (nu avem contact între două puncte). Debugging toată dimineața. După câteva ore ne decidem să luăm toate lipiturile la rând. Găsim vinovatul (o lipitură rece) în cele din urmă. Decidem să începem să scriem documentația în paralel cu lipitul.
  • Ziua VII (mergem la laborator sa cerem ajutorul cu Ethernet-ul): Am inlocuit condensatorii de 15pF inițiali cu alții de 18. In acelasi timp, am realizat cablurile pentru conectarea de senzori si am pus senzori. Ne-am dat seama ca plăcuța de ethernet nu merge cel mai probabil din cauza conectorului (no-name)
  • Ziua VII (noaptea, inapoi acasa): Am refacut lipiturile după alta schemă. Din noua schema nu sunt specificate o parte dintre conexiuni. Am incercat cinci sau sase permtuari de fire pana cand au functinoat link-ul si led-ul de activitate corect. Intre timp am scris codul pentru senzori, practic partea de programare este gata. Din pacate, tot nu merge ping-ul.
  • Ziua VIII (inapoi la laborator, ca sa cautam cablu serial): Încărcarea codului peste controller. Plăcuța primește pachete dar nu răspunde. Interpreteaza corect IP-urile din headerele pachetelor primite. Adaugam in cod suport pentru seriala si facem debugging pe portul serial. Facem hexdump pe pachete si dam seama ca identifica gresit codul pachetului (ICMP ar fi trebuit sa fie 1, dar el citeste 17 din pachet). Ne gandim ca poate am ars controllerul Ethernet, schimbam cu un controller de la altcineva care avea proiect cu Ethernet. In continuare nu merge. Printam temperaturile pe seriala, functioneaza aproape OK (trei dintre senzori afiseaza prostii, prbabil ca i-am incalzit prea tare la un moment dat, dar de altfel citirea se face corect). Singura problema acum este Ethernet-ul si nu stim ce sa ii mai facem: din moment ce citeste IP-ul corect… teoretic merge. Nu intelegem de ce nu interpreteaza restul de pachet OK.

Rezultate Obţinute

Modulul Ethernet:

  • front:

  • back:

  • another side:

Modul temperatura:

Montajul Ethernet - ATMega 16

Montajul Ethernet-ATmega 16 - Senzori:

Concluzii

Prin conectarea controller-ului ENC28J60 cu ATMega16 se ușurează comunicarea unui calculator senzorii. Astfel, datele primite de la senzori pot fi afișate într-o pagină web, sau trimite comenzi sistemului pentru a schimba anumiți parametri. În cazul nostru, ele sunt folosite pentru a trimite viewer-ului care afișează real-time temperatura primită per senzor.

Problemele cele mai mari au fost de la mufa de conector (căreia i-am găsit foarte greu datasheet-ul și cel existent nu este foarte clar).

Senzorii de temperatura se pot strica foarte usor daca se supraincalzesc, dupa care incep sa dea temperaturi gresite. Am stricat in acest mod trei dintre senzori (doi dintre ei citesc aproape mereu 0, iar al treilea citeste temperaturi negative).

Bugurile probabil sunt de la senzori. Pentru că este un proiect foarte interesant o sa-l finisam pana cand totul va merge corect.

Later edit:

Major breakthrough: am reusit sa scoatem masuratorile din placuta. Am constatat ca probabil ca am ars o parte din senzori, pentru ca dau masuratori aleatorii (Senzorul 3 si 4 din figura de mai sus). Senzorul 0 a fost lasat liber in aer la temperatura camerei (oscila între 22 și 23 de grade, sau 23 și 24, ceea ce verifica precizia de 0.5 grade Celsius menționată în datasheet), iar senzorul 2 a fost incalzit cu mâna și a urcat încet-încet până la 28 grade, unde a staționat.

A fost un drum lung, și pe alocuri am avut senzația că am aruncat bani mulți pe componente care nu merg, dar în final a fost OK.

Download

Bibliografie/Resurse

pm/prj2011/dtudose/thermoshirt.txt · Last modified: 2021/04/14 17:07 (external edit)
CC Attribution-Share Alike 3.0 Unported
www.chimeric.de Valid CSS Driven by DokuWiki do yourself a favour and use a real browser - get firefox!! Recent changes RSS feed Valid XHTML 1.0