MicroPython con Thonny


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.
2024-07-04 18_44_27-(1) Exploring the Arduino Nano ESP32 _ MicroPython & IoT Cloud - YouTube.png
Fuente  vídeo Exploring the Arduino Nano ESP32 | MicroPython & IoT

2024-07-04 18_44_27-(1) Exploring the Arduino Nano ESP32 _ MicroPython & IoT Cloud - YouTube.png
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/

2024-12-26 22_31_14-Thonny, Python IDE for beginners.png

¿Cómo se instala micropython con Thonny en Picobricks?

Entramos en ejecutar-configurar intérprete

2024-12-26 22_33_05-.png

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

2024-12-26 22_34_50-Thonny  -  _sin nombre_  @  1 _ 1.png

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
2024-12-27 08_35_34-¿Qué es Pico Bricks_ _ Librería CATEDU.png
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:

2024-12-26 23_51_38-Thonny  -  _sin nombre_  @  1 _ 1.png

Si visualizamos la ventana de archivos

2024-12-27 00_20_16-.png

Podemos ver que a la hora de guardar nos pregunta si lo queremos guardar en el chip de PicoBricks o en tu ordenador

2024-12-27 00_23_20-Thonny  -  _sin nombre_  @  9 _ 22.png

¿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

2024-12-27 00_17_32-picobricks.png (611×439).png

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

2024-12-27 00_03_30-Thonny  -  _sin nombre_  @  1 _ 1.png

y el led parpadea como estaba previsto

Otra forma de conseguir el programa es con la ventana de Python de PicoBlockly

2024-12-27 00_15_08-PicoBricks Blocks.png

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

Libro Projectbook

Los tienes en este libro (en inglés) que lo puedes conseguir aquí https://picobricks.com/pages/projectbook

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:

2024-12-28 22_40_50-Thonny  -  C__Users_I5HP_Downloads_wifi.py  @  97 _ 22.png

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í
2024-12-28 22_45_08-Wireless Network Watcher.png

Abrimos un navegador y ponemos la IP de la Raspberry en mi caso 192.168.1.54

2024-12-28 22_53_21-Pico W — Mozilla Firefox.png

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 :

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: