Aller au contenu

Pi Pico#

Broches Pi Pico W et Pico2 W#

picow-pinout

pico2w-pinout

Démarrage en MicroPython#

Source

Avec Thonny#

  • Démarrer le logiciel Thonny puis cliquer dans le menu sur Exécuter pour choisir le bon interpréteur et le port connecté ;

Thonny Pi Pico W

  • Enregistrer en main.py le code suivant pour tester la LED intégrée sur la Pi Pico W :
# Blink en boucle infinie
from machine import Pin
from time import sleep

ma_led = Pin("LED", Pin.OUT) # "LED" désigne la led "built-in"

print('La led "built-in" clignote...')
while True:
    try:
        sleep(1) # pause de 1 seconde
        ma_led.toggle() # bascule d'un état à l'autre

    except KeyboardInterrupt:
        break
ma_led.off()
print("FIN")

Spécificité pour la LED embarquée sur la Pi Pico W cf 3.4. The on-board LED (page 16)

Faire CtrlC pour provoquer une interruption clavier ou appuyer sur le bouton "stop" ;

Avec le simulateur WOKWI#

Wokwi est un simulateur électronique en ligne. Il permet de simuler différentes cartes à microcontroleur dont notamment les Pi Pico associées à d'autres composants électroniques et programmées en micropython.

Activité 1

Démarrer la simulation dans la fenêtre ci-dessus puis saisir dans l'interpréteur en console la série d'instructions suivantes :

>>>from machine import Pin
>>>ma_led = Pin("LED", Pin.OUT)
>>>ma_led.on()
>>>ma_led.toggle()
>>>ma_led.toggle()
>>>ma_led.off()    
>>>help()

Activité 2

Modifier le code pour qu'après l'affichage du message Hello, Pi Pico! la led "built-in" clignote...

Wokwi - Autres exemples en micropython

Avec VSC#

https://tutoduino.fr/pico-python-visual-studio-code/

Le plus pratique pour programmer en MicroPython une carte Pi Pico W avec Visual Studio Code est d'installer l'extension dédiée MicroPico et d'en suivre les instructions...

Extensions nécessaires#

Extensions matérielles#

Exemples d'applications#

Capteur d'humidité et de température de l'air DHTXX#

Spécifications#

Le capteur DHT11 peut détecter des températures de 0 °C à 50 °C (précision de ±2 °C) et une humidité relative de 20 % à 80 % (±5 %) (au maximum une fois par seconde). Les stations météorologiques constituent probablement le principal domaine d’application d’un capteur tel que le DHT11. Pour tester le fonctionnement, il suffit de tenir la bouche près du capteur et d'expirer lentement. L'air respirable diffère de l'environnement en termes de température et d'humidité, ce qui devrait entraîner une modification significative des valeurs.

Exemple de code#

import machine
import dht # Module pour capteur DHTXX
import time

# Configuration du capteur DHT22 sur la broche 4
capteur_dht = dht.DHT22(machine.Pin(4))

# Fonction de lecture du capteur dht22
def read_dht22():
    # Lecture des données
    capteur_dht.measure()
    temp = capteur_dht.temperature()  # en °C
    humi = capteur_dht.humidity()      # en %

    # Affichage des résultats
    print(f"Température : {temp}°C")
    print(f"Humidité : {humi}%")

    # Le dht22 est plus précis mais plus lent que le dht11
    # Attendre 2 secondes entre chaque lecture
    time.sleep(2)

# Boucle principale
while True:
    read_dht22()

Simulation#

WOKWI DHT22-MicroPython-Pi_Pico ;

Activité possible#

Modifier le code pour remplacer le DHT22 par un DHT11 connecté à la broche GPIO GP0 et faire l'essai sur une [Explorer Board JOY-IT]...

Ressources#

Officielles en Anglais#

Avec le module picozero#

Autres en Français#

raspberry pi pico programmer RTC + ntp (wifi) en python

Callback#

# Blink avec callback
from machine import Pin, Timer

