MicroPython con Thonny
- Instalación de micropython
- El primer programa con Python: Blink
- Proyectos
- Un proyecto diferente: Encender y apagar led por wifi
- Envío de mensajes a Telegram
Instalación de micropython
¿Dónde se instala el Micropython?
Como puedes ver en este vídeo en 21:20 Python se compila dentro del microcontrolador es decir, dentro del ESP32. A diferencia con otros lenguajes, como el C++, el ordenador tiene el compilador, y se lo da ya en binario.
Fuente vídeo Exploring the Arduino Nano ESP32 | MicroPython & IoT
Fuente vídeo Exploring the Arduino Nano ESP32 | MicroPython & IoT
¿Qué programa vamos a usar?
Usaremos el Thonny https://thonny.org/ que lo puedes descargar e instalar de esta página: https://thonny.org/
¿Cómo se instala micropython con Thonny en Picobricks?
Entramos en ejecutar-configurar intérprete
Seleccionamos en ¿Qué tipo de interprete ...? le decimos que Rasbperry Pi pico y el puerto si lo sabemos lo seleccionamos o si no lo sabemos que lo detecte automáticamente
ATENCIÓN, poner PicoBricks en modo Bootloader
1.-Desconectamos PicoBricks de nuestro ordenador
2.- Apretamos el botón BOOTSEL mientras lo volvemos a conectar al puerto USB
3.- Automáticamente aparecerá una nueva unidad de disco en nuestro ordenador (ya puedes soltar BOOTSEL)
Entonces le damos a Instalar y lo instala en la unidad nueva que ha detectado, en el siguiente diálogo seleccionamos variante Raspberry pico W:
Si visualizamos la ventana de archivos
Podemos ver que a la hora de guardar nos pregunta si lo queremos guardar en el chip de PicoBricks o en tu ordenador
¿SABIAS QUE ...?
Si lo grabas en Raspberry Pi Pico con el nombre de main.py, entonces cuando enciendas el Picobricks, se ejecutará automáticamente sin necesidad de ningún ordenador
El primer programa con Python: Blink
El led rojo está en el pin GPI7 tal y como lo indica en la placa
Luego ponemos en el Thonny el siguiente programa
from time import sleep
import machine
import time
led = machine.Pin(7, machine.Pin.OUT)
while True:
led.on()
time.sleep((0.5))
led.off()
time.sleep((0.5))
Ejecutamos con F5
y el led parpadea como estaba previsto
Otra forma de conseguir el programa es con la ventana de Python de PicoBlockly
Otra manera de ver el mismo programa, está en la página 25 del libro https://picobricks.com/pages/projectbook
se encuentra el mismo código pero usando la instrucción
led.toggle()
Proyectos
Los mismos proyectos vistos con PicoBlockly se pueden hacer igual con código.
Repositorio ide picobrkics
https://ide.picobricks.com/examples/examples.ht
Repositorio Github
En la ruta https://github.com/Robotistan/PicoBricks/tree/main/Software/Activities los tienes listos los programas para copiar y pegar
- - Blink
- - Action-Reaction
- - Autonomous Lighting
- - Thermometer
- - Graphic Monitor
- - Dominate the Rhythm
- - Show Your Reaction
- - My Timer
- - Alarm Clock
- - Know Your Color
- Buzz Wire Game
Libro Projectbook
Los tienes en este libro (en inglés) que lo puedes conseguir aquí https://picobricks.com/pages/projectbook
- PROYECTO BLINK ver pag 25
- PROYECTO ACTION-REACTION ver pag 29
- PROYECTO Autonomous Lighting ver pag 35
- PROYECTO Thermometer ver pag 41
- PROYECTO Graphic Monitor ver pag 46
- PROYECTO Dominate the Rhythm ver pag 55
- PROYECTO Show Your Reaction ver pag 63
- PROYECTO My Timer ver pag 71
- PROYECTO Alarm Clock ver pag 81
- PROYECTO Know Your Color ver pag 90
- PROYECTO Buzz Wire Game ver pag 106
A diferencia de Microblocks, no los explica paso a paso, por lo que es mejor copiar y pegar de los repositorios de Github
Al no tener licencia CC no los podemos reproducir aquí en este tutorial
Un proyecto diferente: Encender y apagar led por wifi
En la lista de proyectos que propone PicoBricks sólo hay uno que usa la Wifi SmartHome, pero no utiliza la wifi de Raspberry Pi sino que utiliza un módulo wifi ESP8266 auxiliar.
Proponemos uno que no use elementos auxiliares
Enunciado: Encender y apagar el led rojo conectado en GPI7 a través de una página web puesto en el servidor que se instala en la Raspberry
Solución
La explicación del programa está en https://peppe8o.com/getting-started-with-wifi-on-raspberry-pi-pico-w-and-micropython/
La fuente del programa en https://github.com/raspberrypi/pico-micropython-examples/blob/master/wireless/webserver.py
Recuerda que tienes que poner los datos de tu wifi en las líneas 35 y 36
import socket
################################33
import network, rp2
import time
def connectWiFi(ssid,password,country):
rp2.country(country)
wlan = network.WLAN(network.STA_IF)
wlan.config(pm = 0xa11140)
wlan.active(True)
wlan.connect(ssid, password)
# Wait for connect or fail
max_wait = 10
while max_wait > 0:
if wlan.status() < 0 or wlan.status() >= 3:
break
max_wait -= 1
print('waiting for connection...')
time.sleep(1)
# Handle connection error
if wlan.status() != 3:
raise RuntimeError('network connection failed')
else:
print('connected')
status = wlan.ifconfig()
print( 'ip = ' + status[0] )
return status
######################################################333
from machine import Pin
led = Pin(7, Pin.OUT)
country = 'ES'
ssid = 'pon aqui el nombre de tu wifi'
password = 'pon aqui el password de tu wifi'
wifi_connection = connectWiFi(ssid,password,country)
#########################################################################33333
html = """<!DOCTYPE html>
<html>
<head> <title>Pico W</title> </head>
<body> <h1>Pico W</h1>
<p>Current status: %s</p>
<p><a href="http://"""+wifi_connection[0]+"""/light/on">Turn ON</a></p>
<p><a href="http://"""+wifi_connection[0]+"""/light/off">Turn OFF</a></p>
<p>by <a href="https://peppe8o.com">peppe8o.com</a></p>
</body>
</html>
"""
######################################################################
# Open socket
addr = socket.getaddrinfo('0.0.0.0', 80)[0][-1]
s = socket.socket()
s.bind(addr)
s.listen(1)
print('listening on', addr)
# Initialize LED status
led.value(0)
stateis = "LED is OFF"
# Listen for connections
while True:
try:
cl, addr = s.accept()
print('client connected from', addr)
request = cl.recv(1024)
print(request)
request = str(request)[0:50] # The [0:50] avoids getting the url directory from referer
led_status = request.find('GET / HTTP')
led_on = request.find('/light/on')
led_off = request.find('/light/off')
print( 'led on = ' + str(led_on))
print( 'led off = ' + str(led_off))
if led_status >0:
print("LED status request") # No LED action
if led_on >0:
print("led on")
led.value(1)
stateis = "LED is ON"
if led_off >0:
print("led off")
led.value(0)
stateis = "LED is OFF"
response = html % stateis
cl.send('HTTP/1.0 200 OK\r\nContent-type: text/html\r\n\r\n')
cl.send(response)
cl.close()
except OSError as e:
cl.close()
s.close()
print('connection closed')
Ejecución del programa
Para encender y apagar el led tienes que entrar en la IP de la Raspberry Pi, puedes verlo en la ventana del puerto serie (cónsola) que puedes ver en el programa Thonny:
Otro truco es ejecutar un programa de rastreo de IPs como el Wireless Network Watcher y ver la IP de la Raspberry. O poner una IP estática ver aquí
Si os sale el error OSError: [Errno 98] EADDRINUSE es porque no se ha cerrado bien la conexión, desconectar PicoBrikcs y volverlo a conectar y solucionado
Envío de mensajes a Telegram
En la anterior página, PicoBricks hacía de servidor, alojaba una página web y desde el exterior, se llamaba a su página web para encender y apagar un led.
¿y al revés? es decir, la llamada de PicoBricks a una web externa, por ejemplo la api de Telegram y así poder enviar temperatura, datos, etc.. de forma muy fácil :
- Primero creando un bot de Telegram y consiguiendo su Token
- Segundo identificar nuestro ID de usuario a donde enviar el mensaje
- Tercero utilizar la instrucción urequest.get(laurl) de la librería urequests
Tienes que poner en la línea 11 los datos de tu wifi
Tienes que poner en la url de la línea 16:
- Donde pone PONTUBOT sustitúyelo por el token del bot que has conseguido en reando un bot de Telegram y consiguiendo su Token
- Donde pone PONTUID sustitúyelo por el ID de tu usuario a donde hay que enviar el mensaje ver identificar nuestro ID de usuario a donde enviar el mensaje
## extraido del proyecto action-reaction https://github.com/Robotistan/PicoBricks/tree/main/Software/Activities/Action-Reaction
from machine import Pin#to acces the hardware picobricks
led = Pin(7,Pin.OUT) #### initialize digital pin as an output for led
push_button = Pin(10,Pin.IN,Pin.PULL_DOWN) ### initialize digital pin 10 as an input
##### extraido de página 21 de https://datasheets.raspberrypi.com/picow/connecting-to-the-internet-with-pico-w.pdf
##### Connecttonetwork
import network
wlan = network.WLAN(network.STA_IF)
wlan.active(True)
wlan.connect('PONTUWIFI', 'PONTUCONTRASEÑAWIFI')
# Make GET request
import urequests
def mandarmensaje():
r = urequests.get("http://api.telegram.org/botPONTUBOT/sendMessage?chat_id=PONTUID&text=APRETADO")
print(r.status_code) # redirectsto https
#print(r.content)
r.close()
#### while loop #######################################
while True:
logic_state = push_button.value();#button on&off status
if logic_state == True:#check the button and if it is on
led.value(1)#turn on the led
mandarmensaje()
else:
led.value(0)#turn off the led
#### end while loop ###################################
Hay que dejar apretado unos segundos el botón para que funcione: