uart-commandes.py

Raspberry Pi Pico · Fichier : uart-commandes.py · Langage : Python · Usage : Servir des commandes sur un port UART (module série, GPS...)

Un mini-serveur de commandes sur UART0 (GP0/GP1) : les modules série classiques (GPS, modem cellulaire, autre microcontrôleur) peuvent basculer la LED, lire la température ou interroger la carte avec des lignes texte simples.

Matériel requis

Une Raspberry Pi Pico (RP2040 double Cortex-M0+ @ 133 MHz) avec MicroPython installé, alimentée par USB. Un module série 3,3 V ou un câble USB-série pour tester (ne pas dépasser 3,3 V sur RX/TX).

Câblage

TX (GP0) vers RX du module, RX (GP1) vers TX, masses communes. Alimenter le module en 3,3 V ou prévoir un adaptateur de niveau.

Fonctionnement

uart.any() indique les octets reçus sans bloquer ; le tampon est découpé en lignes terminées par . Chaque commande renvoie une ligne de réponse, format simple à étendre.

Exécution

Installer MicroPython si besoin (maintenir BOOTSEL, brancher l'USB, déposer le fichier .uf2), puis copier le script sur le lecteur de la carte ou via Thonny. Le script démarre seul s'il s'appelle main.py.

Variantes

Augmenter le débit (921600) pour un flux de données, ou passer sur UART1 (GP4/GP5) pour laisser le shell MicroPython sur USB.

uart-commandes.py

# Serveur de commandes sur UART0 (GP0 = TX, GP1 = RX) a 115200 bauds.
# Permet de dialoguer avec un module serie (GPS, modem, autre carte).
from machine import UART, Pin
import machine
import time

uart = UART(0, baudrate=115200, tx=Pin(0), rx=Pin(1))

led = Pin(25, Pin.OUT)
buffers = b""

print("UART0 pret : 'l' bascule, 't' temperature, 's' etat")

def temperature():
    adc = machine.ADC(4)
    v = adc.read_u16() * 3.3 / 65535.0
    return 27.0 - (v - 0.706) / 0.001721

while True:
    if uart.any():                       # octets disponibles ?
        buffers += uart.read(uart.any())
        while b"
" in buffers:          # decoupage en lignes
            ligne, buffers = buffers.split(b"
", 1)
            cmd = ligne.strip().decode("utf-8", "ignore").lower()
            if cmd == "l":
                led.value(not led.value())
                uart.write("LED=%d
" % led.value())
            elif cmd == "t":
                uart.write("T=%.1f
" % temperature())
            elif cmd == "s":
                uart.write("OK uptime=%d
" % (time.ticks_ms() // 1000))
    time.sleep_ms(10)

← Retour à la fiche