Brownout ESP32 avec l'IDE 1.8.9

Bonjour

J'utilise des ESP32 development boards ou Lolin32 en général sans problème. Ma station météo, décrite dans les projets terminés est un exemple. Je les utilise en WiFi.

Je suis passé cette semaine à la version 1.8.9 de l'IDE arduino sous windows 10 et depuis, lorsque je programme un ESP32 pour qu'il se connecte en WiFi, j'ai un message de brownout au moment de la connexion et l'ESP32 reboote dans cesse.

Avant j'avais la version 1.8.5 et je n'avais aucun problème. Est ce que quelqu'un a aussi remarqué ça ? Est-ce une coïncidence ou est-ce effectivement lié au changement de version ?

Bonjour

non pas remarqué avec :
-Linux .... (ou Windows10 avec la patience de rigueur)
-Arduino 1.8.9 (depuis plusieurs mois il me semble)
-Core ESP32 en version 1.0.2 (donc à jour)
-carte LOLIN 32 alimentée en 5V par le PC Portable

-> la carte reboote bien après flashage et ensuite à chaque réveil (mes applications utilisent en général le deep-sleep)

PS : un petit coup d'oscilloscope sur le 5V et le 3,3V pourrait servir :wink:

Bonjour lesept,

J'ai vu un cas où le câble USB était la cause de ce message.
Sait-on jamais ?

Cordialement,
bidouilleelec

J'ai essayé pas mal de choses : deux cartes différentes, deux PC portables différents, sous Windows 10 tous les deux, deux câbles différents. Toujours pareil !

J'en viens à la conclusion que le seul facteur commun... c'est moi.

J'ai commandé des cartes et des câbles chez Ali, mais ça prend du temps...

Qu'est-ce qui te fait dire qu'il s'agit de brownout et que le redémarrage n'a pas d'autre cause ?
Tu as analysé 'Reset Cause...." ?

Non, ça semble compliqué.
Les autres sketches fonctionnent, et les print série montrent que le problème arrive à la commande wifi.begin (je vais vérifier ça plus en détail)

Attention le neuneu de la radio a décider de se soigner :grin: .
Hier j'ai branché mon premier Lolin32 et mode WiFi.

Et je constate la même chose que LeSept : série de redémarrage jusqu'à que cela fonctionne.

Le programme que j'ai pompé :

// Partie web serveur
#include <WiFi.h>

const char* ssid     = "Vous êtes bien curieux" ;
const char* password = "Vous ne le saurez pas" ;

WiFiServer serveur(80) ;

String header ;

String EtatSt26 = "Off" ;
String EtatSt27 = "Off" ;

// Partie Micro
const uint8_t del_J = 26 ;
const uint8_t del_R = 27 ;

//Gestion de l'affichage
uint8_t affiche = 1;


void setup() 
{
  Serial.begin(115200);
  
  pinMode(del_J, OUTPUT);
  pinMode(del_R, OUTPUT);

  Serial.print("Connexion a :"); Serial.println(ssid);
  WiFi.begin(ssid, password);

  while(WiFi.status() != WL_CONNECTED)
  {
    delay(500);
    Serial.print(".");
  }
  // Affichage des paramètres de connexion
  if(affiche)
  {
  Serial.println("\n Parametre de connexion:");
  Serial.print("WiFi connecte à l'adresse IP = "); Serial.println(WiFi.localIP() );
  }
  serveur.begin();
}

void loop() 
{
    WiFiClient client = serveur.available() ;

  if (client)
  {
    if (affiche) Serial.println("Nouvelle connexion");
    String currentLine = "";
    while (client.connected() )
    {
      if (client.available()) // s'il y a quelque chose à lire
      {            
        char c = client.read();             
        if (affiche) Serial.write(c);  // Affiche sur le moniteur  -> pourquoi pas print ?                  
        header += c;
        if (c == '\n')  // -> caractére nouvelle ligne reçu
        {                   
          if (currentLine.length() == 0) // Ligne vide = fin de la requete http envoyée par le client
          {
            client.println("HTTP/1.1 200 OK");
            client.println("Content-type:text/html");
            client.println("Connection: close");
            client.println();
            
            // Commute les sortie 26 et 27
            if (header.indexOf("GET /26/ON") >= 0) 
            {
              if (affiche) Serial.println("GPIO 26 ON");
              EtatSt26 = "on";
              digitalWrite(del_J, HIGH);
            } 
            else if (header.indexOf("GET /26/off") >= 0) 
            {
              if (affiche) Serial.println("GPIO 26 OFF");
              EtatSt26 = "off";
              digitalWrite(del_J, LOW);
            } 
            else if (header.indexOf("GET /27/on") >= 0) 
            {
              if (affiche) Serial.println("GPIO 27 on");
              EtatSt27 = "on";
              digitalWrite(del_R, HIGH);
            } 
            else if (header.indexOf("GET /27/off") >= 0) 
            {
              if (affiche) Serial.println("GPIO 27 off");
              EtatSt27 = "off";
              digitalWrite(del_R, LOW);
            }
            
            // Display the HTML web page
            client.println("<!DOCTYPE html><html>");
            client.println("<head><meta name=\"viewport\" content=\"width=device-width, initial-scale=1\">");
            client.println("<link rel=\"icon\" href=\"data:,\">");
            // CSS to style the on/off buttons 
            // Feel free to change the background-color and font-size attributes to fit your preferences
            
            client.println("<style>html { font-family: Helvetica; display: inline-block; margin: 0px auto; text-align: center;}");
            
            client.println(".button { background-color: #4CAF50; border: none; color: white; padding: 16px 40px;");
            client.println("text-decoration: none; font-size: 30px; margin: 2px; cursor: pointer;}");
            client.println(".button2 {background-color: #555555;}</style></head>");
            
            // Web Page Heading
            client.println("<body><h1>ESP32 Lolin 32 Serveur Web</h1>");
            
            // Display current state, and ON/OFF buttons for GPIO 26  
            client.println("<p>Etat de la sortie GPIO 26" + EtatSt26 + "</p>");
            // If the EtatSt26 is off, it displays the ON button       
            if (EtatSt26=="off") {
              client.println("<p><a href=\"/26/on\"><button class=\"button\">ON</button></a></p>");
            } else {
              client.println("<p><a href=\"/26/off\"><button class=\"button button2\">OFF</button></a></p>");
            } 
               
            // Display current state, and ON/OFF buttons for GPIO 27  
            client.println("<p>Etat de la sortie GPIO 27 " + EtatSt27 + "</p>");
            // If the EtatSt27 is off, it displays the ON button       
            if (EtatSt27=="off") {
              client.println("<p><a href=\"/27/on\"><button class=\"button\">ON</button></a></p>");
            } else {
              client.println("<p><a href=\"/27/off\"><button class=\"button button2\">OFF</button></a></p>");
            }
            client.println("</body></html>");
            
            // The HTTP response ends with another blank line
            client.println();
            // Break out of the while loop
            break;
          } else { // if you got a newline, then clear currentLine
            currentLine = "";
          }
        } else if (c != '\r') {  // if you got anything else but a carriage return character,
          currentLine += c;      // add it to the end of the currentLine
        }
      }
    }
    // Clear the header variable
    header = "";
    // Close the connection
    client.stop();
    if (affiche) Serial.println("Client deconnecte.");
    if (affiche) Serial.println("");
  }
  affiche = 0 ;
}

C'est kaiman le programme d'origine : un peu français dans ce monde de brutes anglo-saxonne et comme le programme envoyait en permanence des info sur le port série un blocage de l'affichage (drapeau "affiche") après le premier tour de loop().
Les sorties sur le port série dans le message suivant (trop de carractères)

Les messages sur la sortie série :
J'ai du couper des messages répétitifs pour tenir dans les clous du forum.
Le Guru méditation ne m'a jamais été présenté :grin:

