Documentación Técnica

Juego de conectores de expansión

Casi todos los pines ESP32 IO disponibles están disponibles en la ranura de expansión. La ranura de expansión contiene 13 pines en la parte superior, 13 pines en la parte inferior y 5 pines en el medio. Además, el adaptador de programación (RX/TX) incluye dos pines de extensión. Todos los pines están etiquetados en la tarjeta, en la parte delantera con un tamaño de letra pequeño por razones de espacio, y en la parte trasera con un tamaño de letra fácil de leer:

Hemos dado importancia a que los pines usados que se pueden utilizar en paralelo (p.ej.: pulsador, LED1, LED2, IO36 para la medición de tensión) también estén disponibles en la ranura de expansión. Por lo tanto, hay muchas posibilidades de extensión disponibles.

Si es necesario, las tarjetas de expansión se pueden enchufar en la parte superior o, alternativamente, se pueden enchufar desde abajo. Para que sea lo más flexible posible, los conectores hembra (2 x 13 pines) no están soldados, pero se incluyen en el envío.

Interfaz estándar de Arduino SPI e I2C

Las interfaces SPI e I2C están disponibles en la ranura de expansión. La interfaz SPI también se utiliza para LoRa, la interfaz I2C ya se utiliza para el reloj (RTC) y para el sensor externo de temperatura/humedad. Tenga en cuenta que las interfaces SPI o I2C no deben ser utilizadas simultáneamente por el software RadioShuttle y sus propias aplicaciones.

I2C se puede utilizar dentro del “loop”, ya que RadioShuttle no accede a él al mismo tiempo.

Con SPI solamente tiene sentido utilizar SPI si LoRa no está activo. Con la función UpdateNodeStartup(RS_Node_Offline), también se puede desactivar temporalmente el LoRa. Alternativamente, las interrupciones pueden ser desactivadas durante el propio acceso SPI.

Instalación de la antena de alambre

La antena de alambra suministrada debe soldarse en el orificio de soldadura suministrado (marcado “ANT”) en la parte inferior derecha de la tarjeta y, a continuación, acortarse a 8,2 cm. Por lo tanto, la antena λ/4 está adaptada para 868,1 MHz.

La fórmula exacta para calcular la longitud de la antena es:

Longitud de onda = velocidad de luz / frecuencia

Para λ/4, este valor debe dividirse de nuevo por 4.

Dado que el orificio de soldadura ya actúa como antena y hay que tener en cuenta un factor de acortamiento, 8,2 cm son suficientes.

La tarjeta ESP32: asignación de pines e interrupciones

Conector de antena SMA o U.FL

El enchufe SMA se puede soldar fácilmente. A continuación, abra el puente de soldadura de la antena a la derecha de la antena de alambre y añada un puente de soldadura hacia arriba a la línea SMA.

Un enchufe U.FL ya está soldado. Para esta función, el puente de soldadura de la antena a la derecha de la antena de alambre debe ser abierto y un puente de soldadura a la parte inferior de la línea SMA debe ser añadido. Tenga en cuenta que la hembrilla U.FL sólo está diseñada para unas pocas conexiones, por lo que recomendamos utilizar una conexión SMA, que se puede atornillar tantas veces como sea necesario.

Los puentes de soldadura de la antena deben fijarse de forma fina y delgada para que no influyan en la funcionalidad. Sólo se puede ajustar un puente de soldadura a la vez, ya sea una antena de alambre, o SMA, o U.FL.

Encender/apagar la tensión “VDD-SW” para cargas externas

Un interruptor de voltaje interno permite que los consumidores externos de energía se enciendan y apaguen para que no consuman energía permanentemente. El pin de E/S “EXT_POWER_SW” se define en el archivo “PinMap.h” del software RadioShuttle para la conmutación. Se puede cambiar a “EXT_POWER_ON” o “EXT_POWER_OFF”. La medición de la tensión de la batería, que se mide a través de los pines ADC “BAT_POWER_ADC”, se fija al cable “VDD-SW”. Las funciones extendidas del reloj RTC ya se utilizan en la línea “VDD-SW”. Para asegurar que la tarjeta requiere la menor potencia posible, el “VDD-SW” suele estar apagado.

La tarjeta ECO Power: realizar un reinicio

