ESP32 - Segundo Core

Hola.

Tengo muchos problemas al ejecutar tareas en los dos cores del ESP32.

Sólo lo consigo con tareas triviales, en el momento que les doy un poco de caña.... entra en panico, se suicida y termina rebotando.

A veces algo tan arbitrario como cambiar la definición de un char array de 200 posiciones de local en el método llamado por el loop2 a poner la variable definida a nivel global, resuelve el problema.

No adjunto código por no aburrir, solo quiero saber vuestra opinión y preguntar si verdaderamente alguien ha conseguido hacer un proyecto interesante con el ESP32 y usando los dos cores.

Intento hacer algo tan sencillo como dedicar un core a recibir peticiones WIFI para contestar valores de temperatura a un móvil y el core2 para ir tomando lecturas de un DHT22 y grabarlas en una tarjeta SD.

INCAPAZ!!!!!

Me funciona solo si meto todo en el mismo loop() sin usar el segundo core.

He contactado con una empresa en mi localidad que trabaja con microcontroladores y dejaron hace algún tiempo de usar el ESP32 porque dicen que no está bien implementado el trabajo de los dos cores y hay un montón de conflictos entre tareas, memoria, etc... Ellos lo identifican con las librerías que dan solución a los distintos dispositivos y que puede que no tengan el nivel de sincronización suficiente para atender a tareas en paralelo...... en fin.... tiene sentido.

Antes de titar los 10 ESP32 que tengo a la basura... ¿Alguna palabra de ánimo? ¿Algún consejo?

(Bueno no los iba a tirar, pero a partir de ahora serán ESP8266 con más memoria y sobre todo con más pines, porque también he leído que la implementación del bluetooth da problemas).

Otra pregunta abusando de los que hayan llegado leyendo hasta aquí (y que me perdone surbyte por el off-topic, ¿Cómo demonios se busca algo en el foro limitando las respuestas a español? my english is deplorable!!!! (lease: mai inglis is deplorebol)

Gracias
Javier

Hola

Debe asegurarse de que la tarea tenga suficiente memoria asignada para su stack (no es sólido "como una roca")

1 Like

No me lo puedo creer!!!!!!!

Muchas gracias por tu comentario, subiendo la memoria funciona perfectamente.... pero podía dar alguna pista!!!!!

Acostumbrado a trabajar a alto nivel no he caído en esto.

No sabes la de horas que me he pegado rompiéndome el cráneo.

Gracias, gracias, gracias.... ya no los tiro.

:joy:

:smile:

Otra pregunta...

Ahora que trabajo con los dos cores parece que consume más el ESP. De hecho utilizaba una fuente de cargar móviles de 5V para alimentar todo el circuito (Pantalla LCD, ESP32 y éste a su vez alimentaba el sensor de temperatura). Lo hacía metiéndole al ESP la tensión por el pin de 5V.
Sin embargo ahora no llega a arrancar ... le tengo que aplicar la tensión directamente por el USB, saco del ESP la tensión para el resto y ya todo funciona.
¿Tiene sentido?

Os mando una foto del prototipo, porque estoy muy contento...

Saco en una página web el grafico de evolución de temperatura, ya que voy guardando en la SD valores cada minuto.... muy chulo.

El lm2596 no lo uso, fue al principio, pero no daba para todo...

Hola, según tengo entendido ESP32 funciona a 3.3V y todos sus pines, y estos no toleran 5v, cuando conectas a través del conector y por 5v o VIN pasa por un regulador de 3.3v, en la foto no se logra apreciar bien las conexiones.

Utilizo un devkit del ESP32 que incluye un pin de 5V que tiene en la propia placa su regulador.
Hasta ahora lo alimentaba por ahí, pero ahora no le vale y lo tengo que meter por el USB...creía que era igual y tal vez no... posiblemente porque al alimentarlo por el pin está compartiendo la alimentación con los otros elementos... Es suposición, quería saber vuestra opinión.

Mira revisando el schematic de la placa tienes esto:

  • Cuando alimentas por el USB pasa a través de un diodo lo que generara una caída de voltaje de 0.3V entonces si tu mides entre GND y el pin de VIN o 5v obtendrás 4.7v que será el voltaje que alimente al regulador de 3.3V para el ESP y todo lo que tengas conectado en el pin de 5v,claro todo esto mientras no estés alimentando por el pin de 5V.
  • Cuando alimentas por el pin de VIN o 5v el diodo que tienes antes el USB evita que pase el voltaje al puerto USB, ya no abra la caída de 0.3V y este pasa a través del regulador de 3.3V que alimenta al ESP32.

Entonces si, en parte es lo mismo solo te saltas un diodo cuando alimentas a través del pin 5v o VIN
Ahora el consumo que tienes es el siguiente:

  • DHT22 = 2.5mA
  • ESP32 = 260mA con todo funcionando Bluetooth y Wifi
  • LCD = 130mA

En total necesitas que la fuente pueda suministrar mas de 392.5 mA o 0.392A a 5V.

Ahora a tener en cuenta, el DTH22 esta conectado en el riel de 5v o es lo que me parece según la foto, lo cual en su pin de salida de datos hay niveles lógicos de 5v entonces como dije anteriormente el ESP32 no tolera voltajes de 5V con lo cual dañaras el pin.

Gracias Swift, por tu respuesta.

Algo debo tener mal, porque dices:
"En total necesitas que la fuente pueda suministrar mas de 392.5 mA o 0.392A a 5V."
Y utilizo un alimentador de móvil en el que pone max 2A.

Por otro lado el LCD hay que alimentarlo a 5V. ¿Cómo puedo evitar que en su pin de salida de datos suba de 3,3V? ¿Puedo alimentar el LCD con 3.3V?

Sobre el segundo core....

En el mismo proyecto tengo otro ESP32 que hace de frontal para el móvil y sirve una página WEB.

Como me he venido arriba con los dos cores, he dedicado uno a cada interfaz (HTTP para el WEB y TCP puro para el móvil). He tenido que subir la memoria del core0 a 100.000 bytes (unos 98Kb).

Funciona bien, pero de vez en cuando suelta un error y se inicializa:

"Task watchdog got triggered. The following tasks did not reset the watchdog in time:"

¿Hay que hacer algún código para trabajar con el WatchDog? Parece que el watchdog no recibe señal en un tiempo y decide reiniciar el procesador.

He probado subiendo y bajando memoria por si tenía problemas con eso... si subo mucho no responde y si bajo mucho da el error con más frecuencia.

Tal vez hay límites que desconozco y no encuentro documentación para entenderlo. La memoria que se asigna el la HEAP que es para las instancias de los objetos que crea el código, hay mucho String para la pagina HTML, pero 98KB debería ser suficiente... el resto de instancias, bufferes etc, pueden llegar a llenarla... pero se tendría que limpiar a medida que se dejan de referenciar.
Supongo que hay un "garbage collector" ¿o es mucho suponer?

Finalmente, tras estudiar distintas estrategias de levantar y parar procesos, he llegado a la conclusión de que es el trabajo con la WIFI lo que deja los procesos sin hablar con el watchdog un periodo de tiempo excesivo haciendolo saltar. No se si es correcto, estoy mezclando distintos comentarios de foros.
Por ello he deshabilitado el watchdog del core 0 donde corro el proceso que me daba los problemas y funciona correctamente. He verificazdo que no se calienta no hace cosas raras. utilizo el método:

disableCore0WDT();

si tiene tareas que requieren tiempo, es posible que se active el "watchdog". Puedes llamar a yield(); de vez en cuando para calmar al perro :wink:

Al alimentar la LCD con 3.3V no va a funcionar, se puede hacer una modificación a la lcd para que funcione a 3.3V Hack Your 16×2 LCD, otra opción es utilizar un modulo para convertir tu LCD en I2C y esta un adaptador de nivel lógico o vi un tutorial que le desoldaban las resistencias pull-up al modulo I2C Pantalla LCD de 5V con Arduino Due 3.3V I2C revisa esos enlaces.

Tienes multiplicidad de problemas por saltearte evidentemente muchas etapas de la curva de aprendizaje que todos debemos hacer.

Tal vez mi comentario llegue tarde pero igual lo haré.
Mira por donde comienzo a responderte:

  1. Un LM2596 que puede entregar 3A no es suficiente para tu proyecto? Eso no lo creo. Me dirás que no puede entregar los 400mA que necesitas? Obviamente que si puede. De modo que el problema esta en otro lado. Creo que @Swift lo explica con buen detalle.
    Tienes varios elementos que estas mal utilizando.
  2. Si usas sensores como el DHT22 aliméntalo con 3.3V no 5V , deja de llevar a los GPIOs del ESP32 a situaciones no toleradas de 5V. El DHT22 funciona desde 3 a 5V de modo que puedes alimentarlo con 3.3V
  3. El LCD no trabaja a 5V, sigue el consejo de @Swift aunque usar un módulo I2C es una buena sugerencia.
  4. He visto trabajos con el ESP32 y claramente se deben tener en cuenta ciertas consideracionies.
    No entendía porque usabas el watchdog pero viendo que lo has desabilitado creo que es un tema ya resuelto.
    Sin mas datos es dificil darte mas sugerencias o consejos.

Moderador:
Recuerda que toda consulta que no sea de Arduino va en la sección Microcontroladores, que es donde he movido tu consulta.