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.
Mi nombre es Sergio Andres Castaño Giraldo, y en este sitio web voy a compartir una de las cosas que mas me gusta en la vida y es sobre la Ingeniería de Control y Automatización. El sitio web estará en constante crecimiento, voy a ir publicando material sobre el asunto desde temas básicos hasta temas un poco más complejos. Suscríbete al sitio web, dale me gusta a la página en Facebook y únete al canal de youtube. Espero de corazón que la información que comparto en este sitio, te pueda ser de utilidad. Y nuevamente te doy las gracias y la bienvenida a control automático educación.