[Tuto] : Les sleep modes de l’ESP32

Les sleep modes sont des états qui permettent de mettre en sommeil l’ESP 32. On éteint alors certains périphériques et les données sont conservées dans la RAM.

Il existe 5 modes d’économie d’énergies différents, nous allons les étudier un à un :

  • mode actif ( par défaut)
  • mode modem
  • mode light speed
  • mode sommeil profond
  • mode hibernation

Le mode actif : normal

Tout est allumé.

Le mode modem : WiFi, Bluetooth et radio désactivés

Pour maintenir les connexions WiFi / Bluetooth vivantes, le processeur, le Wi-Fi, Bluetooth et la radio sont réactivés à des intervalles prédéfinis. Ces modules sont responsables de la majeure partie de la consommation de la carte, c’est pourquoi nous allons chercher à les désactiver.

Pendant ce mode de veille, le mode d’alimentation bascule entre le mode actif et le mode veille du modem.

L’ESP32 peut entrer en mode veille du modem uniquement lorsqu’il se connecte au routeur en mode station ( connexion sans fil).

L’ESP 32 reçoit à intervalle régulier des message DTIM (Delivery Traffic Indication Message) du routeur pour l’informer que la communication avec celui ci est possible.

Entre deux messages DTIM, les échanges de données  avec le routeur sont impossibles, le WiFi et le Bluetooth sont donc désactivés durant ce laps de temps pour économiser de la batterie. Le temps de sommeil est généralement compris entre 100 et 1000 ms.


Light Sleep mode

Il comporte toutes les fonctionnalités du mode modem et plus encore. Ce mode permet d’économiser encore plus de batterie en utilisant le procédé de “Clock-Gating”.

Ce phénomène est à l’oeuvre dans la RAM et le CPU où des parties du circuit sont mises hors tension pour empêcher les bascules flip-flop qui composent le circuit de changer d’état.

Ces bascules sont synchronisées par l’horloge interne de la carte (RTC). En mode actif, elles changent d’état (effectuent une action), à chaque coup d’horloge. En mode light sleep, ce n’est plus le cas, elles restent dans le même état.

C’est  uniquement durant le changement d’état qu’il y a consommation, le clock gating permet donc d’économiser de la batterie.

Avant d’entrer en mode light sleep, L’ESP garde en mémoire les données et reprendra l’exécution du code là ou il s’est arrêté. L’avantage de ce mode est qu’il permet un réveil rapide tout en économisant de la batterie. 

Pour observer le fonctionnement du mode light sleep, je vous propose de téléverser le code suivant et d’ouvrir le moniteur série. 


void setup() {
    Serial.begin(115200);
    Serial.println("setup");
}

void loop() {
    esp_sleep_enable_timer_wakeup(5000000); //5 seconds
    int ret = esp_light_sleep_start();
    Serial.print("light_sleep:");
    Serial.println(ret);
}

Vous observerez que la carte ne reboot pas en sortie de sommeil et qu’elle reprend l’exécution du programme toutes les 5 secondes là où elle s’était arrêtée.

Deep Sleep

Pendant le deep sleep mode la majeure partie de la RAM et tous les périphériques numériques sont mis hors tension. Les seules parties de la puce qui restent sous tension sont les suivantes :

  • contrôleur RTC
  • périphériques RTC (y compris le processeur ULP)
  • mémoires RTC (lentes et rapides).

Nous allons réaliser un montage visant à montrer que même en plongeant notre carte en sommeil profond, il est possible de sauvegarder des données.

Vous aurez besoin de :

Montage à réaliser

Pour sauvegarder une variable même après avoir mis l’ESP en deep sleep mode il faut l’enregistrer dans la mémoire RTC en déclarant la variable en globale avec le type :

RTC_DATA_ATTR

par exemple :

RTC_DATA_ATTR int bootCount = 0;

copiez collez le code et téléversez le à l’aide de l’IDE arduino.


#define uS_TO_S_FACTOR 1000000  /* Conversion factor for micro seconds to seconds */
#define TIME_TO_SLEEP  3        /* Time ESP32 will go to sleep (in seconds) */

RTC_DATA_ATTR int bootCount = 0;