Connexion a :Livebox-Truc Muche
Guru Meditation Error: Core  0 panic'ed (IllegalInstruction). Exception was unhandled.
Memory dump at 0x4011f648: f0f9ff1d 31395f7e 20c0f790
Core 0 register dump:
PC      : 0x4011f64c  PS      : 0x00050031  A0      : 0x401364fe  A1      : 0x3ffbe1c0  
A2      : 0x00000000  A3      : 0x3ffbe7f0  A4      : 0x4008178c  A5      : 0x6000e050  
A6      : 0x00000000  A7      : 0x0000885e  A8      : 0x801364f9  A9      : 0x4008b4f4  
A10     : 0x00000960  A11     : 0x01ea0d30  A12     : 0x00000000  A13     : 0x3ffb5320  
A14     : 0x24221f1c  A15     : 0x2e2c2927  SAR     : 0x00000020  EXCCAUSE: 0x00000000  
EXCVADDR: 0x00000000  LBEG    : 0x4000c2e0  LEND    : 0x4000c2f6  LCOUNT  : 0x00000000  
Core 0 was running in ISR context:
EPC1    : 0x4011f64c  EPC2    : 0x00000000  EPC3    : 0x00000000  EPC4    : 0x00000000

Backtrace: 0x4011f64c:0x3ffbe1c0 0x401364fb:0x3ffb5310 0x40005fda:0x3ffb5340 0x40137565:0x3ffb5370 0x40137889:0x3ffb5390 0x40137b1a:0x3ffb53f0 0x40137c5b:0x3ffb5440 0x40135826:0x3ffb5460 0x40135d14:0x3ffb5480 0x400da716:0x3ffb5540 0x400da9c6:0x3ffb5570 0x40110c1d:0x3ffb55a0 0x40110d22:0x3ffb55d0 0x4011101e:0x3ffb5600 0x401111bb:0x3ffb5630 0x4008f8cc:0x3ffb5650 0x4008877d:0x3ffb5690

Rebooting...
ets Jun  8 2016 00:22:57

rst:0xc (SW_CPU_RESET),boot:0x13 (SPI_FAST_FLASH_BOOT)
configsip: 0, SPIWP:0xee
clk_drv:0x00,q_drv:0x00,d_drv:0x00,cs0_drv:0x00,hd_drv:0x00,wp_drv:0x00
mode:DIO, clock div:1
load:0x3fff0018,len:4
load:0x3fff001c,len:928
ho 0 tail 12 room 4
load:0x40078000,len:8424
ho 0 tail 12 room 4
load:0x40080400,len:5868
entry 0x4008069c
Connexion a :Livebox-B3E6
Guru Meditation Error: Core  0 panic'ed (IllegalInstruction). Exception was unhandled.
Memory dump at 0x4011f648: f1fdff1d bdfd5ffe 20c0f790
Core 0 register dump:
PC      : 0x4011f64c  PS      : 0x00050031  A0      : 0x40008544  A1      : 0x3ffbe1c0  
A2      : 0x24221f1c  A3      : 0x3ffbe7f0  A4      : 0x4008178c  A5      : 0x3ffb5320  
A6      : 0x00000000  A7      : 0x2e2c2927  A8      : 0x80008547  A9      : 0x4008b4f4  
A10     : 0x00000763  A11     : 0xffffffff  A12     : 0x00000000  A13     : 0x6000e044  
A14     : 0x00000000  A15     : 0x6001c400  SAR     : 0x00000020  EXCCAUSE: 0x00000000  
EXCVADDR: 0x00000000  LBEG    : 0x4000c2e0  LEND    : 0x4000c2f6  LCOUNT  : 0x00000000  
Core 0 was running in ISR context:
EPC1    : 0x4011f64c  EPC2    : 0x00000000  EPC3    : 0x00000000  EPC4    : 0x00000000

Backtrace: 0x4011f64c:0x3ffbe1c0 0x40008541:0x3ffb52f0 0x401364f6:0x3ffb5310 0x40005fda:0x3ffb5340 0x40137565:0x3ffb5370 0x40137889:0x3ffb5390 0x40137b1a:0x3ffb53f0 0x40137c5b:0x3ffb5440 0x40135826:0x3ffb5460 0x40135d14:0x3ffb5480 0x400da716:0x3ffb5540 0x400da9c6:0x3ffb5570 0x40110c1d:0x3ffb55a0 0x40110d22:0x3ffb55d0 0x4011101e:0x3ffb5600 0x401111bb:0x3ffb5630 0x4008f8cc:0x3ffb5650 0x4008877d:0x3ffb5690

