Objets communiquants et gestion de l'énergie : Différence entre versions
(→Le Arduino) |
(→Fonction loop():) |
||
Ligne 195 : | Ligne 195 : | ||
Une fois implémenté sur le Arduino, la fonction setup va faire démarrer le protocole XBee et le protocole Série afin de pouvoir envoyer et recevoir des messages par XBee, et d'imprimer les messages d'erreur sur le port Série s'il y a lieu. | Une fois implémenté sur le Arduino, la fonction setup va faire démarrer le protocole XBee et le protocole Série afin de pouvoir envoyer et recevoir des messages par XBee, et d'imprimer les messages d'erreur sur le port Série s'il y a lieu. | ||
=====Fonction <span style="color: purple;">loop</span>():===== | =====Fonction <span style="color: purple;">loop</span>():===== | ||
+ | Cette fonction va réaliser une boucle toutes les 0.5s pour mettre a jour les données des différents capteurs et les envoyer au serveur au travers du protocole XBee. | ||
===le programme LINKER=== | ===le programme LINKER=== |
Version du 22 février 2013 à 15:31
Présentation du projet
Planning prévisionnel provisoire (jusqu'à la pré-soutenance)
Ce planning pourrait être amené à être modifié.
I) Etat de l'art ( ~2-3 semaines)
-Energy harvesting (Calvin)
-Batteries (Justin)
II) Mesure de puissance des différents appareil Arduino ( ~2 semaines)
III) Confronter théorie/réalité ( ~1 semaine) -estimer consommation de puissance
-vérifier en pratique
Amené à être ajouté:
Mesure du Arduino de sa propre consommation.
Mesure de la consommation du code (?)
Applications:
-Envoi des valeurs de l'Arduino au serveur.
-Interface web pour interagir avec l'objet.
Etat de l'art
Energy Harvesting
- Mosquino:
Mosquino est un matériel compatible avec le développement logiciel et dérivé de Arduino, il permet de récupérer de l'énergie des sources ambiantes (chaleur, luminosité, vibrations)
Il n'est destiné qu'aux faibles consommations électriques et n'est encore qu'en phase de développement, il n'a pas encore été véritablement testé.
http://tim.cexx.org/?page_id=760
- Breakout board BOB-o9946 :
Cette carte utilise le collecteur d'énergie piezoelectrique LTC3588 de Linear Technologies et permet non seulement de récupérer l'énergie piezoélectrique mais aussi l'énergie solaire. Initialement prévu pour fonctionner à faible voltage, la capacité de sortie peut-être dimensionnée pour recevoir une salve de courant de sortie plus élevée.
https://www.sparkfun.com/products/9946
Batteries
- nouvelles technologies:
ces dernières années, de nouvelles technologies sont apparues, sans être encore réellement utilisées. je pense notamment aux batteries contenues dans des câbles: http://phys.org/news/2012-09-lg-chem-cable-batteries-reshape.html
ainsi qu'aux batteries ultra fines dévellopées par thinergy: http://www.infinitepowersolutions.com/products.html
Néanmoins, les tensions pouvant etre délivrées par ces technologies naissantes sont loin de pouvoir alimenter le materiel qui nous interresse, à savoir des Arduino (necessitant une alimentation comprise entre 7V-12V)
D'autres techno sont encore en phase de développement, comme les batteries lithium-Air d'IBM, les piles au graphène utilisant la chaleur pour produire de l’énergie (plutôt de l'energy harvesting pour le coup). Comme ces technologies sont encore en phase de développement, elles n’apparaîtrons pas sur le marché avant au moins 10 ans.
- technologies adaptée à notre usage:
comme je l'ai rappelé plus haut, ce PFE tourne principalement autour d'Arduino. ces plates-formes nécessitant une tension d'alimentation supérieure à 7V, le choix le plus intéressant reste les piles rechargeable.
Seulement, il existe plusieurs types de piles rechargeables. dans l'usage qu'il en sera fait, et si ces batteries sont couplées à des technologies de récupération d'énergie, il est important de choisir des piles Lithium-Ion.
En effet, ces piles sont les plus intéressantes pour plusieurs raisons:
tout d'abord, elles sont insensibles à l'effet mémoire. du coup elles ne perdent pas de leur capacité de stockage d’énergie au cours du temps.
le circuit intégré à ces piles empêche toute surtension lors de la charge.
elles peuvent être rechargée en même temps qu'elles sont utilisées.
dans une époque ou la pollution est un sujet préoccupation, ces piles sont moins dangereuse pour l’environnement que leurs homologues au nickel-Cadmium
le seul problème pourrais venir du fait qu'elles ne supporte pas bien la chaleur, mais à moins de les coller à un radiateur, il ne devrais pas y avoir de soucis.
Mesure de la consommation énergétique
WSIM permet la simulation de capteurs sans fil. Il permet notamment d'estimer la consommation électrique http://wsim.gforge.inria.fr/index.html Pour l'instant il ne fonctionne qu'avec des microcontrolleurs TI. Le support des AVR est en cours. L'estimation de la consommation énergétique utilise esimu http://esimu.gforge.inria.fr/index.html
Réalisation
Le Arduino
Architecture de l'objet communiquant
- Un Arduino Mega 2560
- Un XBee
- Un capteur de température
- Un capteur de luminosité
- Un accéléromètre (dont les valeurs ne seront pas utilisées mais qui devait servir d'appareil supplémentaire pour la problématique de consommation)
Le code du Arduino
#include <XBee.h> // Define variables, pins.. int sensorTempPin = 0; int Temp; int sensorLightPin = 1; int Light; int XPin = 2; int YPin = 3; int ZPin = 4; int XValue; int YValue; int ZValue; uint8_t values[] = { 0, 0, 0, 0 }; XBee xbee = XBee(); XBeeResponse response = XBeeResponse(); Rx16Response rx = Rx16Response(); Tx16Request tx = Tx16Request(0x1111, values, sizeof(values)); TxStatusResponse txStatus = TxStatusResponse(); void setup() { // Initialise xbee / serial xbee.begin(9600); Serial.begin(9600); } void loop() { // Read the values on analog pins Light = analogRead(sensorLightPin); Temp = analogRead(sensorTempPin); XValue = analogRead(XPin); YValue = analogRead(YPin); ZValue = analogRead(ZPin); xbee.readPacket(); if(xbee.getResponse().isAvailable()){ // Got something Serial.print("Got something\n"); // Break the 10-bits of information retrieved from light // and temperature into 2 bytes for each. values[0] = Temp >> 8 & 0xff; values[1] = Temp & 0xff; values[2] = Light >> 8 & 0xff; values[3] = Light & 0xff; Serial.print(values[0]); // Sending values to server xbee.send(tx); // After sending a tx request, we expect a status response // from the server // Wait up to 5 seconds for the status response if (xbee.readPacket(5000)) { // We got a response! Serial.print("We got a response\n"); // It should be a znet tx status if (xbee.getResponse().getApiId() == TX_STATUS_RESPONSE) { xbee.getResponse().getZBTxStatusResponse(txStatus); // get the delivery status, the fifth byte if (txStatus.getStatus() == SUCCESS){ // Success! Time to celebrate Serial.print("SUCCESS! Time to celebrate\n"); } else { // The remote XBee did not receive our packet. Is it powered on? Serial.print("The remote Xbee did not receive our packet\n"); } } } else { // local XBee did not provide a timely TX Status Response -- should not happen Serial.print("Local Xbee did not provide a timely TX Status Response\n"); } } delay(500); }
Ce code fonctionne de la manière suivante:
Fonction setup():
Une fois implémenté sur le Arduino, la fonction setup va faire démarrer le protocole XBee et le protocole Série afin de pouvoir envoyer et recevoir des messages par XBee, et d'imprimer les messages d'erreur sur le port Série s'il y a lieu.
Fonction loop():
Cette fonction va réaliser une boucle toutes les 0.5s pour mettre a jour les données des différents capteurs et les envoyer au serveur au travers du protocole XBee.
le programme LINKER
Code du programme de liaison
ce programme en java est constitué de 5 classes
Le Main
public class main { public static SQLinker linker; public static Xbee xbee; public static void main(String[] args){ String address = new String("jdbc:mysql://sitedb.polytech-lille.net/cdelberg?"); String user = new String("user=cdelberg&password=myLo9ufonese"); String COM; // We ask the user on the Communication Port to connect the XBee System.out.println("Please enter the Communication port of the Xbee"); Scanner sc = new Scanner(System.in); COM = sc.next(); System.out.println("COM port changed to: "+COM); //Creation of the Variables that will be used to connect to the Database and the Xbee linker = new SQLinker(address, user); linker.FillArdList(); xbee = new Xbee(COM); //Creating the Updates Threads W8Thread thread1 = new W8Thread(); thread1.start(); UpTestThread thread2 = new UpTestThread(); thread2.start(); //We now allow the user to enter a command String command; System.out.println("vous pouvez maintenant lancer une commande si vous le souhaitez"); System.out.println("tapez help pour plus d'informations"); boolean exit=false; while(exit==false){ command=sc.next(); if(command.equals("help")){ System.out.println("print => affiche la liste des arduinos"); System.out.println("exit => ferme le programme"); } if(command.equals("print")){linker.PrintArdList();} if(command.equals("exit")){exit=true;} } //if the user ask to stop the program, it will do those final commands sc.close(); thread1.stop(); thread2.stop(); xbee.XbeeClosing(); //System.out.println("Program finished successfully"); } }