J'ai pour but d'allumer/éteindre une lampe grâce à un relais et un capteur ultrason. Dès que le capteur ultrason capte un obstacle le relais s'allume.
Après avoir réussi cette phase j'ai voulue réduire la consommation de l'arduino, j'ai donc pris un microcontrôleur Atmega8-8pu que j'ai mis en standalone.
Maintenant je cherche encore à réduire la consommation en mettant l'Atmega8-8pu en mode dormir et sortir de son sommeil dès que le capteur rencontre un obstacle. Mais je ne trouve aucune information là dessus (Le meilleur site qui parle de la consommation en mode sleep Gammon Forum : Electronics : Microprocessors : Power saving techniques for microprocessors).
PS: Mon circuit est alimenté en 9V convertit en 5V grâce à un régulateur 7805(pas la meilleure solution, je sais).
Question secondaire : Comment mesurer l'intensité de mon circuit avec un multimètre ? ( à chaque fois que j'essaye mon circuit s'éteint ).
Merci d'avance ^^
Voici mon code non-optimiser:
#include <avr/sleep.h>
int a = 0;
int moyenne = 0;
int trig = 12;
int echo = 11;
long lecture_echo;
long cm;
void setup()
{
pinMode(trig, OUTPUT);
digitalWrite(trig, LOW);
pinMode(echo, INPUT);
Serial.begin(9600);
pinMode(13,OUTPUT);
set_sleep_mode (SLEEP_MODE_PWR_DOWN);
sleep_enable();
sleep_cpu ();
}
void loop()
{
while (a < 3)
{
a++;
calibrage();
}
if (a == 3){
moyenne = moyenne / 3;
a++;
}
Serial.println(moyenne);
digitalWrite(trig, HIGH);
delayMicroseconds(10);
digitalWrite(trig, LOW);
lecture_echo = pulseIn(echo, HIGH);
cm = lecture_echo / 58;
Serial.print("Distancem : ");
Serial.println(cm);
delay(1000);
if (cm < moyenne)
{
digitalWrite(13,HIGH);
}
if (cm > moyenne)
{
digitalWrite(13,LOW);
}
}
void calibrage()
{
digitalWrite(trig, HIGH);
delayMicroseconds(10);
digitalWrite(trig, LOW);
lecture_echo = pulseIn(echo, HIGH);
cm = lecture_echo / 58;
Serial.print("Calibrage en cours");
// Serial.println(cm);
moyenne = cm + moyenne;
delay(2000); //Temps du calibrage (5sec environ)
Serial.println(".");
}
clench_35:
Maintenant je cherche encore à réduire la consommation en mettant l'Atmega8-8pu en mode dormir et sortir de son sommeil dès que le capteur rencontre un obstacle.
Bonjour
Ton evenement est la detection d'un obstacle (echo proche)
mais pour detecter cet echo , il faut que le module ultrason soit commandé en permanence (envoi d'un signal US, ecoute retour signal US, calcul distance) , et comme cette fonction est realisée par le MCU , ile ne peut pas etre mis en sommeil.
Non effectivement si vous avez un capteur (genre SR04, SRF05, SRF06, DYP-ME007) à Ultrason c'est l'Arduino qui demande au module d'envoyer un train d'ondes puis l'Arduino doit écouter la réponse du module pour connaître la distance, et suivant la distance (fonctionne entre 2cm et 4m environ) ça prend plus ou moins longtemps
La recommendation serait éventuellement d'utiliser d'une part la libraire NewPing qui est plus performante que celle standard si vous ne le faites pas déjà et ensuite en fonction de la vitesse de réaction que vous souhaitez obtenir vous pouvez faire dormir votre système un peu. Par exemple s'il ne s'agit pas d'un engin motorisé mais que vous voulez allumer la lampe en approchant la main assez proche du capteur alors réveiller le systeme une ou deux fois par seconde doit être acceptable en terme de réactivité utilisateur
Si vous faites de la détection plus globale d'une personne entrant dans une pièce avec un capteur PIR infrarouge (obstacle genre humain, émettant de la chaleur / IR dans son environnement ) alors pas besoin vraiment d'arduino il y'a des PIR intégrant directement un relai et si vous tenez à l'Arduino les PIRs mettent une broche à HIGH ou LOW quand ils détectent un mouvement et vous pouvez vous en servir comme interruption qui va réveiller votre arduino en sommeil
Enfin Posez vous aussi la question de savoir si les économies que vous obtiendrez ne sont pas négligeables en regard de la consommation du capteur si lui doit rester branché en permanence
Bref ça dépend de ce que vous voulez faire et du type de capteur que vous avez.
Pour réduire la consommation de courant d'un micro-contrôleur megaAVR en activité, on peut commencer par :
éliminer les circuits extérieurs inutiles,
réduire sa fréquence de fonctionnement,
réduire sa tension d'alimentation.
De cette manière on peut très facilement parvenir à rendre négligeable cette consommation par rapport à celle des autres circuits en activité.
Un Arduino Pro Mini 3.3V/8MHz ne consomme qu'environ 7 mA en activité. Et si on le fait tourner sur son horloge RC interne à 128 kHz (par reprogrammation de ses fuses), si l'on supprime son régulateur et sa led ON (par coupure du strap prévu à cet effet) et si on l'alimente directement avec une source de tension extérieure, alors on peut faire chuter sa consommation :
à moins de 0,12 mA en activité et à moins de 0,025 mA en sommeil sur une source de 5V régulée,
à moins de 0,08 mA en activité et à moins de 0,02 mA en sommeil sur une batterie au lithium de 3,7V.
En comparaison, un module HC-SR04 consomme environ 15 mA en fonctionnement et 2 mA au repos !
Je n'avais pas penser à tous ça avant d'acheter le matériel, du coup je suis forcé d'utiliser l'atmega8 et une alimentation de 9v avec régulateur. Sinon j'aurais utilisé cette méthode.
Artouste:
Bonsoir
OK
Mais comment fais tu pour détecter un evenement "obstacle" avec ton SR04 pendant la période d'endormissement ? 8)
Hé bien au final, j'ai utilisé la solution proposer par J-M-L , allumer et éteindre l'Arduino toutes les 3secs, si un obstacle l'Arduino reste allumer 10min.