int GREEN_LED_PIN = 25;
int YELLOW_LED_PIN = 26;

void setup(){

  pinMode(GREEN_LED_PIN,OUTPUT);
  pinMode(YELLOW_LED_PIN,OUTPUT);
  delay(500);
  
  if(bootCount == 0) //Run this only the first time
  {
      digitalWrite(YELLOW_LED_PIN,HIGH);
      bootCount = bootCount+1;
  }else
  {
      digitalWrite(GREEN_LED_PIN,HIGH);
  }
  
  delay(3000);

  digitalWrite(GREEN_LED_PIN,LOW);
  digitalWrite(YELLOW_LED_PIN,LOW);

  esp_sleep_enable_timer_wakeup(TIME_TO_SLEEP * uS_TO_S_FACTOR);
  esp_deep_sleep_start();
}

void loop(){
  
}

Contrairement au mode light sleep, la carte redémarre à chaque réveil et effectue donc à nouveau le setup.  

Dans ce code, on instancie une variable bootcount qu’on stocke dans la mémoire RTC. La première fois que le setup est effectué, la led jaune doit s’allumer car bountcount est égale à 0.

En sortie de sommeil profond, Bountcount est égale à 1 car la variable a été incrémentée au tour d’avant. Cette fois ci, seul la led verte s’allume. La valeur de notre variable est conservée, la led jaune ne s’allume donc qu’une seule fois. 

Mode Hibernation

Il désactive les mêmes fonctionnalités désactivées par le mode sommeil profond. A cela s’ajoute le fait que la mémoire RTC est aussi privée d’alimentation. Il en résulte qu’il est impossible de sauvegarder des données en utilisant ce mode d’économie d’énergie. 

La consommation durant ce mode est censée être extrêmement faible (seulement quelques micro ampères)

Les façons de réveiller l’ESP32 :

Une fois mis en sommeil, il existe différentes façons de réveiller un ESP32. La déclaration de ces fonctions doit toujours se faire avant l’appel de la fonction provoquant le mode sleep. Cependant, vous pouvez toujours réveiller votre ESP32 en appuyant sur le bouton EN. Cela le redémarrera.  

Timer :

Cette méthode peut être utilisée quelque soit le mode d’économie d’énergie activé. La carte se met en sommeil durant un temps défini par l’utilisateur et se réveille ensuite. 

esp_sleep_enable_timer_wakeup(TIME_TO_SLEEP)// temps en micro seconde;

C’est cette méthode qui a été utilisée dans les exemples ci dessus.

Réveil externe :

Il est possible de réveiller un ESP32 après lui avoir envoyé un signal  digital sur une de ces pin.

void setup() {
    Serial.begin(115200);
    Serial.println("setup");
}

void loop() {
    esp_sleep_enable_ext0_wakeup(GPIO_NUM_27,HIGH);
    int ret = esp_light_sleep_start();
    Serial.print("light_sleep:");
    Serial.println(ret);
}

Ce code permet de sortir du mode light sleep dès que la pin 27 reçoit un 1 logique. Si le signal repasse à 0, la carte retombera en mode sommeil. 

Avec certains ajustements, il est aussi possible d’utiliser une interruption externe pour sortir du mode sommeil profond : 

void setup() {
    Serial.begin(115200);
    Serial.println("setup");
}
void loop() {
    esp_sleep_enable_ext0_wakeup(GPIO_NUM_27,LOW);
     esp_deep_sleep_start();// la fonction ne retourne rien
}

On est plongé dans le mode sommeil profond tant que la valeur sur la pin 27 est à HIGH.  

Vous êtes maintenant en mesure de comprendre comment les différents sleep modes de l’ESP32 fonctionnent et vous pouvez désormais les utiliser.

[Tuto] Configurer un module iBeacon avec un smartphone

Le iBeacon est un objet electronique basse consommation qui va permettre d’emettre en bluetooth trois valeurs en permanence. Un UUID qui identifie  l’iBeacon et deux autres valeurs : major et minor. Le iBeacon peut avoir de nombreuses utilités comme un système de positionnement.

Ici va être décrit la méthode de configuration du module iBeacon  via une application Apple.

