Saltar al contenido

Raspberry Pi Pico Python SDK

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 MicroPython

Interrupciones

Ciclo WHILE en Python

Ciclo While en Python

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.

Entradas relacionadas

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

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

Comentarios (9)

Saludos cordiales, estaba siguiendo tu tutorial y al momento de programar el I2c me sale el siguiente error:
Traceback (most recent call last):
File «», line 5, in
IndexError: list index out of range
no tiene sentido porque lo he puesto tal cual lo explicas el video

Responder

Extraño, carga todas las librerías y verifica en el terminal si cuando digitas i2c.scan() te sale una lista con todos los puertos i2c.

Responder

Sergio:
He realizado tus cursos de Arduino y Raspberry pi pico y realmente son excelentes.

Solo un detalle en cuanto al ejemplo que has dado en esta página sobre Entradas Digitales:
En tu instructivo (Línea 5) está como =>
boton = machine.Pin(15, machine.Pin.IN, machine.Pin.PULL_DOWN)

Pero la definicion del boton correcta es machine.Pin.PULL_UP

Saludos

Responder

Hola Marcelo, gracias por tu comentário. Para el caso de la entrada digital va a depender de la lógica que emplees en el botón, En mi caso lo hice con un PULL_DOWN es decir que el pin siempre está aterrizado a tierra y cuando apreta el botón le llega la señal positiva de alimentación. Con PULL_UP también se puede realizar, en ese caso el PIN estaría siempre con señal positiva y cuando se apreta el botón se aterriza el PIN a tierra. Saludos!

Responder

Hola ! Muy bueno este curso con la Raspberry Pi Pico, te felicito.
Una pregunta: Cómo se podría conectar un servomotor de Lego Ev3 con la Raspberry Pi Pico.

Responder

Muchas gracias por la mini guia ojala en un futuro nos guie con la nano rp2040

Responder

Gracias Miguel, esperemos que si. Saludos!!

Responder

Muchísimas gracias Sergio. No soy bueno para grandes discursos, simplemente GRACIAS !!!

Responder

De nada Rogelio, gracias a ti por el comentário que bueno que te haya gustado. Está atento que lanzaré nuevas entradas y videos en las semanas venideras. Saludos.

Responder