Dernière révision : septembre 2023










Raspberry Pi Pico : exécuter du code Python

Philippe Notez (philippe.notez@musee-info.fr)





Sommaire

Introduction

L’électronique et l’informatique ont profondément modifié notre société. C’est certainement la révolution industrielle la plus rapide de l’histoire de l’humanité. En effet, l’ordinateur que nous connaissons aujourd’hui était tout simplement inimaginable il y a seulement une cinquantaine d’années. Et avec les Arduino, les ESP8266 ou les Raspberry Pi Pico, l'aventure est loin d'être terminée.

L’auteur ne pourra en aucun cas être tenu responsable des dommages qui résulteraient de l’utilisation des informations publiées sur ce site, sous licence Creative Commons BY-NC-SA. Toute reproduction ou modification d'un document, même partielle, est autorisée à condition que son origine et le nom de l'auteur soient clairement indiqués (BY), qu'il soit utilisé à des fins non commerciales (NC), que son mode de diffusion soit identique au document initial (SA), et que cela ne porte pas atteinte à l’auteur.

Ce document présente la carte Raspberry Pi Pico et la programmation en langage Python sur ce microcontrôleur, en espérant toujours être le plus clair et précis possible. Malgré tout le soin apporté à la rédaction, l'auteur vous remercie de bien vouloir le contacter si vous relevez la moindre erreur ou omission, et vous souhaite une agréable lecture.

Si vous avez apprécié ce document, vous pouvez faire un don ici.


Raspberry Pi Pico

