Tutorial #3 de Raspberry Pi Pico: GPIO analógico

En este tutorial veremos como manejar las entradas y salidas GPIO analógicas de tu Raspberry Pi Pico. Para desarrollar este tutorial necesitas los siguientes materiales.

  • Raspberry Pi Pico
  • Cable micro USB
  • Potenciómetro de 10 KOhms
  • LED verde
  • Resistencia de 330 ohms
  • Jumpers tipo M-M

Entendiendo las señales analógicas

A diferencia de las señales digitales que sólo manejan dos valores posibles, cero o uno, apagado o encendido, las señales analógicas pueden comprender un amplio rango de valores. Las señales analógicas son muy utiles cuando tratamos con magnitudes que no se pueden interpretar como cierto o falso, abierto o cerrado; por ejemplo, muy frío, tibio, caliente o hirviendo. Las señales analógicas pueden provenir de sensores de gas, luz, temperatura, micrófonos etc.

El convertidor analógico-digital

Para que un dispositivo digital pueda leer una señal analógica necesita de un elemento llamado convertidor analógico-digital o ADC por sus siglas en inglés. Para poder configurar el convertidor digital necesitamos simplemente especificar el pin por donde se va a leer la señal. Usaremos la función machine.ADC() con el pin dentro de la función. En este caso, leemos el valor directamente con potentiometer.read_u16(), lo multiplicamos por un factor de conversión e imprimimos el valor en la pantalla.

Código

import machine
import utime

potentiometer = machine.ADC(26)

conversion_factor = 3.3 / (65535)

while True:
    voltage = potentiometer.read_u16() * conversion_factor
    print(voltage)
    utime.sleep(0.1)
Vía: Raspberry Pi Foundation

Para seguir leyendo…

Convertidor Digital a analógico

Ahora, para que nuestro Raspberry Pi Pico pueda devolver una señal analógica a partir de datos digitales necesitamos un convertidor digital-analógico o DAC. En este caso, la técnica que usamos para convertir la señal es por medio de PWM. A grandes rasgos el PWM contiene la información modulada dentro de una señal cuadrada con frecuencia fija, con ancho de pulso variable.

Para configurar la salida analógica debemos decirle al código que pin vamos a usar con PWM() y la frecuencia de la señal con pwm.freq(). En este caso usamos el pin 15 y la frecuencia es de 1000 Hertz.

Código

from machine import Pin, PWM
from time import sleep

pwm = PWM(Pin(15))

pwm.freq(1000)

while True:
    for duty in range(65025):
        pwm.duty_u16(duty)
        sleep(0.000001)
    for duty in range(65025, 0, -1):
        pwm.duty_u16(duty)
        sleep(0.000001)
Vía: Raspberry Pi Foundation

Combinando ambas ideas

Por último podemos juntar ambos conceptos para controlar el brillo de un LED con el valor analógico leído por un potenciómetro. Para esto, usamos el siguiente código. El valor que lee del ponteciómetro se manda directamente al ancho de pulso de la salida analógica, por lo que no hace falta hacer una conversión.

Código

import machine
import utime

potentiometer = machine.ADC(26)
led = machine.PWM(machine.Pin(15))
led.freq(1000)

while True:
    led.duty_u16(potentiometer.read_u16())
Vía: Raspberry Pi Foundation

Conclusiones:

Ya aprendimos a usar las entradas y salidas GPIO analógicas. Ahora podemos reemplazar el potenciómetro por otro sensor analógico, como un sensor de temperatura o un micrófono. La salida analógica, en este caso, es todavía una señal cuadrada, por lo que debe filtrarse para obtener valores analógicos puros. Pero para fines didácticos, funciona muy bien.

Referencias:

Getting started with the Raspberry Pi Pico – Control LED brightness with PWM

Getting started with the Raspberry Pi Pico – Control an LED with analogue input