Matériels nécessaire:

  • Module iBeacon programmable
  • Pile bouton CR2032
  • Application BeaconGo disponible sur Appstore
  1. Télécharger l’application BeaconGo sur l’Appstore
  2. Brancher la pile sur le module iBeacon
  3. Lancer l’application BeaconGo
  4. Appuyer sur BeaconGo Manager 
    img_0002
  5. Appuyer sur BeaconGO USB
    img_0003
  6. Appuyer sur Search
    img_0004
  7. Dans la liste des périphérique vous devriez voir apparaître votre iBeacon dans le cas où vous ne savez pas lequel est le votre débrancher votre iBeacon recommencer et procédez par élimination
  8. Sélectionner votre iBeacon vous devriez voir apparaître « Connecting » pendant plusieurs secondes
  9. Vous arrivez maintenant dans « Settings », vous pouvez configurer UUID, Major, Minor la puissance d’émission et d’autre paramètres qui pourraient vous intéresser.
    img_0001
  10. Votre Ibeacon est maintenant paramétré et prêt à être utilisé.

[Tuto] Réaliser un iBeacon à moindre couts

Le tutoriel d’aujourd’hui consiste à réaliser un iBeacon en utilisant un HM-10. Alors pour ceux qui ne connaissent pas un iBeacon est un objet émettant à intervalle régulier un signal bluetooth 4.0 (Aussi appelé BLE ou basse consommation).

Voici une vidéo de Estimote (une balise iBeacon) qui explique le principe:

Le but des balises iBeacon est de récupérer une localisation au travers d’application pour en adapter le contenu.