La carte Raspberry Pi Pico (qu'on appellera juste le Pico par la suite) est la première carte de la fondation Raspberry Pi basée sur un microcontrôleur. Elle vient s'ajouter aux nombreuses cartes déjà existantes (Arduino, ESP, etc...). Il ne faut pas la confondre avec la famille des nano-ordinateurs Raspberry Pi.

Parmi ses points forts, on peut citer un prix très bas, un nombre important de GPIO1 (26, dont 16 canaux PWM), et une fréquence pouvant être configurée jusqu'à 300 MHz dans l'EDI Arduino. Je vous conseille la version WH intégrant une puce wifi 802.11 b/g/n, le Bluetooth 5.2, et un connecteur soudé. Vous trouverez les différentes versions ici.

Microcontrôleur : RP2040 (Arm Cortex M0+ Dual-Core 32 bits @ 133 MHz)

Mémoire vive (SRAM) : 264 kio2

Mémoire de stockage (flash) : 2 Mio, accès via QSPI (Queued Serial Peripheral Interface)

Le Pico possède des caractéristiques qui se situent entre l'ESP8266 et l'ESP32, c'est plutôt pas mal, même si la mémoire flash est peut-être un peu faible par rapport aux ESP, qui vont jusqu'à 16 Mio.

A noter également la présence de trois entrées analogiques (résolution sur 12 bits), deux I2C, deux SPI et deux UART, comme indiqué dans le schéma suivant :



Les broches GPIO23, 24, 25 et 29 sont réservées pour la communication avec la puce wifi via un bus SPI. Nous conservons donc les 26 GPIO disponibles dans la version W, qui sera utilisée par la suite.

Vous pouvez alimenter le Pico en utilisant un câble USB Micro-B (dans ce cas, la broche VBUS passe à 5 V) ou la broche VSYS (1,8 à 5,5 V). Attention, la tension de fonctionnement d'un Pico est de 3,3 V, comme l'Arduino Due et les ESP ! Tout dépassement de cette valeur sur l'une des broches (sauf VSYS bien-sûr) le détruira. Il faudra donc prévoir éventuellement des convertisseurs 3,3 V <> 5 V.


MicroPython

Après avoir téléchargé la dernière version (pour un Pico W) ici, vous devez appuyer sur le bouton BOOTSEL et connecter votre Pico à un port USB, sans lâcher le bouton (vous pouvez lâcher une fois le Pico branché). Le volume RPI-RP2 apparaît sur votre bureau, ouvrez-le et copiez le fichier uf2 téléchargé précédemment. Votre Pico est prêt, vous pouvez désormais exécuter des programmes Python !


Logiciel Thonny

Thonny est un Environnement de Développement Intégré adapté au langage Python. Vous trouverez la dernière version ici. Ouvrez le menu Tools, Options, Interpreter, et choisissez MicroPython (generic) ou, dans les versions plus récentes, MicroPython (Raspberry Pi Pico). Choisissez ensuite le port USB sur lequel est connecté votre Pico. Vous devriez voir un écran qui ressemble à :



L'exemple suivant utilise un serveur web pour gérer la LED intégrée au Pico :

serveur_web.py
# serveur web MicroPython sur Raspberry Pi Pico

from machine import Pin, reset
import network, time, socket

adresse_ip = "192.168.1.50"
masque = "255.255.255.0"
passerelle = "192.168.1.1"
dns = "192.168.1.1"
nom_wifi = ""
mdp_wifi = ""

led = Pin("LED", Pin.OUT)
led.value(0)

def page_web():
    if led.value() == 1:
        etat_led = "on"
    else:
        etat_led = "off"
    code_html = """<!DOCTYPE HTML>
    <HTML>
    <HEAD>
    <TITLE>Serveur web MicroPython sur Raspberry Pi Pico</TITLE>
    </HEAD>
    <BODY>
    <FONT FACE="calibri">
    <CENTER><BR>
    <B>Serveur web MicroPython sur Raspberry Pi Pico</B><BR><BR>
    LED : """ + etat_led + """<BR><BR>
    <A HREF="/?on"><BUTTON>On</BUTTON></A><BR><BR>
    <A HREF="/?off"><BUTTON>Off</BUTTON></A><BR><BR>
    <A HREF="/?stop"><BUTTON>Stop</BUTTON></A>
    </CENTER>
    </FONT>
    </BODY>
    </HTML>"""
    return code_html

station = network.WLAN(network.STA_IF)                                # station mode 
station.active(True)
station.ifconfig((adresse_ip, masque, passerelle, dns))
station.connect(nom_wifi, mdp_wifi)
print("Connexion au réseau wifi", end="")
while not station.isconnected():
    print(".", end="")
    time.sleep(0.1)
print("\nConnecté " + str(station.ifconfig()) + " !")

socket_serveur = socket.socket(socket.AF_INET, socket.SOCK_STREAM)    # IPv4, TCP
socket_serveur.bind((adresse_ip, 80))                                 # on écoute sur le port 80
socket_serveur.listen(5)                                              # 5 connexions (clients) max.
while True:
    socket_client, adresse_client = socket_serveur.accept()           # on créé un socket client pour dialoguer avec le socket serveur
    print("Connexion depuis " + str(adresse_client))
    requete_client = str(socket_client.recv(1024))                    # on reçoit la requête du client
    #print(requete_client)
    if requete_client.find("on") == 8:                                # b'GET /?on
        led.value(1)
    if requete_client.find("off") == 8:                               # b'GET /?off
        led.value(0)
    if requete_client.find("stop") == 8:                              # b'GET /?stop
        socket_serveur.close()
        station.disconnect()
        station.active(False)
        reset()
    socket_client.sendall("HTTP/1.1 200 OK\n")                        # on envoie la réponse du serveur au client
    socket_client.sendall("Content-Type: text/html; charset=utf-8\n")
    socket_client.sendall("Content-Language: fr-FR\n\n");             # ligne vide obligatoire à la fin de l'en-tête HTTP
    socket_client.sendall(page_web())
    socket_client.close()

N'oubliez pas de modifier les paramètres adresse_ip, masque (de sous-réseau), passserelle, dns (serveur DNS), nom_wifi (SSID), et mdp_wifi (mot de passe wifi), en fonction de votre réseau. Ouvrez le menu File, Save as, et enregistrez ce fichier dans votre Pico (MicroPython device), en le nommant, par exemple, serveur_web.py. Ouvrez un navigateur web et saisissez l'adresse IP de votre serveur web, vous devriez obtenir :



Le bouton Stop permet de reprendre la main sur le programme, grâce à la fonction reset().


Documentation complémentaire

1 : General Purpose Input/Output (Entrée/Sortie à usage général).

2 : 1 ki (kilo informatique) = 1024 et non pas 1000, donc 1 kio = 1024 octets et 16 kio = 16384 octets.



Haut de page