En esta entrada aprenderemos a programar la mayoría de las funcionalidades de la Raspberry Pi Pico apoyandonos del documento de Python SDK (Kit de Desarrollo de Software).
Antes de comenzar te invito a que le des un vistazo a nuestro curso de MicroPython con enfoque en la Raspberry Pi Pico.
Y que te suscríbas al canal si te interesa la programación de microcontroladores y la teoría del control.
Raspberry Pi Pico en 20 Minutos
Cuando programamos con la Raspberry Pi Pico en MicroPython, lo fundamental a tener en consideración al comienzo, es entender como nos puede ayudar los módulos disponibles para el manejo del microcontroldor RP2040 en especial el módulo machine.
En esta entrada abordaremos rápidamente varias de sus funcionalidades, las cuales están plasmadas en el Raspberry Pi Pico Python SDK.
Print y Comentários en MicroPython
La función print, nos va a permitir mostrar todo tipo de mensajes y variables a través de la comunicación serial entre el computador y nuestra Raspberry Pi Pico.
Algunos ejemplos son:
print('Hola Mundo')
print("Curso de MicroPython")
Para comentar en Python, podemos usar el # para comentar una sola linea y podemos usar triple comilla (»’) para comentar várias lineas.
'''
Video SDK para programar en MicroPython
by Sergio Andres Castaño Giraldo
control automático educación
'''
#Vamos a imprimir en consola
print('Hola Mundo')
print("Curso de MicroPython")
Importando Bibliotecas
En la mayoría de nuestros códigos vamos a importar la biblioteca machine para la manipulación de las características de la Raspberry Pi Pico y también la librería utime para el manejo de tiempos.
import machine import utime
Salidas Digitales
Con la clase Pin del Módulo machine conseguimos manipular las salidas digitales de la Raspberry Pi Pico. En este ejemplo colocamos a parpadear un led.
import machine
import utime
led = machine.Pin(25, machine.Pin.OUT)
while True:
led.on()
utime.sleep(1)
led.off()
utime.sleep(1)
Entradas Digitales
Con la clase Pin del Módulo machine conseguimos manipular las entradas digitales de la Raspberry Pi Pico. En este ejemplo encendemos un led cada que apretamos un botón con una resistencia pull down activa.
import machine
import utime
led = machine.Pin(25, machine.Pin.OUT)
boton = machine.Pin(15, machine.Pin.IN, machine.Pin.PULL_DOWN)
while True:
if boton():
led.value(1)
utime.sleep_ms(200)
else:
led.value(0)
Timer
La raspberry Pi Pico posee Timers por hardware que nos permite desarrollar aplicaciones de tiempo precisos.
Para eso usamos la clase Timer del módulo machine. En este punto es importante destacar que para compartir entre la función de interrupción y la función principal, estas variables deben ser declaradas como globales.
El siguiente ejemplo coloca a parpadear un led periodicamente con una frecuencia de 2.5hz. y de lo interesante es que el prompt en el shell de comandos retorna a nosotros y podemos seguir programando a la par que el led está parpadeando.
import machine
import utime
def tick(timer):
global led
led.toggle
led = machine.Pin(25, machine.Pin.OUT)
tim = machine.Timer()
tim.init(freq=2.5, mode=machine.Timer.PERIODIC, callback=tick)
Interrupciones
La Raspberry Pi Pico también puede activar interrupciones externas cuando detecte cambios lógicos por flanco de subida o bajada en sus pines digitales.
En el siguiente ejemplo, implementamos un botón con un capacitor en paralelo, para crear un debounce por hardware y detectamos el cambio de estado del botón por medio de un flanco de bajada para incrementar un contador el cual imprimimos su valor en la Shell.
A pesar de que usar la función print dentro de una interrupción no sea muy recomendado dado que es una función que consume un tiempo de ejecución incierto, para este simple ejemplo no hay mucho inconveniente. Desde el punto de vista del microcontrolador, el presionar un botón es una actividad sumamente lenta para el micro y una actividad fácil de tratar.
import machine
import utime
def interrupcion(pin):
global contador
contador += 1
print(contador)
contador = 0
boton = machine.Pin(15, machine.Pin.IN, machine.Pin.PULL_UP)
boton.irq(interrupcion, machine.Pin.IRQ_FALLING)
Conversión ADC
Podemos leer sensores con los puertos ADC de la Raspberry Pi Pico el cual tiene una resolución de 12 bits, sin embargo la conversión en microPython se hace internamente a 16 bits.
Para este ejemplo, vamos a usar el sensor de temperatura interno de la Raspberry Pi Pico ubicado en el ADC(4) y realizamos una conversión inicial de bits a voltaje y luego de voltaje a temperatura.
import machine
import utime
sensor_temp = machine.ADC(4)
conversion_factor = 3.3 / (65535)
while True:
reading = sensor_temp.read_u16() * conversion_factor
temperature = 27 - (reading - 0.706)/0.001721
print(temperature)
utime.sleep(2)
PWM
Con la Raspberry Pi PICO tenemos vários puertos de control via PWM. En este ejemplo usaremos el PWM para regular la intensidad de un Led.
import machine
import utime
potenciometro = machine.ADC(26)
frecuency = 5000
led = machine.PWM(machine.Pin(16))
led.freq(frecuency)
while True:
led.duty_u16(potenciometro.read_u16())
Threads
La Raspberry Pi Pico puede ejecutar dos tareas al tiempo con la biblioteca _thread.
De esa forma podemos crear dos hilos que se ejecutan al tiempo para realizar distintas tareas al mismo tiempo.
En este ejemplo colocaremos a parpadear dos leds, cada uno en un nucleo diferente. El led amarillo parpadea a 50ms y el led rojo parpadea a 1.5 segundos.
import machine
import utime
import _thread
def nucleo_2():
while True:
utime.sleep_ms(50)
led_amarillo.toggle()
led_rojo = machine.Pin(15, machine.Pin.OUT)
led_amarillo = machine.Pin(16, machine.Pin.OUT)
_thread.start_new_thread(nucleo_2, ())
while True:
utime.sleep_ms(1500)
led_rojo.toggle()
Comunicación I2C
El módulo machine también nos posibilita realizar comunicación I2C con nuestra Raspberry Pi Pico de una forma fácil.
Para este ejemplo, usaremos la propia función de la clase I2C para detectar la dirección del esclavo conectado a la Raspberry Pi Pico. Dicha dirección la vamos a imprimir en la Shell.
import machine
import utime
i2c = machine.I2C(0, scl=machine.Pin(9), sda=machine.Pin(8), freq=200000)
direccion = hex(i2c.scan()[0])
print('La dirección I2C es ', direccion)
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.
Citar este Artículo
¡Hola! Soy Sergio Andrés Castaño Giraldo. Bienvenidos a Control Automático Educación, un espacio dedicado a una de mis grandes pasiones: la Ingeniería de Control y la Automatización.
Mi objetivo aquí es tender un puente entre la teoría académica y la práctica profesional. Como profesor e investigador, he tenido la oportunidad de trabajar en proyectos complejos —desde sistemas de compresión en plataformas offshore hasta modelos de control avanzado— y todo ese aprendizaje lo vuelco en este sitio.
Aquí encontrarás material que crece constantemente: desde fundamentos de instrumentación hasta estrategias de control avanzado y programación profesional. Mi meta es que la información que comparto te sea de utilidad real en tu carrera o formación.
Te invito a que te suscribas, te unas a nuestro canal de YouTube y formemos una comunidad de aprendizaje continuo. ¡Gracias por estar aquí!






