Micropython: Leyendo valores analógicos con el ESP8266

El conversor A/D (Analógico a Digital) es una parte fundamental de cualquier microcontrolador, ya que nos permite medir señales analógicas que varían de manera contínua, como las que entregan algunos sensores, a diferencia de las señales digitales que varían de forma discreta, es decir tienen sólo dos valores. En este artículo vamos a ver cómo acceder al conversor A/D del ESP8266 en Micropython.

El SoC ESP8266 y los módulos como el ESP12E o ESP12F cuentan con una sola entrada analógica denominada ADC/TOUT diseñada para trabajar con voltajes entre 0 y 1 Voltio. Como este es un valor demasiado pequeño para la mayoría de las aplicaciones, las placas de desarrollo como el Nodemcu, D1 mini o Wemos D1 añaden un divisor resistivo para admitir un voltaje mayor. En estas placas, la entrada al divisor resistivo se denomina A0 y es la conexión que tenemos disponible para el conversor A/D.

Divisor resistivo en el D1 mini

La relación de este divisor resistivo es de:

Esto significa que, con una tensión de entrada de 3,3 voltios en A0, la tensión en ADC/TOUT será de:

Ligeramente superior a 1V (la entrada del ADC soporta un valor un poco superior a 1V).

Este conversor tiene una resolución de 10 bits, lo que significa que puede entregar 210 = 1024 valores diferentes, desde 0 hasta 1023 correspondiendo el 0 a una entrada de 0 voltios y 1023 a una entrada de 1 Voltio (en el pin ADC/TOUT).

Combinando esto con la relación del divisor, si leemos en el conversor un valor que llamaremos lectura, podemos obtener la tensión que está aplicada en la entrada A0 con la siguiente relación:

O lo que es lo mismo (con algún redondeo):

En micropython, para leer el conversor A/D debemos emplear la clase ADC que está en el módulo machine, así que la debemos importar:

from machine import ADC

Luego, debemos instanciar un objeto de esta clase. El constructor recibe un sólo parámetro que es el canal del conversor. Como el ESP8266 tiene un solo conversor y un solo canal, debemos dejar este parámetro en 0. Por ejemplo, para instanciar un objeto de nombre conversor escribimos:

conversor = ADC (0)

Una vez creado el objeto, podemos acceder a sus métodos, teniendo dos disponibles:

read (): Devuelve la lectura del conversor A/D (entre 0 y 1023).

read_u16: Devuelve la lectura del conversor escalada a un entero de 16 bits sin signo (es decir entre 0 y 65535).

El funcionamiento del conversor A/D se puede probar conectando un potenciómetro como divisor resistivo entre 3,3V y GND, con el punto medio a la entrada A0. De este modo, en A0 tendremos una tensión variable entre 0V y 3,3V a medida que giremos el pote:

Conexión del potenciómetro a un Nodemcu

El siguiente programa es un ejemplo sencillo que muestra por la consola el valor de tensión medido:

#Conversor A/D del ESP8266

from machine import ADC
from time import sleep

conversor = ADC (0)

while (True):

    valor = conversor.read ()
    tension = (valor/1023)*(320/100)
    print ("Tension: ", tension)
    sleep (1)
Programa de ejemplo

En el video puede verse que al girar el potenciómetro hacia el lado derecho, la tensión disminuye y las lecturas también, aunque no llegan a cero aunque la tensión de entrada si lo sea. Al girar el potenciómetro hacia el otro lado, las lecturas se aproximan a 3,3V.

Errores en la conversión

Es un problema conocido que el conversor A/D del ESP8266 no es preciso. Puede tener alinealidades (no mide igual a lo largo de todo el rango de valores) y offset (mide un valor distinto de cero con una entrada de 0V). Si se necesita una conversión precisa es aconsejable utilizar un A/D externo o un sensor que devuelva un valor digital.

En próximos artículos seguiremos viendo aplicaciones de MIcropython, cualquier duda o sugerencia, pueden dejarla en la sección de comentarios.

2 comentarios en «Micropython: Leyendo valores analógicos con el ESP8266»

  1. Hola Ernesto, no conozco nada de MicroPython. Te agradecería nos informases sobre sus características, para valorar si cada uno, con nuestras peculiaridades, si nos merece la pena abordar el aprendizaje de este lenguaje de programación.
    Particularmente me interesaría saber sobre la disponibilidad de librerías, velocidad del sistema de intérprete que utiliza, facilidad de aprendizaje, etc..
    Gracias anticipadas.

    Responder
    • Hola Antonio. Micropython es una excelente opción, a menos que desarrolles aplicaciones exigentes donde cada byte y cada microsegundo importa, en cuyo caso C/C++ sigue siendo lo mas apropiado. Pero para aprender a programar, por su sencillez y facilidad de uso, es mejor micropython. Python es uno de los lenguajes mas empleados en las PCs, en infinidad de aplicaciones y se está portando mucho de ese desarrollo a micropython, asi que es fácil conseguir librerías para el hardware que uses o la aplicación que quieras desarrollar. El interprete está muy optimizado y no hay que preocuparse por la velocidad, sobre todo en los procesadores modernos que tienen frecuencias de trabajo elevadas. Creo que en los próximos años vamos a ver cada vez mas aplicaciones de micropython en placas y módulos de potencia media, relegando a otros lenguajes.

      Responder

Deja un comentario

Este sitio usa Akismet para reducir el spam. Aprende cómo se procesan los datos de tus comentarios.

A %d blogueros les gusta esto: