Partage
  • Partager sur Facebook
  • Partager sur Twitter

mise en veille totale de la carte arduino

6 décembre 2014 à 15:00:16

bonjour à tous,

je souhaiterai que ma carte arduino se mette en veille complètement après avoir réalisé un petit bout de programme.

est ce qu'il faut prévoir un code pour la réveiller ou après avoir coupé son alimentation elle se réinitialise toute seule et recommence le programme au début?

voici le programme :  

#include <avr/power.h>

void setup()
{
pinMode( 13, OUTPUT);
}
void loop ()
{
 digitalWrite(13, HIGH);
 set_sleep_mode(SLEEP_MODE_PWR_DOWN);
 sleep_enable();
}

Merci d'avance

  • Partager sur Facebook
  • Partager sur Twitter
6 décembre 2014 à 15:34:08

Si tu reset l'arduino (soit en appuyant sur le bouton reset, soit en coupant l'alim), celui-ci va recommencer le programme normalement.

=> Passage en mode sans économie d'énergie avec une horloge à 16MHz, réinitialisation des variables, exécution de setup puis de loop.

Bref, la réponse à ta question est : "non, tu n'as pas besoin de faire un code spécial".

-
Edité par lorrio 6 décembre 2014 à 15:34:36

  • Partager sur Facebook
  • Partager sur Twitter
6 décembre 2014 à 19:26:43

merci beaucoup pour ta réponse lorrio, et le bout de code je j'ai inséré ci-dessus peut-t-il mettre la carte en veille ? Comment le vérifier ?
  • Partager sur Facebook
  • Partager sur Twitter
6 décembre 2014 à 20:22:59

Je ne connais pas trop Arduino et son IDE, mais je connais bien les µC ATMEL.

A partir du moment où, dans ton programme assembleur, l'ALU rencontre des instructions lui disant de se mettre en veille profonde, tout ce qui se trouve après ne sera pas exécuté.

Si ça marche pareil, malgré la compilation C entre les deux, il te suffirait d'ajouter une ligne après ton sleep_enable qui passerait l'un des port inutilisé de l'ATMEL à l'état haut et tu branche une LED (avec résistance bien sur) dessus.

Si ta LED s'allume quand ton programme se termine, j'aurais tendance à dire que ton code de mise en veille ne fonctionne pas (puisque ça signifierait que, pour une raison ou pour une autre, l'ALU a réussis à exécuter ton code malgré l'instruction de mise en veille).

