Connexion
Abonnez-vous

[Tuto] Raspberry Pi Pico 2 W : mise en route, Wi-Fi et première application

Jour, nuit, jour…

[Tuto] Raspberry Pi Pico 2 W : mise en route, Wi-Fi et première application

Cette semaine, la fondation Raspberry Pi a annoncé le Pico 2 W, un micro-ordinateur avec du Bluetooth et du Wi-Fi pour seulement 8 euros. Nous en avons commandé un exemplaire afin de vous proposer une première prise en main. Dans ce tuto, nous allons contrôler à distance la LED intégrée.

Le 29 novembre à 16h38

Première étape : préparer le Pico 2 W avec un fichier UF2

Avant de se lancer dans la moindre ligne de code, la première chose à faire est de préparer notre Pico 2 W. La manipulation est la même qu’avec le Pico premier du nom. Sur cette page, la fondation Raspberry Pi propose tout le nécessaire… qui se résume à un fichier « UF2 » à télécharger. Dans notre cas, on clique sur le lien pour le Pico 2 W.

L’installation n’est pas plus compliquée et consiste simplement à copier le fichier téléchargé – mp_firmware_unofficial_latest.uf2 dans le cas présent – sur le stockage interne du Pico 2 W. Pour cela, connectez-le à votre ordinateur avec un câble micro-USB.

Si c’est la première utilisation du micro-contrôleur, l’espace de stockage devrait directement apparaitre. Dans le cas contraire, débranchez le Pico 2 W, appuyez et maintenez enfoncé le bouton Bootsel puis branchez le port USB jusqu’à ce que l’ordinateur détecte le Pico 2 W et son espace de stockage. Vous pouvez alors relâcher le bouton.

On installe Thonny, un IDE MicroPython multiplateforme

Pour programmer notre Pico 2 W, nous installons Thonny, un IDE multiplateforme (Windows, Linux et macOS) dont la dernière mouture est la 4.1.6. Il existe aussi une version portable si besoin. Dans les deux cas, la procédure est classique, sans surprise.

Lancez Thonny. Sur l’interface graphique, vérifiez en bas à droite que vous êtes bien connecté au micro-contrôleur et pas en « local ». Il suffit sinon de cliquer dessus pour changer et passer sur le Raspberry Pi Pico (le 2 W n’est pas mentionné, mais cela n’a aucune importance).

Tuto Disco : on allume et on éteint la LED… Amazing !

Pour nos premières expériences, on va utiliser la LED intégrée au PCB. Trois lignes de codes suffisent (remplacez le 1 par un 0 et relancez le programme pour éteindre la LED) :

from machine import Pin
led_int = Pin("LED", Pin.OUT)
led_int.value(1)

On ajoute un peu de dynamisme avec un clignotement asymétrique… Super Amazing ! Dans les lignes de code ci-dessous, nous avons importé la bibliothèque « time » et utilisé la fonction « while » pour faire tourner en boucle notre programme (« while true » tourne tout le temps, puisque true est toujours vrai).

from machine import Pin
from time import *
led_int = Pin("LED", Pin.OUT)
while True:
    led_int.value(1)
    sleep_ms(1000)
    led_int.value(0)
    sleep_ms(250)

Vous l’aurez compris ou deviné, ce programme allume la LED, attend une seconde, éteint la LED, attend 250 ms, allume la LED, etc.

On passe la seconde : Wi-Fi et mini serveur web

Nous souhaitons maintenant connecter notre Pico 2 W à un point d’accès Wi-Fi.

On demande à Claude.ai comment se connecter au Pico sans fil à l’aide de Thonny et l’IA générative nous donne la bonne solution du premier coup, avec des explications et des messages dans la console pour vérifier le bon fonctionnement de la connexion. Pensez à adapter ssid et password à votre réseau Wi-Fi.

import network
import time

# Activer le WiFi
wlan = network.WLAN(network.STA_IF)
wlan.active(True)
ssid ='MonSSID'
password ='MonMDP'
wlan.connect(ssid, password)

max_wait = 10
while max_wait > 0:
    if wlan.status() < 0 or wlan.status() >= 3:
        break
    max_wait -= 1
    print('En attente de connexion...')
    time.sleep(1)

# Gérer l'erreur de connexion
if wlan.status() != 3:
    raise RuntimeError('Échec de la connexion au réseau')
else:
    print('Connecté !')
    status = wlan.ifconfig()
    print('Adresse IP:', status[0])+

C’est bien beau, mais à quoi ça sert ? En l’état, pas à grand-chose, alors on va commander l’allumage et l’extinction de la LED depuis un autre ordinateur, avec un navigateur.

Nous avons repris le code de ce dépôt GitHub avec quelques ajustements pour que l’ensemble du code soit dans un seul fichier, plus pratique dans notre cas. Pensez à modifier les lignes 20 et 21 avec les paramètres de votre Wi-Fi (SSID et mot de passe).

