Projet IMA3 P7, 2016/2017, TD2 : Différence entre versions
(→Séance 1) |
(→Partie informatique) |
||
(19 révisions intermédiaires par 3 utilisateurs non affichées) | |||
Ligne 5 : | Ligne 5 : | ||
Pour notre projet Système Communicant, nous avons choisi de réaliser une station météo qui pourrait mesurer la température, l'humidité et la pression atmosphérique. Nous pourrions songer également à relever la luminosité, la quantité de précipitation etc mais il faut rester vigilent au nombre de pins de l'Arduino. Grâce à celui-ci, nous pourrons réaliser une application web qui afficherait en détails les grandeurs mesurées. | Pour notre projet Système Communicant, nous avons choisi de réaliser une station météo qui pourrait mesurer la température, l'humidité et la pression atmosphérique. Nous pourrions songer également à relever la luminosité, la quantité de précipitation etc mais il faut rester vigilent au nombre de pins de l'Arduino. Grâce à celui-ci, nous pourrons réaliser une application web qui afficherait en détails les grandeurs mesurées. | ||
− | + | == Le matériel == | |
− | *Un capteur de pression (type | + | *Un capteur de pression (type BMP180) |
− | *Un capteur d'humidité (A0SONG AM2302) | + | *Un capteur d'humidité (A0SONG AM2302) |
*Un capteur de température | *Un capteur de température | ||
*Un Raspberry Pi | *Un Raspberry Pi | ||
*Une alimentation | *Une alimentation | ||
− | *Un Arduino | + | *Un Arduino |
*Une nanoboard | *Une nanoboard | ||
− | *Plaque d'essais | + | *Plaque d'essais |
− | *Fils | + | *Fils |
== Séance 1 == | == Séance 1 == | ||
Ligne 25 : | Ligne 25 : | ||
Pour lire une mesure, il faut envoyer un front descendant sur SDA, puis le capteur envoie 5 octets : | Pour lire une mesure, il faut envoyer un front descendant sur SDA, puis le capteur envoie 5 octets : | ||
− | [[Fichier:AM2302. | + | [[Fichier:AM2302.jpeg]] |
Pour pouvoir gérer la bidirectionnalité de la broche SDA, on utilisera un composant spécifique de Altium : le IOBUF | Pour pouvoir gérer la bidirectionnalité de la broche SDA, on utilisera un composant spécifique de Altium : le IOBUF | ||
+ | |||
+ | Voici les caractéristiques sensorielles du capteur de température et d'humidité | ||
+ | |||
+ | [[Fichier:AM2302_sensor.jpeg]] | ||
=== Partie informatique === | === Partie informatique === | ||
Ligne 36 : | Ligne 40 : | ||
=== Partie électronique === | === Partie électronique === | ||
+ | |||
+ | Etude de la transmission d’informations avec la sonde AM2302 : | ||
+ | Attendre la détection d’un front descendant (entre 0,8 et 20 ms) envoyé par l’utilisateur. | ||
+ | On reçoit ensuit un signal haut nommé Tgo qui correspond à la libération du bus de données compris entre 20 et 200 us | ||
+ | On recoit une réponse du signal bas et une réponse du signal haut compris tous les duex entre 75 et 85 µs | ||
+ | Ensuite, la transmission des 40 caractères de données commence. Pour chaque bit, le capteur envoie un signal bas puis un signal haut.
Pour envoyer un 0 ou un 1, le temps du signal bas (TLOW) ne varie pas. C’est donc grâce au temps de signal haut que l’on va distinguer la reception d’un « 0 » ou d’un « 1 » | ||
+ | Pour compter le temps de signal haut et savoir si le capteur nous a envoyé un 1 ou un 0, il faut détecter le front montant, lancer un compteur toutes les 1 µs puis détecter un front descendant pour arrêter le compteur.
Si 48 < compteur < 55 µs, alors le capteur nous a envoyé un « 0 »
Si 22 < compteur < 30 µs, alors le capteur nous a envoyé un « 1 » | ||
+ | Après avoir envoyé 40 bits de données à traiter, le capteur envoie un dernier signal bas compris entre 45 et 55 µs pour indiquer que la transmission est terminée | ||
+ | |||
+ | [[Fichier:capture1.png]] | ||
+ | |||
+ | |||
+ | [[Fichier:capture2roux.png]] | ||
+ | |||
+ | |||
+ | |||
+ |
[[Fichier:capture3.png]] | ||
+ | |||
+ | |||
+ | [[Fichier:capture4.png]] | ||
+ | |||
+ | |||
+ | Grâce à ce compteur, nous stockons chaque bit reçu grâce à des bascules D. Une fois les 5 octets de données récupérées, il suffit d’effectuer quelques opérations mathématiques pour récupérer les valeurs décimales du pourcentage d’Humidité et de la température. | ||
+ | Voici à quoi correspondent les 5 octets reçus : | ||
+ | Le temps maximum de réception est (55 + 75 µs) x 8 x 5 = 5,2 ms.
C’est l’intervalle de temps minimum avec lequel on peut récupérer une nouvelle valeur de température et d’humidité. | ||
+ | |||
+ | |||
+ | [[Fichier:capture5.png]] | ||
+ | |||
+ | |||
+ | Pour vérifier que les informations reçues sont correctes, on additionne les 4 premiers octets (HH + HL + TH + TL). Si cette somme est égale au dernier octet (Parity bit), alors la transmission est correcte. | ||
+ | Pour avoir la valeur décimale de l’hygrométrie (en %), on converti en décimal les deux octets HH et HL puis on divise cette valeur par 10. | ||
+ | On applique les mêmes manipulations pour la température en °C. | ||
+ | Exemple : 40 bits recus : | ||
+ | 0000 0010 1001 0010 0000 0001 0000 1101 1010 0010
High Humidity Low Humidity High Temperature Low Temperature Parity bit | ||
+ | Calculs : | ||
+ | 0000 0010 + 1001 0010 + 0000 0001 + 0000 1101 = 1010 0010
Ici, cette égalité est vraie, donc la transmission est correcte. | ||
+ | Humidité : 0000 0010 1001 0010 = 0292H = 2 x 256 + 9x16 + 2 = 658
On divise cette valeur décimale par 10
Humidité = 65,8%RH | ||
+ | Température : 0000 0001 0000 1101 = 010DH = 1 x 256 + 0 x x16 + 13 = 269
On divise cette valeur décimale par 10
Température = 26,9°C | ||
=== Partie informatique === | === Partie informatique === | ||
+ | Lors de cette deuxième séance nous nous sommes intéressé au programme arduino de nos deux capteurs : Le BMP180 et la sonde DHT22 | ||
+ | |||
+ | Voici donc leur code arduino : | ||
+ | BMP180 (on télécharge la librairie Adafruit_BMP085 préalablement) | ||
+ | |||
+ | #include <Wire.h> | ||
+ | #include <Adafruit_BMP085.h> | ||
+ | |||
+ | Adafruit_BMP085 bmp; | ||
+ | |||
+ | void setup() { | ||
+ | Serial.begin(9600); | ||
+ | if (!bmp.begin()) { | ||
+ | Serial.println("Could not find a valid BMP085 sensor, check wiring!"); | ||
+ | while (1) {} | ||
+ | } | ||
+ | } | ||
+ | |||
+ | void loop() { | ||
+ | Serial.print("Temperature = "); | ||
+ | Serial.print(bmp.readTemperature()); | ||
+ | Serial.println(" *C"); | ||
+ | Serial.print("Pressure = "); | ||
+ | Serial.print(bmp.readPressure()); | ||
+ | Serial.println(" Pa"); | ||
+ | |||
+ | // Calculate altitude assuming 'standard' barometric | ||
+ | // pressure of 1013.25 millibar = 101325 Pascal | ||
+ | Serial.print("Altitude = "); | ||
+ | Serial.print(bmp.readAltitude()); | ||
+ | Serial.println(" meters"); | ||
+ | |||
+ | Serial.print("Real altitude = "); | ||
+ | Serial.print(bmp.readAltitude(101500)); | ||
+ | Serial.println(" meters"); | ||
+ | |||
+ | Serial.println(); | ||
+ | delay(500); | ||
+ | } | ||
+ | |||
+ | ''Pour le DHT22'' | ||
+ | |||
+ | #include "DHT.h" | ||
+ | #define DHTPIN 2 | ||
+ | #define DHTTYPE DHT22 | ||
+ | DHT dht(DHTPIN, DHTTYPE); | ||
+ | |||
+ | void setup() | ||
+ | { | ||
+ | Serial.begin(9600); | ||
+ | Serial.println("DHTxx test!"); | ||
+ | dht.begin(); | ||
+ | } | ||
+ | |||
+ | void loop() { | ||
+ | float h = dht.readHumidity(); | ||
+ | float t = dht.readTemperature(); | ||
+ | if (isnan(t) || isnan(h)) { | ||
+ | Serial.println("Failed to read from DHT"); | ||
+ | } | ||
+ | else { | ||
+ | Serial.print("Humidity: "); | ||
+ | Serial.print(h); | ||
+ | Serial.print(" %\t"); | ||
+ | Serial.print("Temperature: "); | ||
+ | Serial.print(t); | ||
+ | Serial.println(" *C"); | ||
+ | } | ||
+ | } | ||
== Séance 3 == | == Séance 3 == | ||
=== Partie électronique === | === Partie électronique === | ||
+ | Lors de la troisième séance nous avons décider de créer la partie FPGA de notre système. | ||
+ | Après avoir réaliser le tutoriel proposé nous avons essayé de comprendre la façon dont fonctionne nos capteurs afin de réaliser au mieux l'interface FPGA afin de réussir a lire les informations envoyé par les capteurs. | ||
+ | Malgré de nombreux essais et de nombreuse recherche sur internet nous n'avons pas réussi a aboutir a un sytème concret afin de lire les information. | ||
− | + | Voici les différent lien qui nous nt aidé dans la réalisation de notre projet : | |
− | + | [https://cdn.sparkfun.com/datasheets/Sensors/Pressure/BMP180%20breakout.pdf BMP180] | |
+ | [https://cdn.sparkfun.com/datasheets/Sensors/Pressure/BMP180.pdf Datasheet BMP180] | ||
− | + | Et pour le DHT22 nous avons trouvé ce model : | |
+ | [[Fichier:DHT22.png]] | ||
=== Partie informatique === | === Partie informatique === | ||
+ | Pour cette partie informatique nous avons suivi quelque tutoriel afin de créer une page HTML qui nous servira d'application WEB. | ||
+ | |||
+ | [[Fichier:web2.png]] | ||
+ | |||
+ | Cependant, après avoir réaliser cette partie nous ne savons pas comment obtenir les information des capteurs obtenu par Arduino et les envoyer sur notre page web... | ||
== Conclusion == | == Conclusion == | ||
+ | |||
+ | Pour conclure, ce projet n'est pas une grande réussite... Nous avons passé beaucoup de temps a essayer de comprendre le fonctionnement du FPGA afin de ne pas utiliser d'arduino comme on nous l'avais demandé. | ||
+ | La plus grosse Partei manquante du projet est la liaison entre l'application web et l'arduino. A ce jour, malgré les recherches et les séance de projet, nous manquons de compétences nécessaires a la bonne réalisation de notre projet. | ||
+ | Cependant, nous avons pu approcher la filière sc grâce a ce projet et cela a pu nous montrer ce que cette filière pourra nous apporter l'année prochaine. |
Version actuelle datée du 22 juin 2017 à 17:03
Projet IMA3-SC 2016/2017 : Station météo connectée
Cahier des charges
Pour notre projet Système Communicant, nous avons choisi de réaliser une station météo qui pourrait mesurer la température, l'humidité et la pression atmosphérique. Nous pourrions songer également à relever la luminosité, la quantité de précipitation etc mais il faut rester vigilent au nombre de pins de l'Arduino. Grâce à celui-ci, nous pourrons réaliser une application web qui afficherait en détails les grandeurs mesurées.
Le matériel
- Un capteur de pression (type BMP180)
- Un capteur d'humidité (A0SONG AM2302)
- Un capteur de température
- Un Raspberry Pi
- Une alimentation
- Un Arduino
- Une nanoboard
- Plaque d'essais
- Fils
Séance 1
Partie électronique
Pour le capteur AM2302, on constate que la broche de sortie SDA est une broche complexe et bidirectionnelle. On souhaite, grâce au FPGA, lire les informations envoyées par le capteur AM2302 toutes les n secondes. Pour lire une mesure, il faut envoyer un front descendant sur SDA, puis le capteur envoie 5 octets :
Pour pouvoir gérer la bidirectionnalité de la broche SDA, on utilisera un composant spécifique de Altium : le IOBUF
Voici les caractéristiques sensorielles du capteur de température et d'humidité
Partie informatique
Pour la programmation, nous avons décidé de ne pas utiliser la carte arduino mais plutôt un circuit logique programmable (puce FPGA). Cette puce servira à collecter les informations envoyées par les différents capteurs et les convertir en valeurs numériques pour pouvoir les afficher sur notre application web.
Séance 2
Partie électronique
Etude de la transmission d’informations avec la sonde AM2302 : Attendre la détection d’un front descendant (entre 0,8 et 20 ms) envoyé par l’utilisateur. On reçoit ensuit un signal haut nommé Tgo qui correspond à la libération du bus de données compris entre 20 et 200 us On recoit une réponse du signal bas et une réponse du signal haut compris tous les duex entre 75 et 85 µs Ensuite, la transmission des 40 caractères de données commence. Pour chaque bit, le capteur envoie un signal bas puis un signal haut. Pour envoyer un 0 ou un 1, le temps du signal bas (TLOW) ne varie pas. C’est donc grâce au temps de signal haut que l’on va distinguer la reception d’un « 0 » ou d’un « 1 » Pour compter le temps de signal haut et savoir si le capteur nous a envoyé un 1 ou un 0, il faut détecter le front montant, lancer un compteur toutes les 1 µs puis détecter un front descendant pour arrêter le compteur. Si 48 < compteur < 55 µs, alors le capteur nous a envoyé un « 0 » Si 22 < compteur < 30 µs, alors le capteur nous a envoyé un « 1 » Après avoir envoyé 40 bits de données à traiter, le capteur envoie un dernier signal bas compris entre 45 et 55 µs pour indiquer que la transmission est terminée
Grâce à ce compteur, nous stockons chaque bit reçu grâce à des bascules D. Une fois les 5 octets de données récupérées, il suffit d’effectuer quelques opérations mathématiques pour récupérer les valeurs décimales du pourcentage d’Humidité et de la température.
Voici à quoi correspondent les 5 octets reçus :
Le temps maximum de réception est (55 + 75 µs) x 8 x 5 = 5,2 ms.
C’est l’intervalle de temps minimum avec lequel on peut récupérer une nouvelle valeur de température et d’humidité.
Pour vérifier que les informations reçues sont correctes, on additionne les 4 premiers octets (HH + HL + TH + TL). Si cette somme est égale au dernier octet (Parity bit), alors la transmission est correcte.
Pour avoir la valeur décimale de l’hygrométrie (en %), on converti en décimal les deux octets HH et HL puis on divise cette valeur par 10.
On applique les mêmes manipulations pour la température en °C.
Exemple : 40 bits recus :
0000 0010 1001 0010 0000 0001 0000 1101 1010 0010
High Humidity Low Humidity High Temperature Low Temperature Parity bit
Calculs :
0000 0010 + 1001 0010 + 0000 0001 + 0000 1101 = 1010 0010
Ici, cette égalité est vraie, donc la transmission est correcte.
Humidité : 0000 0010 1001 0010 = 0292H = 2 x 256 + 9x16 + 2 = 658
On divise cette valeur décimale par 10
Humidité = 65,8%RH
Température : 0000 0001 0000 1101 = 010DH = 1 x 256 + 0 x x16 + 13 = 269
On divise cette valeur décimale par 10
Température = 26,9°C
Partie informatique
Lors de cette deuxième séance nous nous sommes intéressé au programme arduino de nos deux capteurs : Le BMP180 et la sonde DHT22
Voici donc leur code arduino : BMP180 (on télécharge la librairie Adafruit_BMP085 préalablement)
#include <Wire.h> #include <Adafruit_BMP085.h> Adafruit_BMP085 bmp; void setup() { Serial.begin(9600); if (!bmp.begin()) { Serial.println("Could not find a valid BMP085 sensor, check wiring!"); while (1) {} } } void loop() { Serial.print("Temperature = "); Serial.print(bmp.readTemperature()); Serial.println(" *C"); Serial.print("Pressure = "); Serial.print(bmp.readPressure()); Serial.println(" Pa"); // Calculate altitude assuming 'standard' barometric // pressure of 1013.25 millibar = 101325 Pascal Serial.print("Altitude = "); Serial.print(bmp.readAltitude()); Serial.println(" meters"); Serial.print("Real altitude = "); Serial.print(bmp.readAltitude(101500)); Serial.println(" meters"); Serial.println(); delay(500); }
Pour le DHT22
#include "DHT.h" #define DHTPIN 2 #define DHTTYPE DHT22 DHT dht(DHTPIN, DHTTYPE); void setup() { Serial.begin(9600); Serial.println("DHTxx test!"); dht.begin(); } void loop() { float h = dht.readHumidity(); float t = dht.readTemperature(); if (isnan(t) || isnan(h)) { Serial.println("Failed to read from DHT"); } else { Serial.print("Humidity: "); Serial.print(h); Serial.print(" %\t"); Serial.print("Temperature: "); Serial.print(t); Serial.println(" *C"); } }
Séance 3
Partie électronique
Lors de la troisième séance nous avons décider de créer la partie FPGA de notre système. Après avoir réaliser le tutoriel proposé nous avons essayé de comprendre la façon dont fonctionne nos capteurs afin de réaliser au mieux l'interface FPGA afin de réussir a lire les informations envoyé par les capteurs. Malgré de nombreux essais et de nombreuse recherche sur internet nous n'avons pas réussi a aboutir a un sytème concret afin de lire les information.
Voici les différent lien qui nous nt aidé dans la réalisation de notre projet :
Et pour le DHT22 nous avons trouvé ce model :
Partie informatique
Pour cette partie informatique nous avons suivi quelque tutoriel afin de créer une page HTML qui nous servira d'application WEB.
Cependant, après avoir réaliser cette partie nous ne savons pas comment obtenir les information des capteurs obtenu par Arduino et les envoyer sur notre page web...
Conclusion
Pour conclure, ce projet n'est pas une grande réussite... Nous avons passé beaucoup de temps a essayer de comprendre le fonctionnement du FPGA afin de ne pas utiliser d'arduino comme on nous l'avais demandé. La plus grosse Partei manquante du projet est la liaison entre l'application web et l'arduino. A ce jour, malgré les recherches et les séance de projet, nous manquons de compétences nécessaires a la bonne réalisation de notre projet. Cependant, nous avons pu approcher la filière sc grâce a ce projet et cela a pu nous montrer ce que cette filière pourra nous apporter l'année prochaine.