Rebooting...
ets Jun  8 2016 00:22:57
 Coupé pour cause de trop de caractères

Rebooting...
ets Jun  8 2016 00:22:57
 Coupé

Rebooting...
ets Jun  8 2016 00:22:57
   Coupé

Rebooting...
ets Jun  8 2016 00:22:57
  Coupé


Rebooting...
ets Jun  8 2016 00:22:57
  Coupé

Rebooting...
ets Jun  8 2016 00:22:57
Coupé

Rebooting...
ets Jun  8 2016 00:22:57
 Coupé

Rebooting...
ets Jun  8 2016 00:22:57
Coupé


Rebooting...
ets Jun  8 2016 00:22:57
Coupé

Rebooting...
ets Jun  8 2016 00:22:57
Coupé

Rebooting...
ets Jun  8 2016 00:22:57
rst:0xc (SW_CPU_RESET),boot:0x13 (SPI_FAST_FLASH_BOOT)
configsip: 0, SPIWP:0xee
clk_drv:0x00,q_drv:0x00,d_drv:0x00,cs0_drv:0x00,hd_drv:0x00,wp_drv:0x00
mode:DIO, clock div:1
load:0x3fff0018,len:4
load:0x3fff001c,len:928
ho 0 tail 12 room 4
load:0x40078000,len:8424
ho 0 tail 12 room 4
load:0x40080400,len:5868
entry 0x4008069c
Connexion a :Livebox-Machin truc Muche

Brownout detector was triggered

ets Jun  8 2016 00:22:57

rst:0xc (SW_CPU_RESET),boot:0x13 (SPI_FAST_FLASH_BOOT)
configsip: 0, SPIWP:0xee
clk_drv:0x00,q_drv:0x00,d_drv:0x00,cs0_drv:0x00,hd_drv:0x00,wp_drv:0x00
mode:DIO, clock div:1
load:0x3fff0018,len:4
load:0x3fff001c,len:928
ho 0 tail 12 room 4
load:0x40078000,len:8424
ho 0 tail 12 room 4
load:0x40080400,len:5868
entry 0x4008069c
Connexion a :Livebox-B3E6
..
 Parametre de connexion:
WiFi connecte à l'adresse IP = 192.168.1.25

Et après cela fonctionne.
Carte Lolin32 1.0.0

Pb qui arrive aussi bien en IDE 1.8.4 quand 1.8.9

Bienvenue 68tjs !!! dommage que le premier contact ne soit pas plus probant !

je n'arrive pas à reproduire le pb
La carte est également une "LOILIN32 V1.0.0" pas très récente achetée sur la boutique LOLIN sur Aliexpress
Lolin32V100.jpg
ton code démarre chez moi sans 'à coup ', sans aucun râté
j'ai fait une dizaine d'essais soit par flashage soit par appui sur le BP

après activation de l'option Debug /verbose dans l'IDE voilà ce que je vois

[D][WiFiGeneric.cpp:342] _eventCallback(): Event: 0 - WIFI_READY
[D][WiFiGeneric.cpp:342] _eventCallback(): Event: 2 - STA_START
.[D][WiFiGeneric.cpp:342] _eventCallback(): Event: 4 - STA_CONNECTED
[D][WiFiGeneric.cpp:342] _eventCallback(): Event: 7 - STA_GOT_IP
[D][WiFiGeneric.cpp:385] _eventCallback(): STA IP: 192.168.1.6, MASK: 255.255.255.0, GW: 192.168.1.254
.
 Parametre de connexion:
WiFi connecte à l'adresse IP = 192.168.1.6

Il existe un utilitaire de décodage de pile pour le débuggage , je ne l'ai pas installé
C'est ici

le 'Guru' mentionne un soucis d'instruction illégale pour le Core 0 , celui chargé de faire fonctionner la radio WiFi

Lolin32V100.jpg

68tjs:
Les messages sur la sortie série :
J'ai du couper des messages répétitifs pour tenir dans les clous du forum.
Le Guru méditation ne m'a jamais été présenté :grin:

