Saltar al contenido

Entradas Analógicas

Hola controleros y controleras, en esta entrada aprenderemos a programar las entradas analógicas (ADC) en MicroPython y para eso usaremos la poderosa Raspberry Pi Pico o también el NodeMCU8266.

Antes de comenzar, te hago la invitación que aprendas a programar microcontroladores con nuestro Curso Gratuito de MicroPython.

MicroPython

Y que te suscríbas al canal si te interesa la programación de microcontroladores o la teoría del control.

Entradas Analógicas ADC

Con las entradas analógicas tenemos la posibilidad de captar las señales del mundo real temperatura, velocidad, peso, caudal, etc) con nuestro microcontrolador Raspberry Pi Pico, NodeMCU8266, o cualquier otro.

Una señal analógica toma diferentes valores en el tiempo a diferencia de la señal digital que es binária (OFF-ON).

En la siguiente figura podemos ver una señal analógica, que representa una función sinusoidal junto con una aproximación discreta.

analogo digital
Conversión Analógica – Digital (ADC) de una señal senoidal.

El microcontrolador tiene la capacidad de leer señales analógicas realizando aproximaciones discretas a través de pequeños rectángulos digitales como fue observado en la figura anterior, donde podemos ver fácilmente, que entre más pequeños sean los rectángulos, más parecido será la aproximación digital con relación a la señal analógica.

El convertidor de analógico a digital (ADC) Raspberry Pi Pico

El microcontrolador RP2040 de la Raspberry Pi Pico posee un convertidor de analógico a digital (ADC ) con el cual toma una señal analógica y la cambia a digital.

Un ADC tiene dos características clave: su resolución, medida en bits, y sus canales, o cuántas señales analógicas puede aceptar y convertir a la vez.

El ADC en su Pico tiene una resolución de 12 bits, lo que significa que puede transformar una señal analógica en una señal digital como un número que va de 0 a 4095, aunque esto se maneja en MicroPython transformado a un número de 16 bits que va de 0 a 65.535, para que se comporte igual que el ADC en otros microcontroladores MicroPython.

El microcontrolador RP2040 tiene cinco canales ADC en total, cuatro de los cuales están en los GPIO del chip: GP26, GP27, GP28 y GP29.

Sin embargo en la tarjeta de la Raspberry Pi Pico solo tiene tres canales en los pines GPIO: GP26, GP27 y GP28, que también se conocen como GP26_ADC0, GP27_ADC1 y GP28_ADC2 para los canales analógicos 0, 1 y 2. También hay un cuarto canal ADC, que está conectado a un sensor de temperatura integrado en RP2040 y el quinto se puede usar para medir el voltaje VSYS en la placa.

Raspberry Pi Pico Pines

Rango de voltaje de entrada ESP8266

El rango de voltaje de entrada del pin ESP8266 ADC es de 0 a 1 V si solo se emplea el chip. Sin embargo, la mayoría de las placas de desarrollo ESP8266 vienen con un divisor de voltaje interno (como la NodeMCU8266 Lolin) por lo que el rango de entrada es de 0 a 3,3 V

Resolución ESP8266 ADC

El pin ADC tiene una resolución de 10 bits, lo que significa que obtendrá valores entre 0 y 1023.

Pin analógico ESP8266

Con el kit ESP8266 12-E NodeMCU y otras placas de desarrollo ESP8266, posee un único PIN ADC (A0), con el cual podemos leer el estado de nuestros sensores.

Lectura ADC con MicroPython

Para conseguir leer los pines ADC de nuestro microcontrolador usando MicroPython vamos a necesitar el método ADC del modulo machine. Por lo tanto debemos importar la biblioteca bien sea de forma selectiva o completa y posteriormente declarar la instancia.

import machine

sensor = machine.ADC(26)

 

O de forma equivalente:

from machine import ADC

sensor = ADC(26)

 

Esto configura el pin GP26_ADC0 como el primer canal, ADC0, en el convertidor de analógico a digital de la Raspberry Pi Pico.

Para leer la señal análoga usamos el método read_u16 (). La última parte, u16, simplemente advierte que en lugar de recibir un resultado binario de 0 o 1, recibirá un entero de 16 bits sin signo, un número entero entre 0 y 65.535.

 
print(sensor.read_u16()) #Imprime la conversión a 16 bits
 

Sin embargo, en algunos microcontroladores como el ESP8266 también tenemos el método read() el cual nos retorna el valor en bits dependiendo del microcontrolador utilizado, en este caso nos devuelve el resultado a 10bits.

 
print(sensor.read()) #Imprime la conversión a 10 bits (ESP8266)
 