A noter que lire la doc de ton µC peut grandement aider (surtout qu'Atmel fait des doc super bien foutues) pour avoir les conditions d'entrées et de sortie des différents mode de veille car même si la LED ne s'allume jamais, cela ne signifie pas forcément que ça fait ce que tu veux. Par exemple : C'est débile, mais si tu fait entrer ton ALU en veille profonde sans désactiver le watchdog auparavant, ton µC va redémarrer en boucle à intervalle régulier (à chaque fois que ton watchdog détectera l'ALU comme plantée en somme).

  • Partager sur Facebook
  • Partager sur Twitter
6 décembre 2014 à 20:43:33

super merci beaucoup pour ta réponse Nisnor :) 

donc comme tu le disais j'ai essayé d'allumer une led juste après avoir " tenter" de mettre en veile l'arduino et ........... elle s'est allumée :/

je pense ne pas avoir installé la bonne bibliothèque ( j'ai utilsé celle-ci : https://github.com/rocketscream/Low-Power ) 

Est ce que vous savez ou est-ce que pourrai trouver celle qui correspond à mon programme ci-dessus ? 

Merci de votre réponse

  • Partager sur Facebook
  • Partager sur Twitter
6 décembre 2014 à 20:53:52

A voir les exemples, je pense qu'il te manque l'appel de sleep_mode

En effet, sleep_enable autorise l'entrée en mode sleep mais ne l'active pas !

Ton code devrait donc être :

void sleepPwrDown() {

	// Configuration du type de sleep
	set_sleep_mode(SLEEP_MODE_PWR_DOWN);

	// Autorisation du mode sleep
	sleep_enable();

	// Activation du mode sleep
	sleep_mode();
	
	// CPU en mode sleep,
	
}

Cependant, un sleep pour un sleep, ce n'est pas vraiment utile non ?

Généralement, on aime bien pouvoir ré-exécuter du code en appuyant sur un bouton, sans avoir à faire un reset.

Cela permet de garder le contenu des variables et continuer le code là ou il en était ;)

Tu peux faire ça en utilisant les interruptions.

Le code devient alors :

void wakeCallback() {
	/* rien */
}

void sleepPwrDown() {

	// Configuration du type de sleep
	set_sleep_mode(SLEEP_MODE_PWR_DOWN);

	// Autorisation du mode sleep
	sleep_enable();
	
	// Attachement d'une interruption sur front descendant de INT0
	attachInterrupt(0, wakeCallback, FALLING);

	// Activation du mode sleep
	sleep_mode();
	
	// CPU en mode sleep,
	// Attente de l'interruption INT0 qui réveillera le CPU
	
	// Désactivation du mode sleep
	sleep_disable();
	
}

Avec ce code, l'exécution du code reprendra son cours normal après l'appui sur un bouton connecté à INT0.


Pour savoir si ton code marche, tu peux faire ce qu'à dit Nisnor :

- avant d'appeler sleepPwrDown, tu fais un digitalWrite pour allumer une LED

- après l'appel de sleepPwrDown, tu fais un digitalWrite pour éteindre la LED.

Si la LED reste allumée, c'est que ton arduino est bien en mode sleep ;)

Le code de test est donc :

#include <avr/power.h>

void sleepPwrDown() {
	set_sleep_mode(SLEEP_MODE_PWR_DOWN);
	sleep_enable();
	sleep_mode();
}

void setup() {
	pinMode( 13, OUTPUT);
}

void loop () {
	
	for ( int i = 0 ; i < 5 ; i++ ) {
		digitalWrite(13, LOW);
		delay(50);
		digitalWrite(13, HIGH);
		delay(50);
	}
	
	sleepPwrDown();
	
	for ( int i = 0 ; i < 5 ; i++ ) {
		digitalWrite(13, LOW);
		delay(200);
		digitalWrite(13, HIGH);
		delay(200);
	}
	
}

Avec ça, ta LED devrait clignoté 5 fois puis resté allumée en mode sleep.

Si tu vois qu'elle s’éteint, ce n'est pas normale

Si tu vois qu'elle reclignote 5 fois, c'est que ton arduino a eu un reset

Si tu vois qu'elle reglignote 5 fois plus lentement, c'est que ton arduino est sortie du sleep sans reset

-
Edité par lorrio 6 décembre 2014 à 21:01:20

  • Partager sur Facebook
  • Partager sur Twitter
6 décembre 2014 à 23:14:05

merci beaucoup pour toutes ces infos ;)

du coup la bibliothèque que j'ai téléchargé peut-elle fonctionner sur ce programme, sinon ou est-ce que je peux la télécharger ??

Merci d'avance

  • Partager sur Facebook
  • Partager sur Twitter
7 décembre 2014 à 0:53:15

Je ne vois pas pourquoi elle ne marcherais pas étant donné que dans sa description, il est dit qu'elle est prévue pour arduino.

Pour mettre ton arduino dans une veille totale avec cette librairie, tu n'auras besoin de qu'une seule ligne de code :

LowPower.powerDown(SLEEP_FOREVER, ADC_OFF, BOD_OFF); 



  • Partager sur Facebook
  • Partager sur Twitter
7 décembre 2014 à 11:04:48

Merci beaucoup lorrio, est ce que tu sais à quoi correspond ADC et BOD ? Juste par curiosité :)

Encore merci

  • Partager sur Facebook
  • Partager sur Twitter
7 décembre 2014 à 11:52:13

BOD: Brown Out Detection

Il s'agit d'une fonctionnalité de l'arduino qui sert à faire un reset lorsque celui-ci est sous alimenté.

Cela permet d'éviter que le processeur fasse n'importe quoi quand sa tension d'alimentation est trop faible.

Cependant, lorsque le processeur est en veille profonde, il n'y a aucun risque qu'une sous alimentation lui fasse faire n'importe quoi puisse qu’il ne fait rien.

Du coup, on préfère généralement désactiver cette fonction pour économiser encore plus d'énergie.


ADC: Analog to Digital Converter

Il s'agit du convertisseur analogique/numérique qui te permet de mesurer une valeur analogique avec analogRead.

Là encore, il est préférable de couper totalement l'alimentation de ce module pour économiser plus d'énergie.

-
Edité par lorrio 7 décembre 2014 à 11:53:59

  • Partager sur Facebook
  • Partager sur Twitter
7 décembre 2014 à 13:37:13

Du coup quel  est le code pour mettre en veille le processeur ? Power.down ?

Merci d avance

  • Partager sur Facebook
  • Partager sur Twitter
7 décembre 2014 à 13:57:01

lorrio a écrit:

Pour mettre ton arduino dans une veille totale avec cette librairie, tu n'auras besoin de qu'une seule ligne de code :

LowPower.powerDown(SLEEP_FOREVER, ADC_OFF, BOD_OFF);

-
Edité par lorrio 7 décembre 2014 à 13:58:00

  • Partager sur Facebook
  • Partager sur Twitter
23 avril 2015 à 16:26:24

Bonjour a tous.

Mon projet consiste à concevoir un système qui permettra à l'utilisateur de voir le niveau du liquide et la consommation sur son SmartPhone de sa cuve à distance donc mon capteur ultrasons et la carte Arduino sera dans la cuve et une centrale de gestion branché sur secteur à notre domicile et une application sur notre smartphone ou tablette

J'ai besoin de votre aide pour me dire comment mettre en veille la communication RFBee pour qu'elle ne consomme pas énormément sachant que je ferai 2 mesures par jour soit tout les 10 heures.

Voici mon programme :

#include <Wire.h>

int reading=0;

 void setup() {
  
  Wire.begin();                // join i2c bus (address optional for master)
  Serial.begin(9600);  // start serial communication at 9600bps
 }

 void loop() {
 
    Acquerir_traiter();
  
          Communiquer();
   
 
 }
 
 void Acquerir_traiter()
 {
  Wire.beginTransmission(112); // transmit to device #112 (0x70)
  Wire.write(byte(0x00));      // sets register pointer to the command register (0x00)
  Wire.write(byte(0x54));      // command sensor to measure in "inches" (0x50)
  Wire.endTransmission();      // stop transmitting

  delay(70);                   // datasheet suggests at least 65 milliseconds

  Wire.beginTransmission(112); // transmit to device #112
  Wire.write(byte(0x02));      // sets register pointer to echo #1 register (0x02)
  Wire.endTransmission();      // stop transmitting

  // step 4: request reading from sensor
  Wire.requestFrom(112, 2);    // request 2 bytes from slave device #112

  // step 5: receive reading from sensor
  if (2 <= Wire.available())   // if two bytes were received
  {
   
    reading = Wire.read();  // receive high byte (overwrites previous reading)
    reading = reading << 8;    // shift high byte to be high 8 bits
    reading |= Wire.read(); // receive low byte as lower 8 bits
  }

  delay(300000);                  // wait a bit since people have to read the output :)
}
 
 void Communiquer() {
   Serial.write(reading);
  
   }

Merci de me répondre. :)

  • Partager sur Facebook
  • Partager sur Twitter
23 avril 2015 à 17:32:59

Avec les balises codes, ce serait tellement mieux...

Enfin bon, de toute façon, on n'a pas besoin de code pour faire de la théorie.


Sur les XBee, seul les modules configuré en mode EndDevice supportent le mode veille.

Les modules en Coordinateur ou Routeur ne peuvent pas passer en mode veille puisqu'ils ont pour mission de maintenir le réseau opérationnel en plus de communiquer si besoin.

Une fois que tu as configuré ton module en mode EndDevice (avec XCTU par exemple), tu dois aussi paramétrer le type de mode veille avec la commande SM.

Mettre SM=1 signifie que le module reçoit ses ordres de mise en veille avec sa broche 9 :

- broche à 3.3V (HIGH) => le module est actif

- broche à 0V (LOW) => le module est en veille (consomme environ 10µA)

Tout ce que ton arduino doit faire, c'est donc des digitalWrite pour piloter la broche 9 du XBee.

A noter que la sortie du mode veille prend au moins 13ms donc n'oublie pas de faire un delay avant de communiquer après avoir réveillé ton XBee.

-
Edité par lorrio 23 avril 2015 à 17:35:40

  • Partager sur Facebook
  • Partager sur Twitter
25 avril 2015 à 1:17:20

Merci beaucoup a toi lorrio

-
Edité par RichardDubois1 25 avril 2015 à 1:18:43

  • Partager sur Facebook
  • Partager sur Twitter
4 mai 2015 à 9:25:22

Bonjour,

j'ai des nœuds et je veux les mettre en veille, quand j'appelle la fonction de mise en veille, le moniteur de l'arduino se désactive ensuite quand les nœuds se réveillent le monitor s'active mais ne il n'affiche pas ce que je demande en Serial.println().

S'il vous plait, Comment je peux récupérer les données du port série de l'arduino sans passer par monitor?

-
Edité par AfafAfifa 4 mai 2015 à 9:27:29

  • Partager sur Facebook
  • Partager sur Twitter
4 mai 2015 à 9:47:02

Bonjour AfafAfifa,

Je crois que tu es un peu hors sujet là (ce sujet n'a rien à voir avec le Serial et le moniteur) ;)

Je t'invite donc à créer ton propre sujet où tu nous expliques ton problème en détaille.

N'oublies pas de poster le code que tu utilises (il pourrait nous être utile pour te guider vers une solution).

  • Partager sur Facebook
  • Partager sur Twitter
4 mai 2015 à 14:10:48

Je vois que le but de pierrotfro est de mettre en veille sa carte Arduino. C'est exactement ce que je veux faire et pour déboguer, je veux utiliser des prinf(le débogage avec la Led marche très bien).

Pour le code, c'est exactement celui que vous avez proposé dans un post précédent en rajoutant des printf.

void loop() {

  delay(5000); //waits for 5 second

  digitalWrite(LEDPIN,HIGH);

  delay(5000);

  Serial.println("I'll sleep thanks to IntervalTimer_LP class \n");

  LP.DeepSleep(LPTMR_WAKE, 5000);//Sleep clocks are running at 2MHz

  Serial.println("Wakey Wakey \n");

  }

merci de votre réponse :)

  • Partager sur Facebook
  • Partager sur Twitter
4 mai 2015 à 15:21:09

Dans ton commentaire, je vois : "Sleep clocks are running at 2MHz"

Si ta lib ne remet pas la clock à la fréquence par défaut (16MHz) au réveil, le Serial ne fonctionnera pas à la bonne vitesse et le PC recevra n'importe quoi (ou rien du tout).

  • Partager sur Facebook
  • Partager sur Twitter
14 janvier 2020 à 16:38:59

Bonjour j'ai un problème de type je trouve trop de librairie différente pour le sleep mode et il m'en faudrait une me permettant de mettre ne veille la carte arduino ou des ports que je n'utilise


c'est pour économiser le plus d'énergie possible pour mon projet de fin d'année.

  • Partager sur Facebook
  • Partager sur Twitter
15 janvier 2020 à 8:05:23

Bonjour,

Déterrage

Citation des règles générales du forum :

Avant de poster un message, vérifiez la date du sujet dans lequel vous comptiez intervenir.

Si le dernier message sur le sujet date de plus de deux mois, mieux vaut ne pas répondre.
En effet, le déterrage d'un sujet nuit au bon fonctionnement du forum, et l'informatique pouvant grandement changer en quelques mois il n'est donc que rarement pertinent de déterrer un vieux sujet.

Au lieu de déterrer un sujet il est préférable :

  • soit de contacter directement le membre voulu par messagerie privée en cliquant sur son pseudonyme pour accéder à sa page profil, puis sur le lien "Ecrire un message"
  • soit de créer un nouveau sujet décrivant votre propre contexte
  • ne pas répondre à un déterrage et le signaler à la modération

Je ferme ce sujet. En cas de désaccord, me contacter par MP.

  • Partager sur Facebook
  • Partager sur Twitter

Pas d'aide concernant le code par MP, le forum est là pour ça :)