Dans le cadre de notre formation L3 EEA (lectrotechnique lectronique automatique), il nous a t demand de concevoir et raliser un systme pluridisciplinaire de notre choix partir dun cahier des charges. Un projet o il faut organiser son travail, et tre capable de le prsenter par crit (rapport) et oralement. Lobjectif principal de ce travail est de faire le lien entre lensemble des enseignements disciplinaire et de valider notre autonomie. Dans ce rapport nous prsenterons notre projet, une station mto autonome conue et programme par nos soins. Nous dtaillerons chaque fonction de la station avec, dans chaque partie son schma, son programme associ et lexplication des points importants. Nous finirons par une conclusion, qui rappellerons les grandes lignes de notre projet, les connaissances et les acquis apport par ce module ainsi que le ressenti et notre avis suite au projet.
III.
Le projet dune station mto autonome est constitu de plusieurs objectifs clairs et bien prcis, qui nous ont permis de progresser par tape : Mettre en uvre un capteur dhumidit (liaison analogique). Conception et mise en uvre dun anmomtre (Mesure dune frquence convertie en vitesse (m/s)) Mettre en uvre deux capteurs de temprature numriques (DS1621) mesurant la temprature intrieure et extrieure (la liaison avec le capteur de temprature se fera directement sur le PC). Affichage des donnes sur un cran LCD. Une liaison sans fil type Xbee pour envoyer les donnes aux PC. Affichage des donnes sur un cran PC sous labview.
On remarquera que chaque capteur utilise une technologie diffrente, ce qui en fait un projet polyvalent.
IV.
Pour plus de comprhension, nous avons commenc, partir du cahier des charges, le synoptique complet de la station mto. On y trouve tous les lments cits prcdemment dans le cahier des charges.
Microcontrleur
Capteur de temprature extrieure
Emetteur ZigBee
PIC16F876
Rcepteur ZigBee
PC
V.
Le microcontrleur
A. Choix du microcontrleur
Comme on peut voir prcdemment que le microcontrleur choisi, est un PIC16F876 (cf. figure 1) celui-ci nous as t conseill par notre quipe pdagogique. Nous avons quand mme pris soin de vrifier globalement si le nombre dentre et de sortie taient suffisants pour le nombre dlments utiliss, en survolant pour chacun dentre eux leur datasheet.
Nayant jamais programm sur un microcontrleur, notre quipe pdagogique nous a conseill de commencer par nous familiariser avec le PIC laide dun mini TP. Ce TP dinitiation propos par le logiciel Mikroelektronika, marque du logiciel utilis pour programmer le PIC (MikroC), consiste faire clignoter une LED. Pour le quartz, qui dfinit la frquence dhorloge, on nous a donn un 20Mhz. Pour choisir les condensateurs, nous avons regard dans la datasheet du quartz :
Au vue de cette datasheet nous avons pris des condensateurs de 22pF car ils taient notre disposition.
C.
Nous avons donc commenc par implanter les composants et les cbler entre eux sur la platine quon nous a fourni. Comme vous pouvez le voir sur la figure 2, le schma de la partie LED tabli sur le logiciel Proteus ISIS 7.8. Cest ce Logiciel qui nous a permis tout au long du projet de faire les schmas et les simulations.
On peut voir sur le schma de la figure 2 quil ya un bornier brancher sur les bornes RB6, RB7 et Vpp. Il reprsente en fait le cble USB qui va au PC. Ce cble nous permet de transfrer le programme. Par la suite nous ne le reprsenterons plus, de mme pour chaque partie nous reprsenterons que les capteurs en question. Ceci pour un souci de clart.
Nous avons ensuite laide du TP et du logiciel MikroC, programm le microcontrleur pour faire clignoter une LED. Une initiation qui nous a permis de comprendre un peu mieux le fonctionnement de celui-ci notamment au niveau des dclarations des bornes. Voici le programme tablit avec a description :
void main() { PORTC=0; //Initialisation du port C PORTB=0; //Initialisation du port B TRISC=0; TRISB=0; //Le port C affect en sortie //Le port B affect en sortie
VI.
Lcran LCD
Ensuite nous sommes rentr dans le vif du sujet, nous avons install, programm lcran LCD et essay dafficher des caractres dessus. Nous avons aussi rajout un bouton poussoir en vue de prparer le terrain pour la suite du projet.
A.
B.
Voici un petit exemple de programme qui utilise la fois le bouton poussoir et qui affiche du texte sur lcran LCD :
void main() { int cond=0, BP=0; /******************Initialisation et affectation des ports**************************/ PORTB=0; PORTA=0; TRISB=0; TRISA = 0xFF; ADCON1 = 0x84; //Initialisation du port B //Initialisation du port A //Le port B affect en sortie //Port A en entre //RA2 en entre
/******************Configuration et initialisation de l'cran LCD*******************/ Lcd_Config(&PORTB, 0, 1, WR, 5, 4, 3, 2); Lcd_Init(&PORTB); Lcd_Cmd(Lcd_CURSOR_OFF); Lcd_Cmd(Lcd_CLEAR); //Configure l'cran //initialisation du LCD //Enlve le curseur //Efface l'cran
/**********************Boucle infini*****************************************/ while(1) {cond=cond+1; switch(BP) {case 0: if(PORTA.F2==1) {BP=1; Delay_ms(250); } if(cond==1000) {Lcd_Cmd(Lcd_CLEAR); Lcd_Out(1, 1, "Bonjour..."); } break; case 1: if(PORTA.F2==1) {BP=0; Delay_ms(250); } if(cond==1000) {Lcd_Cmd(Lcd_CLEAR); Lcd_Out(1, 1, "Mme Leymarie !"); } break ; } } }
Les fonctions de lcran LCD sont expliques dans laide du logiciel MikroC. La variable cond est une condition pour ne pas afficher le mot chaque boucle mais tous les 1000 itrations ce qui permet de ne pas faire clignoter lcran. ADCON1 sera expliqu la suite de ce rapport.
A.
Voici les proprits importantes du capteur donne par la notice : Gamme d'humidit : 0% 100% RH (Relative Humidity) avec une Prcision de 3.5% RH Gamme de tension d'alimentation : 4V 5.8V Temprature de fonctionnement : -40C +85C (-40 F to 185 F) Courant, alimentation : 500A Sortie Analogique
Nous avons ensuite dcid de la retracer sur Excel et den tirer lquation qui sera utilis dans le programme du microcontrleur.
On voit quExcel nous donne lquation suivante : U=0.031*H +0.81 Donc H= (U-0.81)/0.031 De plus nous multiplierons par 1000 la valeur de H pour pouvoir rcuprer les chiffres dcimales, et les rentrer dans une chaine de caractres et les afficher sur lcran LCD : H= (U*810)/0.031 La valeur maximum de H est donc de 100 000 nous la dclarerons donc en long (une dclaration en int ne serais pas suffisant : -32768 32767).
B.
Configuration du microcontrleur
Maintenant nous arrivons point important de cette partie celle de la configuration des ports du microcontrleur. En effet le PIC16F876 est constitu dun module convertisseur 5 entres. Ces entres sont situes sur les bornes RA0 RA1 RA2 RA3 et RA5 (cf. figure1). Le rsultat de la conversion est cod sur 10 bits. Cest une valeur comprise entre h000 et h3FF : h3FF = b1 1111 1111 = d1023 Pour mesurer la tension il faut la convertir dans la structure du programme en sachant que la valeur est comprise entre 0 et 1023 et que la tension maximum est de 5V. On en tire cette quation : U = (Valeur lue sur le CAN * 5)/1023 Pour les mme raison que lquation du capteur dhumidit nous avons multipli par 1000 la tension nous obtenons donc : U= (Valeur lue sur le CAN * 5000)/1023 Il faut ensuite rgler les entres analogiques avec les registres ADCON0 et ADCON1 en sachant que nous avons dcid de brancher le capteur sur la bornes RA0 :
Bit 7 et bit 6 : ADSC1 et ADSC0 = Clock Select bits. Ces 2 bits permettent de choisir la vitesse de conversion : 00= Fosc (Frquence doscillation)/2. 01= Fosc/8. 10= Fosc/32. 11= Oscillateur RC interne. Pour que la conversion soit correct il faut que T(ad) soit au minimum de 1.6s. nous disposons dun quartz de 20Mhz => 20Mhz/32 => 1.6s. Nous mettrons donc le bit 7 1 et le 6 0. Bit 5 bit4 et bit 3 : CHS2 CHS1 et CHS0 = Channel Select bits. Ces 3 bits permettent de choisir l'entre qui va tre convertie.
Bit 7 : ADFM = A/D Result format. 1 = Justifi droite. 0 = Justifi gauche. Nous avons justifi droite. Bit 6 bit 5 et bit 4 : Bits non implments. Bit 3 bit 2 bit 1 et bit 0 : PCFG3 PCFG2 PCFG1 et PCFG0 Bits de contrle de la configuration des Ports. Ces bits permettent de choisir le partage entre entres analogiques et digitales sur les PORTS A et E. On a choisi dactiver RA0, RA1 et RA3 en entre analogique les autres resteront en digitales, ce qui signifie quau vue de la datasheet, il faut mettre le bit 2 1 et les autres 0. ADCON1 = b10000100 = h84
10
Voici le schma de cblage du capteur dhumidit uniquement. A noter que le capteur est remplac par un potentiomtre ntant pas dans la librairie de Proteus. On constate quil est bien branch sur RA0.
D.
Voici le programme pour mesurer lhumidit, avec les affectations dcrites ci-dessus ainsi que les quations de conversions :
/******************Dclaration des fonctions****************************************/ void humidite(int *cond); void lcd(int li, int co, int nb, char receive[11]); /******************************************************************************/ void main() { /*****************************dclaration des variables*****************************/ int cond=0; //Condition pour l'affichage sur l'cran LCD /******************Initialisation et affectation des ports******************************/ PORTB=0; //initialisation TRISB=0; //Port B dclarer en sortie TRISA = 0xFF; //Port A en entre ADCON1 = 0x84; //Justifi droite active RA0/RA1/RA3 analogique ADCON0 = 0x85; //Fosc/32 sur PA0 en service /******************Configuration et initialisation de l'cran LCD***********************/ Lcd_Config(&PORTB, 0, 1, WR, 5, 4, 3, 2); //Configure l'cran Lcd_Init(&PORTB); //initialisation du LCD Lcd_Cmd(Lcd_CURSOR_OFF); //Enlve le curseur Lcd_Cmd(Lcd_CLEAR); //Efface l'cran
11
//Valeur des centaines affect en ascii(48=0) //Valeur des dizaines affect en ascii //Valeur des units affect en ascii
//Valeur de la premire dcimale affect en ascii //Valeur de la deuxime dcimale affect en ascii //Pourcentage affect en ascii
//Affiche la chaine de caractre humtxt sur le LCD //Affiche la chaine de caractre hum sur le LCD //Remise a 0 de la condition
} /*******************************Fonction affichage***********************************/ void lcd(int li, int co, int nb, char receive[11]) { int i; for(i=0; i<=nb ; i++)//Boucle for { Lcd_chr(li, (co+i), receive[i]); } }
On remarque que pour lire la valeur on utilise la fonction Adc_Read(n de la borne relever).
12
A.
Le protocole I2C
Le bus I2C (Inter Integrated Circuit) a t dvelopp au dbut des annes 80 par Philips semiconductors, pour permettre de relier facilement un microprocesseur les diffrents circuits d'un tlviseur moderne. Le bus I2C permet de faire communiquer entre eux des composants lectroniques trs divers, grce seulement trois fils : Un signal de donne (SDA), un signal d'horloge (SCL), et un signal de rfrence lectrique (Masse) Ceci permet de raliser des quipements ayant des fonctionnalits trs puissantes (En apportant toute la puissance des systmes micro programms) et conservant un circuit imprim trs simple, par rapport un schma classique (8bits de donnes, 16 bits d'adresse + les bits de contrle). Les donnes sont transmises en srie 100Kbits/s en mode standard et jusqu' 400Kbits/s en mode rapide. Ce qui ouvre la porte de cette technologie toutes les applications o la vitesse n'est pas primordiale. Voici un exemple de protocole quutilise le bus I2C :
1. 2. 3. 4. 5. 6. 7. 8. 9.
Pour initier le dialogue, le matre cre une condition Start Le matre envoie l'adresse de l'esclave (1010100) suivi du bit 0 (bit Write) L'esclave rpond (accus de rception : bit Acknowledge) Le matre envoie l'adresse du registre (0x04) crire L'esclave rpond (accus de rception : bit Acknowledge) Le matre envoie la donne (0x27) crire L'esclave crit la donne puis envoie un accus de rception (bit Acknowledge) Le matre termine le dialogue avec une condition Stop Le bus I2C est maintenant libre (SCL = 1, SDA = 1 : niveaux de repos).
13
Comme on peut voir sur la figure 9 le capteur est compos de 8 bornes : SDA => Liaison srie entre sortie. SCL => Signal dhorloge Tout => Signal de sortie du thermostat (inutile dans notre cas) GND => Masse VDD => Alimentation +5V A0, A1, A2 => Entre dadressage (dans notre cas les 3 la masse car nous navons quun module I2C)
Les circuits connects sur un bus I2C ont des sorties de type drain ouvert (ou collecteur ouvert). Deux rsistances de pull-up sont bien sr places entre les lignes SDA, SCL et l'alimentation (VDD).Quand le bus n'est pas utilis, SDA et SCL sont au niveau haut (niveau de repos). 1. Spcificit des commandes
Tous dialogue du matre(PIC16F876) avec un DS1621 esclave doit dbuter par lenvoi dun mot de contrle :
Le matre envoi ensuite une commande, suivi ou non de donnes. Voici la liste des commandes avec leur description :
Les commandes AC, EE et 22 ne sont pas suivies de l'envoi de donnes. Par contre la commande AA qui nous intresse est suivie de lenvoi par le DS1621 de 2 octets reprsentant la temprature.
14
DONE : "1" = conversion finie. "0" = conversion en cours. En mode 1 SHOT uniquement. THF : Flag seuil haut du thermostat. Passe "1" et y reste si temprature suprieure TH. TLF : Flag seuil bas du thermostat. Passe "1" et y reste si temprature infrieure TL. NVB : "1" = mmoire EEPROM en criture. "0" = mmoire EEPROM criture termine. Nous nactiverons pas lcriture de la mmoire. POL : Polarit de Tout (pin 3). "1" = actif sera un niveau HAUT. "0" = actif sera un niveau BAS. Il faut activer la polarit donc nous le mettons 1. ONE SHOT : "0" = conversion en continu. "1" = conversion 1 fois. Nous le mettons en mode continu. AC = b00001010 = h0A
La commande AA qui permet de lire la temprature renvoie 2 octets : MSB (Most Significant Bit) : Nombre sign donnant la temprature entre +125 et -55C. LSB (Least Significant Bit ) : Seul le bit 7 de cet octet est significatif. Si "1" temprature MSB +0,5C.
Pour bien comprendre comment est cod un nombre sign, un tableau avec des exemples de valeurs tait notre disposition dans la notice :
15
Voici un schma qui montre le dialogue effectuer entre le microcontrleur et le capteur pour avoir la temprature. Cest grce ce mme schma que nous avons pu programmer le PIC :
16
Voici le schma du capteur de temprature uniquement. Le capteur est branch sur les borne SCL(RC3) et SDA(RC4) du PIC; Quelles soient dclares en entre ou en sortie les bornes SCL et SDA sont fonctionnelles. Il ne faut pas oublier les rsistances de tirages (R1 et R3). Ladressage A0 A1 A2 toutes misent la masse car nous navons quun seul capteur I2C reli au PIC et le Tout (thermostat) inutile car nous faisons juste un relev de temprature :
D.
/******************Dclaration des fonctions********************************************/ void temperature(int *cond); void lcd(int li, int co, int nb, char receive[14]); /***********************************************************************************/ void main() { /*****************************dclaration des variables*********************************/ int cond=0;//Condition pour l'affichage sur l'cran LCD /******************Initialisation et affectation des ports***********************************/ PORTB=0; //initialisation PORTC=0; TRISB=0; //Port B dclarer en sortie TRISC = 0xFF; //Port C en entre /******************Configuration et initialisation de l'cran LCD****************************/ Lcd_Config(&PORTB, 0, 1, WR, 5, 4, 3, 2); //Configure l'cran Lcd_Init(&PORTB); //initialisation du LCD Lcd_Cmd(Lcd_CURSOR_OFF); //Enlve le curseur Lcd_Cmd(Lcd_CLEAR); //Efface l'cran /******************Initialisation du module I2C******************************************/ I2C_Init(100000); //initialisation de la communication I2C I2C_Start(); //Dtermine si l'I2C est libre et lance le signal I2C_Wr(0x90); //Mode de contrle en mode criture I2C_Wr(0xAC); //Accs au registre de configuration I2C_Wr(0x0A); //Registre de configuration mesure en continu I2C_Stop(); //Arrt du signal I2C_Start(); I2C_Wr(0x90); //Dtermine si l'I2C est libre et lance le signal //Mode de contrle en mode criture
17
/*****************************Boucle infinie****************************************/ while(1) { cond=cond+1; //Incrmente la variable cond temperature(&cond); //Appel la fonction humidit } } /****************************Fonction temprature***********************************/ void temperature(int *cond) { char temp[7], temptxt[]="Temperature :", LSB; signed char MSB; I2C_Start(); I2C_Wr(0x90); I2C_Wr(0xAA); I2C_Stop(); I2C_Start(); I2C_Wr(0x91); MSB = I2C_Rd(1); LSB = I2C_Rd(0); I2C_Stop(); if(MSB<0) { MSB = abs(MSB); Temp[0]=45; } else { Temp[0]=43; } Temp[1]=(MSB/10)+48; Temp[2]=(MSB%10)+48 ; Temp[3]=44 ; if (LSB==128) { Temp[4]='5'; } Else { Temp[4]='0'; } Temp[5]=223; Temp[6]=67; if(*cond==10) { lcd(1, 1, 13, temptxt); lcd(2, 1, 6, temp); *cond=0; } //Dtermine si l'I2C est libre et lance le signal //Mode de contrle en mode criture //Lecture de la temprature //Arrt du signal //Dtermine si l'I2C est libre et lance le signal //Mode de contrle en mode lecture //Nombre sign donnant la temprature entre +125 et -55C //Si bit 7 = 1 temprature MSB +0,5C //Arrt du signal
//signe + affect en ascii //Valeur des dizaines affect en ascii //Valeur des units affect en ascii //Virgule affect en ascii //Si bit 7 1 alors +0.5
// degr affect en ascii //C affect en ascii //Appel la fonction LCD tous les 1000 //Affiche la chaine de caractre humtxt sur le LCD //Affiche la chaine de caractre hum sur le LCD //Remise a 0 de la condition
} /*******************************Fonction affichage***********************************/ void lcd(int li, int co, int nb, char receive[14]) { int i; for(i=0; i<=nb ; i++)//Boucle for { Lcd_chr(li, (co+i), receive[i]); //Affiche les caractres jusqu' i } }
Le schma prcdent est bien respect, comme on peut le voir cest trs facile programmer grce aux librairies I2C du logiciel MikroC.
18
Pour lanmomtre, lquipe pdagogique nous a juste fourni lhlice du capteur donc il a fallu concevoir toute la partie lectronique. Lide est dinstaller une diode et un transistor photonique par de l lhlice et lorsquelle tourne elle vient couper le faisceau. Succinctement le transistor envoit soit 1 soit 0 sur le PIC. Le but est de relever la frquence laquelle tourne lhlice puis la convertir en vitesse (cf. figure 11).
La photodiode choisie est de rfrence SD5455-3. Ce choix a t fait car langle du faisceau est de 20, pour que le flux infrarouge soit bien concentr sur le phototransistor, pour un fonctionnement optimal. Comme on le voit sur le schma de principe (cf. figure 11), il a fallu dimensionner la rsistance qui sert rguler le courant qui circule dans la LED, avec les informations donnes par la documentation technique, nous avons pu la calculer. Forward voltage : VF = 1.7V et IF = 0.1A Ualim = 5V RD = (Ualim UF)/IF = (5 1.7)/0.1 RD = 33
Pour le phototransistor, nous avons choisi celui qui allait avec la diode de rfrence SE5455-3. Cette fois la valeur de la rsistance nous tait donn par le constructeur. RL=1000 Lors des sances nous avons implant la diode et le transistor sur le support du capteur. Pour des raisons pratiques et esthtiques nous avons spar la partie anmomtre et la partie platine par des borniers (cf. figure 12).
19
Le but est de relever la priode du signal envoyer par lanmomtre, pour cela le PIC est quip dun mode capture. Le principe est de recopier un moment voulu la valeur du timer 1. La capture peut avoir lieux chaque front descendant, chaque front montant, tous les 4 ou tous les 16 fronts montants. Quand la capture a eu lieu, un flag est mis "1". Il suffit ensuite de relever la valeur et la transformer en vitesse. Dans un premier temps il nous faut configurer le timer 1 : Le timer 1 est un compteur sur 16 bits constitu de 2 registres de 8 bits TMR1H et TMR1L, que l'on peut lire ou crire. Le registre TMR1 (constitu de TMR1H et TMR1L) s'incrmente de h'0000' jusqu' h'FFFF' et repasse ensuite h'0000' pour continuer le comptage. Quand il y a dbordement, une interruption peut tre gnre si on la autorise par TMR1IE =1 (bit 0 de PIE1) et le Flag TMR1IF (bit 0 de PIR1) passe "1". Le contrle du timer 1 ce fait par le registre T1CON.
Bit 7 et bit 6 : bits non implments. Bit 5 et bit 4 : T1CKPS = Slection du pr diviseur plac avant le TIMER. Vu quon a un quartz lev nous avons dcid de choisir un pr-diviseur de 8, donc F=Fosc/(4*8). Pour cela mettre les bit 4 et 5 1. Bit 3 : T1OSCEN : Bit d'autorisation de l'oscillateur du Timer 1. 1 = oscillateur autoris 0 = oscillateur stopp. Oscillateur interne inutile donc bit 3 0. Bit 2 : T1SYNC : Bit de contrle de la synchronisation du CLK externe. 1 = Pas de synchronisation de l'horloge externe. 0 = Synchronisation de l'horloge externe. Nous nous mettrons en mode synchrone. Bit1 : TMR1CS : Bit de slection de la source horloge. 1 = Mode Compteur: Clk externe sur la broche PC0 ou Quartz entre PC0 et PC1 0 = Mode Timer: Clk interne = Fosc/4.
20
Il nous faut ensuite activer le mode capture, pour cela il faut utiliser le module CCP1 qui sert aussi pour le mode compare et PWM. Pour configurer ce module il faut paramtrer le registre CCP1CON.
Bit 7 et Bit 6 : bits non implments. Bit 5 et Bit 4 : CCP1X et CCP1Y : Bits non utiliss en modes Compare et Capture. Ce sont les 2 bits LSB pour le Duty cycle en mode PWM. Les 8 bits MSB sont dans le registre CCPR1L. Bit a 0 car on ne les utilise pas en mode capture. Bit 3 Bit 0 : CCP1M3 CCP1M0 : bits de slection du mode. Nous avons slectionn le mode capture sur chaque front montant. Pour cela nous avons mis les bits 1 et 3 0 et les bits 0 et 2 1. Pour savoir si un front montant eu lieu, le flag CCP1F est mis 1. Ce flag doit tre remis 0 par lutilisateur. La valeur des 16 bits des registres du Timer 1, TMR1L (bit de poids faible) et TMR1H (bit de poids fort) sont recopies dans les registres CCPR1, CCPRIH (bit de poids faible) et CCPR1L (bit de poids fort). Nous avons programm le mode capture de faon afficher sur lcran LCD la valeur du registre CCPR1, cest--dire la priode du signal de lanmomtre. Il ne nous reste maintenant plus qu talonner notre anmomtre.
21
Pour talonner le capteur nous avons commenc par savoir quelle frquence correspond la valeur releve par le mode capture. Pour cela nous avons branch un GBF la place du capteur et avec un oscilloscope, nous avons compar leurs valeurs :
Nous avons ensuite trac laide des valeurs du tableau, la courbe F(Hz) en fonction du compteur. De cette courbe nous relevons lquation :
Puis, nous avons branch notre anmomtre sur le microcontrleur. Cela dans le but de relever sa priode sur lcran LCD, laide dune soufflerie variable et du manomtre GDH (rf : 121552 200-13), nous avons compar leurs valeurs pour connaitre ltalonnage de notre capteur. Nous avons not plusieurs valeurs puis trac diffrentes courbe pour trouver les quations qui nous permettrons de calculer la vitesse dans notre programme.
22
De cette courbe nous obtenons lquation : Vitesse du vent = 0.179*F + 0.629 Nous les multiplierons par 100 pour rcuprer les dcimales et les implanter dans une chaine de caractre : Vitesse du vent = 17.9*F + 62.9 Nous avons prsent, notre disposition toutes les quations, ncessaires pour pouvoir convertir la valeur releve par le mode capture en une vitesse.
D.
On voit sur le schma que le capteur est bien reli sur la borne RC2. Nous avons aussi reprsent les borniers J1 et J2. A droite tous ce qui est sur le support et gauche tous ce qui est sur la platine.
23
Voici le programme pour mesurer la vitesse du vent, avec les affectations dcrites ci-dessus ainsi que les quations de conversions :
/******************Dclaration des fonctions****************************************/ void vent(int *cond); void lcd(int li, int co, int nb, char receive[20]); /*******************************************************************************/ void main() { /*****************************dclaration des variables*****************************/ int cond=0; /******************Initialisation et affectation des ports******************************/ PORTB=0; //initialisation PORTC=0; //initialisation TRISC=0x04; //Port C dclarer en sortie sauf RC2 en mode capture TRISB=0; //Port B dclarer en sortie /************************Configuration du mode capture****************************/ T1CON=0x31; //Configuration du timer1 CCP1CON=0x05; //Paramtrage du mode capture PIE1.TMR1IE=1; //Autorise les dbordements du timer 1 /******************Configuration et initialisation de l'cran LCD************************/ Lcd_Config(&PORTB, 0, 1, WR, 5, 4, 3, 2); //Configure l'cran Lcd_Init(&PORTB); //Initialisation du LCD Lcd_Cmd(Lcd_CURSOR_OFF); //Enlve le curseur Lcd_Cmd(Lcd_CLEAR); //Efface l'cran /*****************************Boucle infinie**************************************/ while(1) { cond=cond+1; vent(&cond); } } /*******************************Fonction vent************************************/ void vent(int *cond) { unsigned long tl, th, per; int vit,freq; char vent[13], txtvent[]="vitesse du vent:", VV; if(PIR1.CCP1IF==1) { TMR1H=0; TMR1L=0; th=CCPR1H; tl=CCPR1L; th=th<<8; per = th|tl; PIR1.CCP1IF=0; if(PIR1.TMR1IF==1) { per=65535+per; PIR1.TMR1IF=0; } } freq=671310/per; vit=freq*17.9 + 69.2; //Test si front montant lieu //Initialisation du timer1 bit de point fort //Initialisation du timer1 bit de point faible //Les valeurs sont copi dans des variables //Dcalage car th => bit de point fort //On concatne les deux valeurs, nous obtenons la priode //Remise a 0 du drapeau //Si dpassement du timer 1 //On ajoute une retenue lorsqu'on a fait un tour (16bit) //Remise a 0 du drapeau "dpassement"
24
//Valeur des centaines affect en ascii(48=0) //Valeur des dizaines affect en ascii //Valeur des unit affect en ascii //Virgule affect en ascii //Valeur de la 1er dcimale affect en ascii //Valeur de la 2me dcimale affect en ascii //m affect en ascii // / affect en ascii //s affect en ascii //Appel la fonction LCD tous les 1000 //Affiche la chaine de caractre humtxt sur le LCD //Affiche la chaine de caractre hum sur le LCD //Remise a 0 de la condition
25
Maintenant que tous nos capteurs sont installs, nous allons mettre profit le bouton poussoir install dans la partie LCD. Cest--dire que nous allons rassembler tous les programmes prcdents pour nen faire quun. Il suffira dappuyer sur le bouton poussoir pour faire dfiler les diffrentes valeurs comme une vraie station mto.
A.
La structure du programme
/*****************************Boucle infinie****************************************/ while(1) { cond=cond+1; switch(BP) { case 0: humidite(&cond); if(PORTA.F2==1) { BP=1; Lcd_Cmd(Lcd_CLEAR); Delay_ms(250); } break; case 1: temperature(&cond); if(PORTA.F2==1) { BP=2; Lcd_Cmd(Lcd_CLEAR); Delay_ms(250); } break; case 2: vent(&cond); if(PORTA.F2==1) { BP=0; Lcd_Cmd(Lcd_CLEAR); Delay_ms(250); } break; } } }
Nous avons choisi dutiliser un Switch, nous avons donc juste rajout une variable BP. Lorsquil y a appui sur le bouton poussoir, la variable BP sincrmente et le programme passe une autre case et donc utilise une nouvelle fonction. La temporisation nous donne le temps de relcher le bouton pour viter de faire dfiler le menu sans le vouloir.
26
Etant donn que nous ne pouvions pas prendre le matriel avec nous, il tait impratif de pouvoir faire des simulations. Pour cela nous avons utilis un logiciel trs utile, Proteus ISIS. Ce logiciel possde une trs grande librairie et permet de rentrer nos programmes sur le PIC virtuel gnr par le logiciel. Pour simuler le capteur dhumidit nous avons utilis un potentiomtre. Pour celui de lanmomtre comme pour nos mesures, nous avons branch virtuellement un GBF sur la borne associ et observ son signal laide dun oscilloscope. Voil un aperu de la simulation effectu sur ISIS :
de
la
Vrification thorique du vent : Vitesse du vent = 0.179* 37 + 0.629 Vitesse du vent = 7.657m/s
27
ZigBee est un protocole de haut niveau permettant la communication de petites radios, consommation rduite, base sur le standard IEEE 802.15.4. Cette technologie a pour but la communication de courte distance telle que le propose dj la technologie Bluetooth, tout en tant moins chre, plus simple et avec une fiabilit assez leve. Dans notre projet nous nous servirons de ZigBee pour permettre une transmission par ondes de nos donnes de la station mto vers un ordinateur. Pour cela nous avons, 2 modules Xbee pro, 2 platines dinterfaces, une avec des pattes (liaison platine) et lautre avec une sortie RS232 (liaison pc). Caractristique lectrique :
Les signaux Xbee ont une amplitude de 3,3V mais sont aliments en 5V (tension de notre source USB), cbls sur la bornes VIN ( Power input, from 6-12Vdc @ 300mA or higher ). Mais notre source ntant pas assez puissante pour alimenter toute notre installation. Nous utiliserons donc une source externe de 5V qui sera utilise pour alimenter les 2 systmes Xbee. Description des Bornes du Xbee qui nous intresse :
28
Nous avons cbl la sortie TX du microcontrleur qui met un signal jusqu la borne RX du Xbee qui rceptionne ce signal. Aprs la transmission se fait par onde entre les 2 modules Xbee. Pour le module qui reoit le signal, un cble RS232 suffit faire la liaison entre celui-ci et le PC.
B.
Un USART (Universal synchronous & Asynchronous Receiver Transmitter), est un metteurrcepteur universel. En langage courant, c'est le composant utilis pour faire la liaison entre l'ordinateur et le port srie. L'ordinateur envoie les donnes en parallle (autant de fils que de bits de donnes). Il faut donc transformer ces donnes pour les faire passer travers une liaison srie qui utilise un mme fil pour faire passer tous les bits de donnes. Constitution d'une trame USART : un bit de start toujours 0 : servant la synchronisation du rcepteur les donnes : la taille peut varier (gnralement entre 5 et 9 bits) ventuellement un bit de parit paire ou impaire et un bit de stop toujours 1 (la dure peut varier entre 1, 1,5 et 2 temps bit) Le niveau logique de repos est le 1.
29
C.
Grce la librairie de MikroC, il est trs facile denvoyer des donnes par liaison Usart. Cela fonctionne comme pour envoyer des caractres sur lcran LCD. Il faut juste ensuite choisir la vitesse de transmission qui sera 9600bps. Voici la fonction et un morceau du programme qui sert envoyer les caractres sur Xbee et de Xbee un HyperTerminal :
/*******************************Fonction humidit***********************************/ void humidite(int *cond) { long H, U, VL; //Dclaration des variables char HH, hum[8], humtxt[]="Humidite :"; . Xbee(8, hum) ; //Envoi la chane de caractre hum dans la fonction xbee } /**************************************Usart****************************************/ void xbee(int nb, char receive[20]) { int i; Usart_Init(9600); for(i=0; i<=nb ; i++) { Usart_Write(receive[i]); } }
//Vitesse de transmission //Boucle for //Envoi les caractres sur lHyperTerminal jusqu' i
30
Liens
Lien lien lien lien lien lien lien lien lien lien lien lien lien lien lien lien lien
On peut voir sur ce tableau que le prix de reviens pour les lments que nous avons utilis est de 145.06 TTC. Ce qui est plutt onreux compar aux stations mto du march qui oscille entre 6 et 400. En sachant que la ntre est loin dtre finalis (finition, esthtique, ergonomie et ajout de nouvelle fonction comme la date et lheure).
31
32
33
Programme complet
/******************Dclaration des fonctions****************************************/ avoid humidite(int *cond); void temperature(int *cond); void vent(int *cond); void lcd(int li, int co, int nb, char receive[15]); void xbee(int nb, char receive[15]); void main() { /*****************************dclaration des variables*****************************/ int cond=0;//Condition pour l'affichage sur l'cran LCD int BP=0; /******************Initialisation et affectation des ports**************************/ PORTA=0; PORTB=0; //initialisation PORTC=0; TRISB=0; //Port B dclarer en sortie TRISA=0xFF; //Port A en entre ADCON1=0x84; //Justifi droite active RA0/RA1/RA3 analogique ADCON0=0x85; //Fosc/32 sur PA0 en service TRISB=0; //Port B dclarer en sortie TRISC=0xFF;//Port C dclarer en entre /******************Configuration et initialisation de l'cran LCD*******************/ Lcd_Config(&PORTB, 0, 1, WR, 5, 4, 3, 2); //Configure l'ecran Lcd_Init(&PORTB); //initialisation du LCD Lcd_Cmd(Lcd_CURSOR_OFF); //Enleve le curseur Lcd_Cmd(Lcd_CLEAR); //Efface l'ecran /******************Initialisation du module I2C************************************/ I2C_Init(100000);//initialisation de la communication I2C I2C_Start();//Dtermine si l'I2C est libre et lance le signal I2C_Wr(0x90);//Mode de contrle en mode criture I2C_Wr(0xAC);//Accs au registre de configuration I2C_Wr(0x0A);//Registre de configuration mesure en continu I2C_Stop();//Arrt du signal I2C_Start();//Dtermine si l'I2C est libre et lance le signal I2C_Wr(0x90);//Mode de contrle en mode criture I2C_Wr(0xEE);//Dbut de la conversion I2C_Stop();//Arrt du sigal
34
35
36
37
38