En micropython cuando usamos el método read_u16() se hace una conversión en los dispositivos de 12bits (RP2040, ESP32) usando una expansión de Taylor para convertirlo en 16 bits, pero en dispositivos de 10bits (ESP8266) se usa un multiplicador «65535/1024» para cambiar de 10 bits a 16 bits.

Después de usar el método de lectura ADC veremos en el Shell una representación decimal de la salida sin procesar del convertidor de analógico a digital. Para transformarlo a voltaje podemos usar el siguiente factor de conversión:

16 bits

\rm factor\_16 = \dfrac{3.3}{65535}

10 bits

\rm factor\_10 = \dfrac{3.3}{1023}

Es importante medir que el voltaje de alimentación efectivamente sean 3.3v para tener una conversión más exacta, si el voltaje es menor (como en mi caso que es a 3.21v) colocar el voltaje real en el factor de conversión.

Esto establece una forma matemática de convertir el número que le da el convertidor de analógico a digital en una aproximación justa del voltaje real que representa.

while True:
	voltaje = sensor.read_u16() * factor_16
	print(voltaje)
	utime.sleep(2)

Medición de Temperatura con la Raspberry Pi Pico

El microcontrolador RP2040 de la Raspberry Pi Pico tiene un sensor de temperatura interno, que se lee en el quarto canal del convertidor de analógico a digital ADC.

Para eso definimos una instancia con el ADC 4:

sensor_temperatura = machine.ADC(4)

Realizamos una conversión de 16 bits a voltaje con la conversión vista anteriormente. Y finalmente podemos transformar ese voltaje en temperatura.

\rm temperatura=27 - \dfrac{voltaje - 0.706}{0.001721}

El programa en MicroPython para leer el sensor de temperatura interno de la Raspberry Pi Pico sería el siguiente:

from machine import ADC
from utime import sleep


def main():    
    sensor_temp = ADC(4) #Sensor interno de temperatura
    factor_16 = 3.3 / (65535)
    
    while True:        
        voltaje = sensor_temp.read_u16() * factor_16
        temperatura = 27 - (voltaje - 0.706)/0.001721
        print(temperatura)
        sleep(2)
        
    
if __name__ == '__main__':
    main()

Ejemplo ADC MicroPython

Vamos a realizar una lectura ADC con la Raspberry Pi PICO y con la NodeMCU8266 usando Micropython.

Para este ejemplo, conectaremos un potenciometro en el pin ADC del microcontrolador y visualizaremos en el Shell de Thonny la lectura del voltaje que va a variar entre 0-3.3v

Se debe mostrar en el Shell, el valor en formato 16 bits con su conversión en voltaje.

Y adicionalmente mostrar el valor en formato de la resolución del ADC del microcontrolador con su conversión en voltaje.

Los esquemas electrónicos serán los siguientes:

ADC MicroPython Raspberry Pi Pico

Los códigos en MicroPython:

"""
Programa de Ejemplo lectura ADC
by: Sergio Andrés Castaño Giraldo
Sitio web: https://controlautomaticoeducacion.com/
Canal de YouTube: https://www.youtube.com/c/SergioACastañoGiraldo
"""

from machine import ADC
from utime import sleep


def main():
    # True: Raspberry Pi Pico
    # False: NodeMCU ESP8266
    placa = True
    
    if placa:
        potenciometro = ADC(26) #Raspberry Pi Pico ADC0
    else:
        potenciometro = ADC(0)  #NodeMCU8266v3 ADC0
        factor_10 = 3.3 / (1023) #Se puede leer con read()
    
    factor_16 = 3.3 / (65535)
    

    while True:
        
        if not placa: #NodeMCU ESP8266
            bits = potenciometro.read();
            volts_10 = bits * factor_10
            print('\nValor en 10 bits: {}, y en volts: {}'.format(bits, volts_10))
            
        bits_16 = potenciometro.read_u16();
        volts_16 = bits_16 * factor_16
        
        
        print('Valor en 16 bits: {}, y en volts: {}'.format(bits_16, volts_16))
        sleep(1)
        
        
if __name__ == '__main__':
    main()

Eso es todo por la entrada del dia de hoy, espero les haya gustado y hayan aprendido algo nuevo. Si te ha servido el contenido de esta entrada, de los videos y los códigos de implementación y deseas apoyar mi trabajo invitandome a un café super barato, puedes hacerlo en el siguiente link:

👉 Invitar a Sergio a un Café ☕️

Que esten muy bien, nos vemos en la siguiente entrada.