led = Pin("LED", Pin.OUT) # "LED" désigne la led built-in
timer = Timer() # Créé une instance de Timer()

def blink(timer) :
    led.toggle()

timer.init(freq=2.5, mode=Timer.PERIODIC, callback=blink)

On observe que la LED clignote mais la carte reste disponible pour d'autres instructions

Real Time Clock#

Avec la classe machine.RTC de MicroPython, il est possible d'utiliser l'horloge temps réel interne du Raspberry Pi Pico afin de connaître la date et l'heure à tout instant.

Récupérer les informations de l'horloge#

# Obtenir la date et l'heure du µC
from machine import RTC
from utime import sleep

rtc = RTC()  # création d'un objet de type "Real Time Clock"

while True:

    t = rtc.datetime()   # obtention de la date et l'heure

    # Affichage au format tuple (year, month, day, weekday, hours, minutes, seconds, subseconds)
    print(t)
    # Affichage reformaté
    jours = ["lundi", "mardi", "mercredi", "jeudi", "vendredi", "samedi", "dimanche"]
    print(f"Pour le µC nous sommes maintenant le {jours[t[3]]} {t[2]}/{t[1]}/{t[0]} et il est {t[4]}h{t[5]}min{t[6]}s" )  

    if t[0] == 2021 :
        print("(L'horloge n'est pas réglée !)")

    print()    
    sleep(1) # mise à jour chaque seconde

Régler l'horloge#

L'horloge interne du Raspberry Pi Pico redémarre à la date du vendredi 01/01/2021 à 0h0min0s dès qu'on le réalimente. Le script suivant permet à l'utilisateur de régler l'horloge manuellement :

# Régler la date et l'heure du µC
from machine import RTC
from utime import sleep

rtc = RTC()

print("Réglage manuel de la date et de l'heure")
annee = int(input ("Année (4 chiffres) : "))
mois = int(input ("Mois (1-12) : "))
jour = int(input("Jour (1-31) : "))
heure = int(input("Heure (0-23) : "))
minute = int(input("Minute (0-59) : "))
seconde = int(input("Seconde (0-59) : "))

# réglage de l'heure
rtc.datetime((annee, mois, jour, 0, heure, minute, seconde, 0))

while True:

    t = rtc.datetime()   # obtention de la date et l'heure

    # Affichage au format tuple (year, month, day, weekday, hours, minutes, seconds, subseconds)
    print(t)
    # Affichage reformaté
    jours = ["lundi", "mardi", "mercredi", "jeudi", "vendredi", "samedi", "dimanche"]
    print(f"Pour le µC nous sommes maintenant le {jours[t[3]]} {t[2]}/{t[1]}/{t[0]} et il est {t[4]}h{t[5]}min{t[6]}s" )

    sleep(1) # mise à jour chaque seconde

Thonny met à jour la date et l'heure du µC automatiquement...

https://electroniqueamateur.blogspot.com/2021/08/connaitre-la-date-et-lheure-avec-un.html

https://electroniqueamateur.blogspot.com/2021/08/horloge-temps-reel-ds3231-et-raspberry.html

Alt text Alt text

https://micropython-urtc.readthedocs.io/en/latest/install.html https://github.com/adafruit/Adafruit-uRTC

Ou https://github.com/balance19/micropython_DS3231 -->


import time
from machine import Pin
from picozero import pico_led

relais_1 = Pin(18, Pin.OUT)    # create output pin on GPIO18

while True :
    pico_led.on()
    time.sleep(1)
    pico_led.off()
    relais_1.on()                 # set pin to "on" (high) level
    time.sleep(1)           # sleep for 1 second
    relais_1.off()                # set pin to "off" (low) level
    time.sleep(1)           # sleep for 1 second


import time
from machine import Pin

LED = Pin("LED", Pin.OUT)    # create output pin on GPIO25 the built-in LED

while True :
    LED.on()                # set pin to "on" (high) level
    time.sleep(1)           # sleep for 1 second
    LED.off()               # set pin to "off" (low) level
    time.sleep(1)           # sleep for 1 second


import time
from picozero import pico_led

while True :
    pico_led.on()
    time.sleep(1)
    pico_led.off()
    time.sleep(1)
# Serveur couronne de l'Avent
import network
import socket
from time import sleep
import machine
import codes_wlan
from picozero import pico_temp_sensor

# Gestion de l'horloge
import ntptime # Network Time Protocol
rtc = machine.RTC()


ssid = codes_wlan.ssid
password = codes_wlan.password


led = machine.Pin("LED", machine.Pin.OUT) # "LED" désigne la led built-in
relais = machine.Pin(18, machine.Pin.OUT)


def connect():
    # Connexion au WLAN
    wlan = network.WLAN(network.STA_IF)
    wlan.active(True)
    wlan.config(pm=0xa11140) # Pour augmenter la puissance du signal si besoin
    wlan.connect(ssid, password)
    while wlan.isconnected() == False:
        print('Waiting for connection...')
        sleep(1)
    print(wlan.ifconfig())
    ip = wlan.ifconfig()[0]
    print(f"Pi Pico W connectée à l'adresse IP : {ip}")
    return ip

def open_socket(ip):
    # Ouvrir un socket
    address = (ip, 80)
    connexion = socket.socket()
    connexion.bind(address)
    connexion.listen(1)
    return connexion

def webpage(temperature, etat_led, etat_relais):
    #Template HTML
    html = f"""
            <!DOCTYPE html>
            <html lang="fr">
            <head>
                <meta charset="UTF-8">
                <meta name="viewport" content="width=device-width, initial-scale=1.0">
                <title>Pi Pico W</title>
            </head>
            <body>            
            <form action="./led-on">
            <input type="submit" value="Allumer la LED" />
            </form>
            <form action="./led-off">
            <input type="submit" value="Eteindre la LED" />
            </form>
            <p>La LED est {etat_led}</p>
            <form action="./relais-on">
            <input type="submit" value="Allumer le relais" />
            </form>
            <form action="./relais-off">
            <input type="submit" value="Eteindre le relais" />
            </form>
            <p>Le relais est {etat_relais}</p>
            <p>La température est de {temperature} °C</p>
            </body>
            </html>
            """
    return str(html)

def serveur(connexion, dt):
    #Start a web server
    etat_led = 'OFF'
    led.off()
    etat_relais = 'OFF'
    relais.off()
    temperature = 0
    while True:
        client = connexion.accept()[0]
        requete = client.recv(1024)
        requete = str(requete)
        try:
            requete = requete.split()[1]
        except IndexError:
            pass
        if requete == '/led-on?':
            led.on()
            etat_led = 'ON'
        elif requete =='/led-off?':
            led.off()
            etat_led = 'OFF'
        if requete == '/relais-on?':
            relais.on()
            etat_relais = 'ON'
        elif requete =='/relais-off?':
            relais.off()
            etat_relais = 'OFF'
        temperature = pico_temp_sensor.temp
        print(requete)
        html = webpage(temperature, etat_led, etat_relais)
        client.send(html)
        client.close()


try:
    # Connexion au WLAN
    ip = connect()
    # Réglage de l'horloge
    ntptime.settime() # Réglage de l'horloge à l'heure UTC obtenu d'internet (protocole NTP)
    t = rtc.datetime() # Tuple (year, month, day, weekday, hours, minutes, seconds, subseconds)
    print(f"RTC du RP2040 à l'heure UTC : {t}")
    # Réglage de l'horloge à l'heure de Paris
    saison = "été" if 3<t[1]<11 else "hiver"
    decalage = 2 if 3<t[1]<11 else 1 # 1h en hiver, 2h en été
    dt = rtc.datetime((t[0], t[1], t[2], t[3], t[4] + decalage, t[5], t[6], t[7]))
    print(f"RTC du RP2040 à l'heure d'{saison}) : {dt}")
    # Démarrage du serveur
    connexion = open_socket(ip)
    serveur(connexion, dt)

except KeyboardInterrupt:
    machine.reset()

Autres applications liées#