:smiley:

https://docs.espressif.com/projects/esp-idf/en/latest/api-guides/fatal-errors.html#guru-meditation-errors

J'ai un peu avancé : j'ai testé sur 2 PC portables, le gros et le petit.

Au départ de ce fil, les 2 sont en 1.8.9 : même chose pour les 2. Brownout.
Je passe le gros an 1.8.5 : connexion nickel du premier coup, reproductible sans aucun souci.

"Chouette", me dis-je, "j'ai trouvé !". Je passe le petit en 1.8.5 (comme avant) et re brownout.

Donc, je n'ai pas avancé dans la compréhension du problème, j'ai juste une solution de secours...

J'ai oublié de préciser que dans mon écran Préfécence de l'IDE Arduino , j'ai cette ligne pour appeler l'extension ESP32

https://dl.espressif.com/dl/package_esp32_**dev**_index.json

(version de développement)
les bugs ne sont pas les mêmes dans les versions 'stable' et developpement'.......
en moins les bugs corrigés, en plus les bugs introduits.......

Que pensez-vous de ceci :

When I turn it OFF and than ON the problem repeated. Finally I soldered a 100nF ceramic capacitor on the 3,3V output of the regulator IC on the DEVKIT and since that it works well.

et plus loin :

@royassas an others this suggests that you don't / might not have sufficient bypass capacitance :wink:
I'd recommend to put maybe 100 to 470µF in series with the Vin Pin.
Alternatively / additionally you could add another capacitor in series with the 3.3V line on the regulated output.
It might be advisable to add several capacitors, one bigger "bulk" cap and one smaller ceramic cap for quick current spikes.
Please see this excellent video(s):
General explanation: https://youtu.be/BcJ6UdDx1vg
Demonstration: https://youtu.be/1xicZF9glH0

Et à la fin

Another solution:
I use an ESP32 Doit Board. By replacing the small diode on the USB input I could successfully fix this problem. (red) Use a Schottky Diode with a low voltage drop!
Extra capacitance is good, too (yellow).
I re-soldered all ESPP32 Pins, just in case (blue).

D'autres solutions proposées :

  • Changer le câble USB (plus court, meilleure qualité)
  • Changer de port USB (certains sont plus puissants)

al1fch:
Bienvenue 68tjs !!! dommage que le premier contact ne soit pas plus probant !

je n'arrive pas à reproduire le pb

Oui, mais tu es sous Linux !

la solution 'condensateur' est citée pour une carte DEVKIT qui est moins bien dotée en régulateur 3,3V.

jamais eu de pb de brownout avec des cartes WEMOS/LOLIN authentiques (boutique WEMOS/LOLIN) tant en ESP32 qu'en ESP8266). Pour moi avant de faire de modifs sur la carte il faudrait que j'ai constaté sur la ligne 3,3V des creux de tension.

Linux , oui, par confort !!
j'ai fait l'effort de lancer Windows10 également et d'attendre patiemment la compilation et le téléchargement !!

Et ça a marché ?

Si je me lance dans la soudure de capa, je suppose que la grosse patte isolée est le GND, mais laquelle est le Vout ? Celle du milieu ? (datasheet)

lesept:
Oui, mais tu es sous Linux !

Mais aussi.
Debian Stable (Stretch).

lesept:
Si je me lance dans la soudure de capa, je suppose que la grosse patte isolée est le GND, mais laquelle est le Vout ? Celle du milieu ? (datasheet)

Il est assez courant (mais pas systématique) que la grosse patte est soit la sortie (situation assez fréquente) soit elle est isolée électriquement mais pas thermiquement.
Je ne peux pas comparer sur ma carte je n'ai pas 1117

Si je branche mon multimètre entre ces deux pattes, je ne vais pas tout bousiller ?

lesept:
Si je branche mon multimètre entre ces deux pattes, je ne vais pas tout bousiller ?

Tant qu'il est en voltmètre tu ne risque rien.
Mais s'il est en ampèremètre ou en ohmmètre "y'en a qui ont essayé, y'en a" :grin: