ESP32: Solución IoT con Dual Core, WIFI y BLE

0
187
GARD Pro Not Registered

Anteriormente en Panama Hitek se ha escrito sobre el ESP8266, el cual es el hermano menor o el predecesor del ESP32. Las tarjetas ESP se caracterizan por tener la capacidad de conectarse a WiFi de forma nativa. También son muy económicas y tienen la capacidad de comunicarse con Arduino o ser programadas como un Arduino (poseen un microcontrolador).

El ESP32 trae ventajas muy claras frente al modelo anterior, tales como la inclusión de un segundo procesador (es decir, posee 2 núcleos). Además  se ha añadido la posibilidad de utilizar Bluetooth Low Energy (BLE), el cual es un atractivo para proyectos de tipo IoT. Se ha expandido la cantidad de GPIOs; y ahora se cuentan con más pines de lecturas análogas a digitales (ADC). Se incluyeron dos pines de salida digital a análoga (DAC), lo cual es sumamente atractivo para ciertos proyectos con audio. Se debe resaltar el hecho que hasta ahora, casi ningún modelo de Arduino o microcontrolador similar posee un DAC integrado.

Las ventajas qdel ESP32 frente a su predecesor no se quedan allí. Al poseer un segundo núcleo, este se dedica únicamente para manejar los eventos de WiFi (por defecto), aunque se le pueden asignar tareas específicas. Esto permite una ventaja contra el ESP8266, el cual tiene que detener ciertos eventos para procesar las actividades del WiFi. Otra de las ventajas es la posibilidad de utilizar más sensores de lecturas análogas sin la necesidad de utilizar multiplexores.

ESP32 pinout

Especificaciones
  • 3 x SPI
  • 2 x I2S
  • 12 x ADC input channels
  • 2 x DAC
  • 2 x I2C
  • 10x capacitive touch interface
  • Procesador doble núcleo de 240MHz
  • 520 KB SRAM
  • 16MB Flash
  • 802.11BGN HT40 Wi-Fi
Disponibilidad
  • Amazon, Ebay, Sparkfun, Adafruit, otros.
  • Costo en el mercado: aproximadamente 15 USD
Consumo de corriente
  • Conectado a WiFi, standby @5V : 150mA
  • Conectado a WiFi, GET request @5V: 170mA
  • Sin conexión a WiFi, DHT22 @5V: 60-70mA

Pruebas realizadas con una placa de desarrollo de espressif.

Instalación en Arduino IDE

Página principal de github: https://github.com/espressif/arduino-esp32

GARD Pro Not Registered

Instalación en Windows: https://github.com/espressif/arduino-esp32/blob/master/doc/windows.md

Problemas actuales

Al ser un módulo relativamente nuevo, tiene varios problemas en la implementación de Arduino.

  • No hay una función similar a analogWrite(), aunque hay formas de sobrellevar eso: LEDC, SigmaDelta y DACs.
  • La implementación de Bluetooth aún no está terminada.

Para solventar lo de la función de analogWrite(), lo más común es utilizar uno de los 16 canales disponibles de LEDC. Esta implementación se puede encontrar en el siguiente ejemplo.

Puede ser un poco complicado utilizar el ejemplo anterior cuando se desean utilizar varios pines. Para eso he creado una librería que se encarga de esa implementación de LEDC. La pueden encontrar aquí. Es solo cuestión de descargarla y copiarla en la carpeta de librerías de Arduino.

GARD Pro Not Registered
Ejemplo #1

Este ejemplo muestra la utilización de la librería mencionada anteriormente. Es básicamente el mismo ejemplo de la implementación de LEDC por parte de ESPRESSIF, solo que con toda la lógica repetitiva dentro de un objeto. El ejemplo se encuentra disponible en nuestro repositorio de Github.

ESP32 LEDC

Ejemplo #2

Código tomado de una publicación anterior. Se utiliza un sensor DHT22 para leer datos de Humedad y Temperatura. Solo se cambio el pin a utilizar y se hicieron las conexiones respectivas en el ESP32. El ejemplo se encuentra disponible en nuestro repositorio de Github.

ESP32 DHT22

 

ESP32 DHT22: Consola serial

Utilización de la librería “ESP32-LEDC”

Como se explica anteriormente, esta librería intenta hacer el código mas corto y mas fácil de leer. Es el sustituto por defecto de la función analogWrite(). La ventaja de esta librería con respecto a  analogWrite() es que permite cambiar la frecuencia del dispositivo.

Para empezar a utilizarla, debemos descargarla e incluirla en nuestro programa.

Luego debemos instanciar nuestros objetos. Es decir, cada LED (o salida) podremos instanciarla como:

Note que el primer parámetro es el numero de pin a utilizar, mientras que el otro significa el canal a utilizar. El rango de los canales es de 0-16.

Este objeto creado tiene como valor mínimo cero (0) y valor máximo 255. Este valor máximo se puede modificar una vez creado el objeto (o bien en el momento de creación).

De forma tal que los rangos de valores sean:

  • 0-1024 para el objeto led1
  • 0-2048 para el objeto led2
  • 0-512 para el objeto led3

Si se desea incluir en el momento de la creación, se puede hacer de la siguiente forma:

Para poder utilizar este objeto es necesario utilizar el método setup en la función setup() del programa. Esto es el equivalente a pinMode(), solo que se llama sin parámetros.

Para cambiar el valor actual, utilizamos el método set(value). Esto es el equivalente a analogWrite(value).

Para trabajarlo como si fuera un pin digital (ENCENDIDO o APAGADO), se utilizan los metodos on() y off().

Uso de los DAC

Otra alternativa a analogWrite() es utilizar algún DAC  (Digital to Analog Converter). Hay dos (2) pines disponibles para esto (25 y 26).  La función se muestra a continuación.

El valor máximo que admite el parámetro es 255. Es decir, un numero entero de 8bits. Esta es la resolución que se tiene de estas salidas.

El DAC produce un output entre 0-3.3V, en donde 3.3V equivale a un valor de 255 digital, y 0V equivale a 0 digital. Con este es posible crear una onda senoidal debido a que es mas preciso que el PWM.

Conclusiones

El ESP32 es una opción muy interesante para el desarrollo de proyectos basados en sistemas embebidos. El hecho de contar con WiFi y BLE integrados le brinda la versatilidad que requieren los proyectos que aplican el concepto de Internet of Things. La disponibilidad en el mercado local (Panamá) es reducida, pero en los mercados internacionales podemos encontrarlos fácilmente. El precio de venta es accesible (~15.00 USD) y las prestaciones son muy altas en comparación a un modelo estándar de Arduino.

Esperamos que la información presentada sea de su agrado. Saludos.