import rp2
import network
import ubinascii
import machine
import urequests as requests
import time
import socket

# Set country to avoid possible errors
rp2.country('DE')

wlan = network.WLAN(network.STA_IF)
wlan.active(True)
# If you need to disable powersaving mode
# wlan.config(pm = 0xa11140)

# See the MAC address in the wireless chip OTP
mac = ubinascii.hexlify(network.WLAN().config('mac'),':').decode()
print('mac ='+ mac)
ssid ='MonSSID'
pw ='MonMDP'

wlan.connect(ssid, pw)

# Wait for connection with 10 second timeout
timeout = 10
while timeout > 0:
    if wlan.status() < 0 or wlan.status() >= 3:
        break
    timeout -= 1
    print('Waiting for connection...')
    time.sleep(1)

# Define blinking function for onboard LED to indicate error codes    
def blink_onboard_led(num_blinks):
    led = machine.Pin('LED', machine.Pin.OUT)
    for i in range(num_blinks):
        led.on()
        time.sleep(.2)
        led.off()
        time.sleep(.2)
    
# Handle connection error
# Error meanings
# 0  Link Down
# 1  Link Join
# 2  Link NoIp
# 3  Link Up
#- 1 Link Fail
#- 2 Link NoNet
#- 3 Link BadAuth

wlan_status = wlan.status()
blink_onboard_led(wlan_status)

if wlan_status != 3:
    raise RuntimeError('Wi-Fi connection failed')
else:
    print('Connected')
    status = wlan.ifconfig()
    print('ip ='+ status[0])
    
# Function to load in html page    
def get_html(html_name):
    with open(html_name, 'r') as file:
        html = file.read()
        
    return html

# HTTP server with socket
addr = socket.getaddrinfo('0.0.0.0', 80)[0][- 1]

s = socket.socket()
s.bind(addr)
s.listen(1)

print('Listening on', addr)
led = machine.Pin('LED', machine.Pin.OUT)

# Listen for connections
while True:
    try:
        cl, addr = s.accept()
        print('Client connected from', addr)
        r = cl.recv(1024)
        # print(r)
        
        r = str(r)
        led_on = r.find('?led=on')
        led_off = r.find('?led=off')
        print('led_on =', led_on)
        print('led_off =', led_off)
        if led_on >- 1:
            print('LED ON')
            led.value(1)
            
        if led_off >- 1:
            print('LED OFF')
            led.value(0)
            
        cl.send('HTTP/1.0 200 OK\r\nContent-type: text/html\r\n\r\n')
        cl.send("""<!DOCTYPE html>
<html>
    <head>
        <title>Pico W</title>
    </head>
    <body>
        <h1>Pico W</h1>
        <p>Controler la LED intégrée </p>
        <a href=\"?led=on\"><button>ON</button></a> 
        <a href=\"?led=off\"><button>OFF</button></a>
    </body>
</html>
""")
        cl.close()
        
    except OSError as e:
        cl.close()
        print('Connection closed')

On enregistre tout sur le Pico 2 W

Thonny permet de sauvegarder le code directement dans le stockage du Raspberry Pi Pico 2 W. Pour que notre programme s’exécute automatiquement au démarrage, il faut l’enregistrer sous le nom le « main.py ».

Si on branche le Raspberry Pi sur une prise électrique, il devrait clignoter trois fois au bout de quelques secondes pour indiquer que la connexion au Wi-Fi est en place.

Il suffit ensuite de saisir l’adresse IP du Pico 2 W dans un navigateur pour accéder à la page (très) épurée permettant d’allumer ou éteindre la LED. Libre à vous de modifier le code pour la rendre plus joyeuse, ajouter d’autres fonctions, etc.

C’est un exemple élémentaire, mais on peut imaginer bien plus de possibilités en jouant avec les ports GPIO par exemple. Le Wi-Fi permet alors de dialoguer directement avec le Pico 2 W pour envoyer et/ou recevoir des données.

N’hésitez pas à nous faire part de vos projets passés ou à venir.

Commentaires (16)

Vous devez être abonné pour pouvoir commenter.

Abonnez-vous
votre avatar
Martine écrit en UTF-8

Désolé. :humour:
votre avatar
C’est pas faux et j’ai vu, mais je ne pouvais pas modifier, car dans le train pendant cet aprem (avec encore une fois le mode chat noir activé). Mais bon ca donne l’occasion de vous moquer, c’est cadeau :santa_flock:
votre avatar
Balancer du code python sans la coloration syntaxique :cartonrouge:
votre avatar
Sous Linux, le coller dans un fichier .txt et l'enregistrer en .py ; c'est tout !
votre avatar
@SébastienGavois
En parlant de coloration syntaxique, il est prévu d'avoir des numéros de lignes quand on utilise la balise "code" ?

Parce ce que dans certains cas, ce serait quand même pratique :
Nous avons repris le code de ce dépôt GitHub avec quelques ajustements pour que l’ensemble du code soit dans un seul fichier, plus pratique dans notre cas. Pensez à modifier les lignes 20 et 21 avec les paramètres de votre Wi-Fi (SSID et mot de passe).
votre avatar
Faudra que j’en parle avec les devs si ça doit devenir un peu récurent de proposer des lignes de codes, mais ça peut aussi passer par un dépôt GitHub. Disons que je suis conscient que c’est pas l’idéal (aprés un col/coll dans un IDE on a les numéros de ligne), mais je suis pas encore arrêté sur une décision finale.
votre avatar
demander les numéros de ligne est un non-sens. Ce n'est pas du BASIC où les numéros de lignes faisaient partie du programme avec les GOTO
Quand j'ai copié le programme dans vi, j'ai pu accéder immédiatement aux lignes citées dans l'article. Sinon un CTRL-F ssid sur la page de l'article permet de retrouver les lignes en question rapidement.
Mettre les numéros de ligne dans l'article rendrait compliqué le copier/coller : il faudrait ensuite supprimer les numéros de ligne qui ne seraient pas interprétées correctement par l'interpréteur python.

Par contre, oui, utiliser un dépôt en ligne est probablement une bonne idée sauf si vous préférez héberger les fichiers contenant les programmes chez vous. Comme ce sont de simples fichiers texte, ça serait simple aussi, mais peut-être moins organisé.
votre avatar
Mettre les numéros de ligne dans l'article rendrait compliqué le copier/coller : il faudrait ensuite supprimer les numéros de ligne qui ne seraient pas interprétées correctement par l'interpréteur python.
https://stackoverflow.com/a/68259380

Tu cliques sur le bouton bleu "Run code snippet" et t'as un code qui s'affiche à l'écran, avec des numéros de lignes et quand tu sélectionnes le code, tu ne sélectionnes pas les numéros de lignes.

@SébastienGavois :
Après il est évident que s'il y a trois exemple de code dans l'année, c'est peut-être pas le plus pertinent d'ajouter cette fonctionnalité :transpi:
Mais ça peut être un truc assez sympa, et pas forcément que pour le site mais aussi pour les commentaires, pour discuter d'un code sans pour autant dire que "c'est à coté du second if()", là juste indiquer le numéro de ligne suffit.
Et si on prend un plugin, il y a possiblement la coloration syntaxique qui va avec.

'fin bref, à voir.
votre avatar
Alors que Thonny sous Linux le fait !
votre avatar
Question bête mais quel est l'avantage par rapport à un RPi Zéro 2 W ?
Pas d'accès à un système Linux complet donc plus simple ?

J'ai toujours apprécié les déploiements de hobbyiste avec Balena par exemple sur RPi.
votre avatar
C’est une version plus simple en effet, c’est un micro-contrôleur pour exécuter du MicronPython ou du C, sans écran ni rien. C’est aussi moins cher : 8 euros pour le Pico 2 W. Aprés ça dépend des besoins et des usages :)
votre avatar
L'un est un microcontroleur (ie, une unité de calcul basique, très peu de mémoire vive et morte intégrées, de quoi communiquer, mais clairement pas de performances. Sert essentiellement à traiter basiquement des mesures/actions, et dispose de ports d'entrées / sorties), et l'autre un micro-ordinateur (des unités de calcul bien plus performantes, un GPU + CPU de la RAM externe et en quantité, de la mémoire morte externe, des connecteurs standards pour PC - clavier, caméra, écran, USB, LAN, Wifi, BT etc)
votre avatar
Oui mais du coup, pour quasiment le même prix, l'avantage du microcontroleur est la vitesse de démarrage et la consommation ?
votre avatar
Ca va dépendre de ce que tu veux faire : du PC (OS + navigateur etc.) ou juste instrumenter/applications simples
votre avatar
Le premier truc qui me viendrait à l'idée avec ce module ce serait une webradio avec un écran sympa et un skin type Winamp pour les contrôles, avec possibilité au choix d'envoyer l'audio à un ampli DAC I2S ou à une enceinte Bluetooth.

Mais c'est déjà possible avec un ESP32...
votre avatar
un RPi Zéro serait plus adapté avec une install volumio et la carte fille DAC.

[Tuto] Raspberry Pi Pico 2 W : mise en route, Wi-Fi et première application

  • Première étape : préparer le Pico 2 W avec un fichier UF2

  • On installe Thonny, un IDE MicroPython multiplateforme

  • Tuto Disco : on allume et on éteint la LED… Amazing !

  • On passe la seconde : Wi-Fi et mini serveur web

  • On enregistre tout sur le Pico 2 W

Fermer