Pour réaliser notre balise iBeacon, il nous faudra un module bluetooth 4.0 (le même que l’on utilise avec le Arduino) ainsi qu’un module USB <-> UART (qui servira à la programmation et à l’alimentation du module bluetooth. Une nappe femelle – femelle servira de connectique.

Mettre à jour le firmware du module

Pour commencer nous allons nous assurer que le module a son firmware à jour en l’updatant vers la dernière version (cela permet d’être certains que toutes les commandes du mode iBeacon seront reconnues). Pour cela, il faut connecter les 2 modules de la manière suivante:

(USB/UART) +5V – VCC (Bluetooth)

(USB/UART) GND – GND (Bluetooth)

(USB/UART) TXD – RXD (Bluetooth)

(USB/UART) RXD – TXD (Bluetooth)

Montage

Vous pouvez brancher l’ensemble à votre ordinateur. Le module USB-UART va démarrer son installation.

Pendant ce temps, nous allons télécharger le logiciel hmcomassistant servant à la communication UART sur le site du fabriquant http://www.jnhuamao.cn/index_en.asp?ID=1 sur le site cliquez sur « PC ComAssistant ».

Download de PC Comm Assistant

Démarrer le logiciel HMComAssistant. Attention sous Windows il peut être nécessaire de l’exécuter en tant qu’administrateur.

Une fois le logiciel démarré, choisissez le port COM et cliquez sur « Open Com »

Open Com

La connexion est établie. Maintenant nous allons mettre le module en mode « Mise à jour du firmware » pour cela, tapez « AT+SBLUP » et vous recevrez en réponse « OK+SBLUP »

AT+SBLUP

Vous êtes maintenant prêt à updater le firmware. Pour cela fermer la fenêtre de « PC ComAssistant ». Sur le site du fabriquant, télécharger le dernier Firmware du HM-10 http://www.jnhuamao.cn/download_rom_en.asp?id=83

Download de Firmware

Attention: il existe 2 firmwares un pour la puce CC2540 et un pour la puce CC2541. Vous devez regarder votre module bluetooth pour savoir lequel télécharger.

CC2541

Une fois télécharger lancer l’application « HMSoft.exe »

Capture HMsoft

Choisissez le port COM utilisez précédemment, pour l’image file choisissez le fichier HMSoft.bim télécharger dans le package du firmware et cliquez sur « Load Image ».

Capture HMsoft_en cours

Le firmware est à jour.

Mettre le module en mode iBeacon

Pour paramétrer le module on va devoir utiliser HMComAssistant. Attention sous Windows il peut être nécessaire de l’exécuter en tant qu’administrateur.

Pour démarrer activer le mode iBeacon par la commande « AT+IBEA1 » le module doit répondre « OK+Set:1 »

AT+IBEA1

Maintenant que le mode iBeacon est activé, nous allons démarrer la transmission (Broadcast) par la commande « AT+DELO1 » auquel le module réponds « OK+DELO1 ».

AT+DELO1

Maintenant il faut redémarrer le module en débranchant le VCC puis le rebrancher.

Désormais le module est visible sur les applications iBeacon (ici iBeaconTool sur Android):

iBeacontool
https://play.google.com/store/apps/details?id=com.ealogic.ibeacon&hl=fr

[Tuto] Commander un relais en bluetooth

Commander un relais en bluetooth

Le but de ce montage est de commander une relais par une connexion Bluetooth. La finalité peut être par exemple l’allumage d’une lampe à distance.

Il est aussi possible de réaliser ce montage en remplaçant le module Bluetooth par le module wifi, voir même de le faire sans module en commandant le relais par l’interface USB.

Composants nécessaires :

Composants

 

Principe du montage :

Ce montage se basera sur le montage précédemment réalisé dans le tuto « Réaliser une liaison Bluetooth ». Le montage sera donc le suivant :

  • Digital 0 – Rx (Arduino) → Tx (Module Bluetooth)

  • Digital 1 – Tx (Arduino) → Rx (Module Bluetooth)

  • 5V (Arduino) → VCC (Module Bluetooth)

  • GND (Arduino) → GND (Module Bluetooth)

  • Digital 2 (Arduino) → N1 (Module Relais)

  • 5V (Arduino) → VCC (Module Relais)

  • GND (Arduino) → GND (Module Relais)

Remarque: Pour vous faciliter le montage du relais, il est pratique d’utiliser une nappe comme fourni avec certains capteurs.

Remarque: On monte le module Bluetooth sur une Breadboard pour faciliter le câblage.

Montage 1

 

Montage 2

 Programmation du montage:

 Le programme est le même que pour le tuto « Réaliser une liaison Bluetooth ».

 Le module Bluetooth convertie les informations envoyées en série. La seule contrainte est d’utiliser un débit à 9600bauds. Toutes les commandes de la librairie Serial restent utilisables.

 Pour plus de détails, vous pouvez consulter le site officiel : http://arduino.cc/fr/Main/Serial

Le programme doit établir une connexion, lire les données reçues, s’il reçoit un 1 il ferme le relais, s’il reçoit un 0 il ouvre le relais pour le reste il ne fait rien.

const int relais = 2; // broche 2 du micro-contrôleur se nomme maintenant : relais

void setup() // Fonction d’initialisation de la carte
{
  pinMode(relais, OUTPUT); // Definir relais comme une sortie
  Serial.begin(9600); // Demarrer la liaison a 9600bauds
}

void loop() // Fonction principale, elle se répète (s’exécute) à l'infini
{
   while (Serial.available() == 0); // Attendre de recevoir des caracteres
   char c = Serial.read(); // Lire les caracteres recus et les stocker dans c
   if(c =='1') // Si c = 1
   {
     digitalWrite(relais, HIGH); // Fermer le relais
   }
   if(c == '0') // Si c = 0
   {
     digitalWrite(relais, LOW); // Ouvrir le relais
   }
   delay(500); // Attendre une demi seconde
}

Il reste à brancher le Arduino pour compiler le programme et le téléverser.

Pour se connecter au Arduino dans l’exemple nous utiliserons une application Android : « Bluetooth Pi Arduino PC etc ». Dans l’application, cliquer sur « Discover » pour scanner les périphériques autour du terminal Android. Le Arduino s’appelle HC-06 cliquer dessus. Le mot de passe est « 1234 ». cliquer sur « terminal ». Dans la barre de saisie en bas de l’écran, taper « 1 » puis send. La LED s’allume. Taper 0 la LED s’éteint.

Une fois terminé cela nous donne :

ON

ON

OFF

OFF

Pour aller plus loin : On peut utiliser d’autres applications qui utilise des commandes plus complexes comme Amarino. Il est aussi possible de faire sa propre application grâce à Processing.