La tarjeta ECO Power no tiene la posibilidad de efectuar un reinicio para la programación a través de USB. La línea de control serie utilizada con otros módulos no está disponible en el adaptador de programación. Por lo tanto, se requiere una combinación de teclas especial para la programación, todos los detalles se describen en el capítulo Puesta en Servicio.

5 V pin en la ranura de expansión

El pin USB 5 V de la ranura de expansión se conecta directamente al pin de 5 V del adaptador de programación o a la fuente de alimentación externa micro USB. Se dispone de un fusible de rearme (500 mA) para la fuente de alimentación externa micro USB. Sin embargo, no hay ningún fusible para la alimentación a través del adaptador de programación USB. En el funcionamiento a batería sin fuente de alimentación USB, no se aplica tensión al pin de 5 V.

Si se conecta una fuente de alimentación externa a través del adaptador de programación, también puede ser superior a 5 voltios (máx. 9 voltios). Por lo tanto, el uso del cable USB directo de 5 V debe ser manejado con cuidado; un cortocircuito puede a veces destruir el puerto USB de la computadora, al igual que con otros consumidores USB también.

Sensor de temperatura y humedad

El sensor ofrece la posibilidad de medir la temperatura y la humedad exacta de una manera que ahorra mucha energía. No se debe quitar el fieltro blanco del sensor, ya que tiene una función protectora para que el sensor funcione correctamente. Se utiliza un sensor “SI7021-A20-GM1” de Silicon Labs, el controlador está incluido en el software RadioShuttle.

Conectar el sensor

El sensor se conecta a través del bus I2C y requiere cuatro líneas (GND, VDD, SCL, SDA). Las siguientes opciones de instalación están disponibles:

  • Enchufe o suelde el sensor en la parte superior izquierda de la tarjeta utilizando la regleta de bornes
  • Enchufe o suelde el sensor en la parte superior izquierda debajo de la tarjeta utilizando la regleta de bornes
  • Instale el sensor externamente a través de un cable alargador (no incluido), por ejemplo, fuera de la carcasa o directamente en un calentador, etc.

Preste atención al orden de los pines (“GND” está fuera); el sensor tiene dos lados de conexión y puede girarse de modo que un lado encaje según la instalación (superior o inferior).

Nota:
Dos componentes (resistencias opcionales) en el sensor no están equipados intencionalmente, son resistencias pull-up I2C, que ya están incluidas como 10 kΩ en la placa principal. Para un sensor externo con cables largos, puede ser útil soldar dos resistencias de 1 kΩ (incluidas) para obtener señales estables. Una opción adicional es reducir la velocidad del I2C. Compartiremos nuestra experiencia aquí más adelante.

Uso del software del sensor

Si está conectado, el sensor está permanentemente activo, pero sólo necesita aprox. 1 μA mientras no se lean los valores del sensor. Cuando la tarjeta ECO Power está conectada (fuente de alimentación conectada o reiniciada), el sensor se inicializa una sola vez y se emite la temperatura con los mensajes de inicio. Si la tarjeta está en “deepsleep” (“RadioShuttle RS_Node_Offline”), los valores de los sensores se miden automáticamente y se muestran de nuevo al despertar periódicamente (aprox. cada 10 segundos). El código para ello se encuentra en el archivo “RTCUtil.cpp” de la aplicación de muestra “RadioTest”.

Se recomienda no leer innecesariamente el sensor permanentemente, ya que cada lectura de los valores toma tiempo y consume energía durante este tiempo. La lectura de la temperatura tarda unos 13 ms, la de la humedad del aire unos 20 ms. Durante este tiempo, el ESP32 MCU está activo.

Medición de la tensión de la batería

Para medir la tensión de alimentación del VDD (aprox. 3,3 voltios cuando se alimenta a través de USB, aprox. 3,0 voltios con funcionamiento por batería) se incluye un dispositivo de medición en la tarjeta. La tensión de la batería se muestra con una precisión de unos 100 mV. La tensión se mide y se muestra al arrancar o reiniciar. La función GetBatteryVoltage() en el archivo “RTCUtil.cpp” mide y devuelve el valor de la tensión.

Precisión del convertidor analógico-digital (ADC) ESP32

Para aumentar significativamente la precisión de las mediciones de ADC en la tarjeta ECO Power, la referencia de tensión interna del procesador ESP32 se mide durante la producción de las tarjetas ECO Power y se almacena internamente en la memoria eFuse. La función GetProperty(prop.ADC_VREF, 1100); permite recuperar el valor en milivoltios para realizar un cálculo preciso de las mediciones ADC. Dado que casi todos los módulos del ESP32 tienen una desviación en su voltaje de referencia interno (1.100 voltios), la calibración de las tarjetas ECO Power para mediciones de ADC más precisas es una gran ventaja.

La consigna analógica interna del ESP es de aprox. 1.100 voltios (ajuste “Attenuation ADC_0db”), otras tensiones de referencia (p. ej. 6 db = aprox. 2,2 voltios) sólo se derivan de la consigna interna de 1.100 voltios (0 db). Por lo tanto, para las mediciones de ADC se recomienda utilizar el voltaje de referencia de 1.100 voltios (“ADC_0db”) de inmediato, ya que fue medido y, por lo tanto, calibrado durante la producción de la tarjeta ECO Power.

El ADC ofrece una precisión de hasta 12 bits (12 bits = 4.096 gradaciones) en un rango de tensión de 0-1.100 voltios (tensión de referencia aprox. 1.100 voltios). Desafortunadamente, estas 4.096 gradaciones del ADC interno del ESP32 no son lineales, lo que afecta a la precisión de las mediciones del ADC. Para lograr mediciones ADC más precisas es necesario que ambos convertidores internos, ADC0 y ADC1, creen y utilicen sus propias tablas de consulta para la linealización.

Como ya se ha mencionado anteriormente, las mediciones precisas de ADC sólo son limitadas, o sólo son posibles con un mayor esfuerzo de calibración. Un tema en el que el fabricante, Espressif Systems, debe seguir trabajando.

ESP32 “deepsleep” y despertar

Durante el modo “deepsleep” (p. ej. en el modo “Node Offline”) la MCU se apaga por razones de ahorro de energía. La única unidad que funciona durante el “deepsleep” es un reloj interno ESP32 (RTC, que no debe confundirse con el RTC externo), que despierta a la MCU en eventos externos. Estos eventos externos pueden ser cambios de pines GPIO o una función de despertador periódico.

Los siguientes pines soportan la función de despertador en el modo “deepsleep”:

IO 0
IO 2
IO 4
IO 12-15
IO 25-27
IO 32-39

Además, la MCU se activa brevemente cada 10 segundos y hace que el LED1 parpadee brevemente como indicador de actividad. Sin embargo, esto se hace sin poner en marcha la MCU completamente. Cada minuto (definible) la MCU se inicia completamente para permitir que los programas comprueben periódicamente si hay alguna tarea que hacer – esto ahorra energía. Las siguientes funciones afectan al tiempo de reposo y al número de pasadas:

FunciónValor por defectoMin … Max
ESP32SetDeepSleepDuration(int ms)10 000 ms200 ms … 1 200 000 ms
ESP32SetDeepSleepBlinkDuration(int µs)100 µsSe recomienda un máximo de 10 000, para evitar un aumento significativo del consumo de energía
ESP32SetDeepSleepWakeupInterval(int count)6 passes
Una vez que se han completado los pases, se produce un despertar (tiempo total = pases x duración)

ESP32 “sleep” y despertar

La función sleep() simple se utiliza cuando ya no quedan tareas por hacer. Permite que la CPU actual se duerma y espere por eventos como interrupciones, temporizador, etc. La memoria completa se conserva y el periférico sigue funcionando. Por lo general, una interrupción del sistema se produce 1 000 veces por segundo, por lo que el LED1 (verde) parpadea ligeramente. La función “sleep” también ahorra energía, evitando que la CPU se caliente. Sin embargo, a pesar de que “sleep” todavía se necesita una corriente de aprox. 55 mA, con “deepsleep” es de aprox. 7 µA.

La función sleep() se ejecuta dentro de la función loop() tan pronto como ya no hay tarea que hacer. Un bucle infinito dentro del bucle (“polling”) no es recomendable y debe ser evitado. La programación limpia debe estar basada en eventos y no en encuestas. Esto se aplica no sólo al ESP32 sino a todos los programas, también bajo Windows, Linux, Mac, y en particular en aplicaciones integradas.