Cos'è MicroPython? Comandi base, REPL e primi programmi
Cos'è MicroPython e in cosa differisce da Python? REPL, machine.Pin, PWM, ADC, I2C, ticks_ms, main.py, Thonny, mpremote, mip e firmware per Pico ed ESP32.
MicroPython è una reimplementazione piccola e veloce del linguaggio Python 3 per i microcontrollori. Quando installi MicroPython su una scheda come il Raspberry Pi Pico o l'ESP32, la scheda esegue da sola il codice Python: scrivi un comando senza compilare nulla e vedi subito il LED accendersi. Se hai imparato Python a scuola o sul computer, con la stessa sintassi puoi leggere pin, pilotare motori, raccogliere dati dai sensori e collegarti al Wi-Fi.
In questa guida scoprirai in cosa MicroPython differisce dal Python normale, il REPL che ti permette di parlare subito con la scheda e i moduli che userai di più, cioè machine.Pin, PWM, ADC e I2C, con codice di esempio. Poi vedrai la differenza tra time.sleep e ticks_ms, i file main.py e boot.py che partono all'avvio, il caricamento dei file con Thonny e mpremote, l'aggiunta di librerie con mip e l'installazione del firmware su Pico ed ESP32. Nell'ultima sezione mettiamo a confronto MicroPython e Arduino C++.

Cos'è MicroPython e in cosa differisce da Python?
MicroPython è un progetto open source avviato da Damien George nel 2013 per una piccola scheda e oggi supporta decine di microcontrollori. Il firmware che installi sulla scheda contiene l'interprete Python, i moduli di base e un piccolo file system. Il tuo codice viene prima trasformato in bytecode sulla scheda e poi l'interprete esegue quel bytecode passo dopo passo. Poiché è impossibile far entrare tutto il Python del computer in poche centinaia di KB di RAM, il linguaggio resta lo stesso, ma la maggior parte delle librerie è ridotta o del tutto assente. In cambio è stato aggiunto qualcosa che il Python per desktop non ha: il modulo machine, che dà accesso diretto all'hardware.
| Argomento | Python (computer) | MicroPython (scheda) |
|---|---|---|
| Dove gira | Un computer con gigabyte di RAM | Un microcontrollore con centinaia di KB di RAM |
| Libreria standard | Molto ampia: datetime, threading, urllib... | Un piccolo sottoinsieme: time, os, json, re, struct, random, math... |
| Pacchetti | numpy, pandas e migliaia di altri con pip | Niente numpy né pandas; pacchetti micropython-lib con mip |
| Accesso all'hardware | Nessuno, servono librerie aggiuntive | Modulo machine: Pin, PWM, ADC, I2C, SPI, UART, Timer |
| Numeri decimali | 64 bit (circa 15 cifre) | 32 bit su Pico ed ESP32 (circa 7 cifre) |
| Tempo | time.time(), datetime | time.sleep_ms(), time.ticks_ms(), machine.RTC |
| Avvio del programma | Lo lanci dalla riga di comando | boot.py e main.py partono da soli all'avvio |
Schede che eseguono MicroPython
| Scheda | File del firmware | RAM totale | Nota |
|---|---|---|---|
| Raspberry Pi Pico (RP2040) | RPI_PICO (.uf2) | 264 KB | La scheda più facile per iniziare |
| Raspberry Pi Pico W | RPI_PICO_W (.uf2) | 264 KB | Modulo network per il Wi-Fi; il firmware del Pico normale qui non attiva il Wi-Fi |
| Raspberry Pi Pico 2 (RP2350) | RPI_PICO2 (.uf2) | 520 KB | Più veloce, più memoria |
| ESP32 (WROOM) | ESP32_GENERIC (.bin) | 520 KB (il Wi-Fi ne usa una parte) | Wi-Fi e Bluetooth; molta più memoria nei modelli con PSRAM |
| ESP8266 (NodeMCU, Wemos D1 Mini) | ESP8266_GENERIC (.bin) | Circa 80 KB | Funziona, ma la memoria è poca; per nuovi progetti scegli un ESP32 |
| Arduino Uno (ATmega328P) | Nessuno | 2 KB | Non può eseguire MicroPython; si programma in C++ |
Installare il firmware MicroPython su Pico ed ESP32
- Pico: Tieni premuto il pulsante BOOTSEL della scheda mentre colleghi il cavo USB, poi rilascialo. Sul computer compare un'unità chiamata RPI-RP2 (RP2350 sul Pico 2).
- Scarica dalla pagina ufficiale di MicroPython il file .uf2 adatto alla tua scheda (RPI_PICO per il Pico, RPI_PICO_W per il Pico W) e trascinalo in quell'unità.
- Finita la copia, la scheda si riavvia da sola e l'unità scompare; MicroPython è installato. In Thonny scegli MicroPython (Raspberry Pi Pico) in Strumenti > Opzioni > Interprete.
- ESP32: Se sul computer hai Python, scrivi pip install esptool nella riga di comando. Collega la scheda e trova la sua porta (ad esempio COM3 su Windows, /dev/ttyUSB0 su Linux).
- Cancella prima la flash: esptool.py --chip esp32 --port COM3 erase_flash. Se la scheda non si connette, tieni premuto il pulsante BOOT mentre il comando è in esecuzione.
- Scrivi il firmware: esptool.py --chip esp32 --port COM3 --baud 460800 write_flash -z 0x1000 ESP32_GENERIC-....bin. Su ESP32-S3 ed ESP32-C3 l'indirizzo è 0x0. L'opzione Install or update MicroPython (esptool) di Thonny fa la stessa cosa da una finestra.
Il REPL: parlare subito con la scheda
Il REPL (Read-Eval-Print Loop) è la riga di comando che la scheda ti apre attraverso la porta seriale. Il simbolo >>> che vedi nella finestra Shell in basso in Thonny indica che il REPL ti sta aspettando. Se scrivi 1 + 1, la scheda calcola e restituisce 2; se scrivi from machine import Pin e poi Pin("LED", Pin.OUT).value(1), il LED del Pico si accende in quell'istante. Non c'è modo più rapido del REPL per leggere il valore di un sensore, verificare se un pin è collegato bene o scoprire come funziona una libreria, senza aspettare compilazione e caricamento.
| Scorciatoia o comando | Cosa fa |
|---|---|
| Ctrl+C | Ferma il programma in esecuzione (KeyboardInterrupt) e torna al REPL |
| Ctrl+D | Riavvio software (soft reset); boot.py e main.py ripartono |
| Ctrl+E | Modalità incolla: incolli codice lungo senza rovinare l'indentazione e lo esegui con Ctrl+D |
| Tab | Completamento automatico; scrivi machine. e premi Tab per vedere tutto ciò che c'è nel modulo |
| help("modules") | Elenca tutti i moduli del firmware |
| import gc; gc.mem_free() | Mostra in byte la RAM libera per il tuo programma |
| import os; os.listdir() | Elenca i file sulla scheda |
Primo programma e il suo equivalente in Arduino C++
1# İlk program: dahili LED'i yakıp söndür / First program: blink the onboard LED
2from machine import Pin
3import time
4
5led = Pin("LED", Pin.OUT) # Pico ve Pico W; ESP32'de Pin(2, Pin.OUT) / Pico and Pico W; Pin(2, Pin.OUT) on ESP32
6
7while True:
8 led.value(1) # yak / on
9 time.sleep(0.5) # saniye cinsinden / in seconds
10 led.value(0) # söndür / off
11 time.sleep(0.5)1// Aynı program Arduino C++ ile / The same program in Arduino C++
2void setup() {
3 pinMode(LED_BUILTIN, OUTPUT);
4}
5
6void loop() {
7 digitalWrite(LED_BUILTIN, HIGH);
8 delay(500); // milisaniye cinsinden / in milliseconds
9 digitalWrite(LED_BUILTIN, LOW);
10 delay(500);
11}I due programmi fanno la stessa cosa, ma la struttura è diversa. In MicroPython non esistono setup() e loop(): il file viene eseguito una volta dall'alto in basso e il ciclo infinito lo costruisci tu con while True:. Al posto di parentesi graffe e punti e virgola si usa l'indentazione; tutte le righe dentro il ciclo devono avere la stessa rientranza (di solito 4 spazi). Anche l'attesa usa un'altra unità: time.sleep(0.5) vuole i secondi, mentre delay(500) di Arduino vuole i millisecondi. In MicroPython si usano time.sleep_ms() per i millisecondi e time.sleep_us() per i microsecondi. Le basi del lato Arduino sono in Basi della programmazione Arduino.
machine.Pin: ingressi e uscite digitali
| MicroPython | Equivalente in Arduino C++ | Descrizione |
|---|---|---|
| led = Pin(15, Pin.OUT) | pinMode(15, OUTPUT) | Imposta il pin come uscita |
| led.value(1) o led.on() | digitalWrite(15, HIGH) | Porta il pin a HIGH; value(0) o off() lo porta a LOW |
| buton = Pin(14, Pin.IN, Pin.PULL_UP) | pinMode(14, INPUT_PULLUP) | Ingresso con la resistenza di pull-up interna |
| buton.value() | digitalRead(14) | Restituisce 0 o 1 |
| led.toggle() | digitalWrite(15, !digitalRead(15)) | Inverte lo stato; disponibile sul Pico, sull'ESP32 usa value(not led.value()) |
| buton.irq(trigger=Pin.IRQ_FALLING, handler=f) | attachInterrupt(..., f, FALLING) | Chiama la funzione f quando il pin cambia |
time.sleep e ticks_ms: misurare il tempo senza bloccare
time.sleep() mette la scheda completamente in attesa; nel frattempo nessun pulsante viene letto e nessun sensore viene controllato. Per gestire più compiti insieme si usa l'equivalente MicroPython della tecnica millis() di Arduino: time.ticks_ms() dà i millisecondi trascorsi dall'avvio e time.ticks_diff(nuovo, vecchio) calcola la differenza tra due istanti. È importante ottenere la differenza con ticks_diff e non con una sottrazione normale; il contatore ricomincia da capo dopo un certo valore e in quel momento la sottrazione dà un risultato sbagliato. Il codice seguente fa lampeggiare il LED senza bloccare e intanto ascolta un pulsante tramite un interrupt (IRQ); ogni pressione cambia la velocità del lampeggio.
1# delay kullanmadan iki iş: LED yanıp söner, buton kesmeyle modu değiştirir
2# Two jobs without blocking: the LED blinks, a button interrupt switches the mode
3from machine import Pin
4import time
5
6led = Pin(15, Pin.OUT) # LED + 220 Ω, GP15
7buton = Pin(14, Pin.IN, Pin.PULL_UP) # buton GP14 ile GND arasında / button between GP14 and GND
8
9hizli = False
10son_basma = 0
11son_degisim = time.ticks_ms()
12
13def buton_kesme(pin): # kesme fonksiyonu kısa olmalı / keep the handler short
14 global hizli, son_basma
15 simdi = time.ticks_ms()
16 if time.ticks_diff(simdi, son_basma) > 200: # 200 ms debounce / 200 ms debounce
17 son_basma = simdi
18 hizli = not hizli
19
20buton.irq(trigger=Pin.IRQ_FALLING, handler=buton_kesme) # basınca HIGH'dan LOW'a iner / goes HIGH to LOW when pressed
21
22while True:
23 aralik = 100 if hizli else 500
24 if time.ticks_diff(time.ticks_ms(), son_degisim) >= aralik: # taşmaya karşı güvenli / safe against wrap-around
25 son_degisim = time.ticks_ms()
26 led.value(not led.value())
27 # burada başka işler yapılabilir / other work can run herePWM: luminosità, servo e suoni
1# PWM: LED parlaklığı ve servo açısı / PWM: LED brightness and servo angle
2from machine import Pin, PWM
3import time
4
5led = PWM(Pin(15))
6led.freq(1000) # 1 kHz: titreme görünmez / no visible flicker
7
8for d in range(0, 65536, 2048): # duty_u16: 0 (kapalı) ... 65535 (tam) / 0 (off) ... 65535 (full)
9 led.duty_u16(d)
10 time.sleep_ms(20)
11led.duty_u16(0)
12
13servo = PWM(Pin(16))
14servo.freq(50) # servolar 50 Hz (20 ms) ister / servos expect 50 Hz (20 ms)
15
16def servo_aci(derece):
17 us = 500 + derece * 2000 // 180 # 0° = 0,5 ms, 180° = 2,5 ms; servona göre ayarla / tune for your servo
18 servo.duty_ns(us * 1000)
19
20for a in (0, 90, 180, 90):
21 servo_aci(a)
22 time.sleep(1)L'oggetto PWM accende e spegne un pin molto velocemente per regolare una potenza media. freq() stabilisce quante volte al secondo si ripete e duty_u16() per quanto tempo il pin resta acceso, con un numero tra 0 e 65535; 32768 corrisponde a circa il 50 %. Questa scala offre passi molto più fini dell'intervallo 0–255 di analogWrite su Arduino. I servo si aspettano un segnale a 50 Hz e un impulso tra 0,5 e 2,5 ms; duty_ns() imposta la durata dell'impulso direttamente in nanosecondi e semplifica molto il codice del servo. Puoi anche suonare note dando a un buzzer passivo valori diversi di freq(). Duty cycle e frequenza sono spiegati nel dettaglio in Cos'è il PWM.
ADC: lettura analogica
1# ADC: potansiyometre ve Pico'nun dahili sıcaklık sensörü
2# ADC: a potentiometer and the Pico's internal temperature sensor
3from machine import ADC, Pin
4import time
5
6pot = ADC(Pin(26)) # GP26 = ADC0; ESP32'de ADC(Pin(34)) / ADC(Pin(34)) on ESP32
7yonga = ADC(4) # 4. kanal: dahili sıcaklık / channel 4: internal temperature
8
9def ortalama(adc, n=16): # gürültüyü azalt / reduce noise
10 toplam = 0
11 for _ in range(n):
12 toplam += adc.read_u16()
13 return toplam // n
14
15while True:
16 ham = ortalama(pot) # 0-65535 (12 bit ölçüm 16 bite ölçeklenir) / 12-bit reading scaled to 16 bits
17 volt = ham * 3.3 / 65535
18 v_t = ortalama(yonga) * 3.3 / 65535
19 derece = 27 - (v_t - 0.706) / 0.001721 # RP2040 veri sayfasındaki formül / formula from the RP2040 datasheet
20 print("Pot: {} ({:.2f} V) Yonga / chip: {:.1f} C".format(ham, volt, derece))
21 time.sleep(1)read_u16() restituisce un valore tra 0 e 65535 su tutte le schede, quindi lo stesso codice funziona su Pico ed ESP32. L'ADC del Pico è in realtà a 12 bit e la lettura viene scalata a 16 bit. Il Pico ha tre pin analogici accessibili: GP26 (ADC0), GP27 (ADC1) e GP28 (ADC2); il quarto canale è il sensore di temperatura interno del chip e misura la temperatura del chip, non quella della stanza. Sull'ESP32 serve adc.atten(ADC.ATTN_11DB) per leggere l'intero intervallo 0–3,3 V, e i pin ADC2 non si possono usare con il Wi-Fi attivo, quindi scegli i pin ADC1 tra GPIO 32 e 39. La media di 16 letture nel codice riduce sensibilmente il rumore dell'ADC. Concetti come risoluzione e tensione di riferimento sono in Cos'è un ADC.
I2C: collegare sensori e display
1# I2C: hattı tara ve SSD1306 OLED'e yaz / I2C: scan the bus and write to an SSD1306 OLED
2from machine import Pin, I2C
3import ssd1306 # önce: mpremote mip install ssd1306 / first: mpremote mip install ssd1306
4
5i2c = I2C(0, sda=Pin(4), scl=Pin(5), freq=400000) # Pico; ESP32'de I2C(0, sda=Pin(21), scl=Pin(22))
6adresler = i2c.scan()
7print("Bulunan / found:", [hex(a) for a in adresler]) # OLED genelde 0x3c / OLED is usually 0x3c
8
9if 0x3C in adresler:
10 oled = ssd1306.SSD1306_I2C(128, 64, i2c)
11 oled.fill(0)
12 oled.text("MicroPython", 0, 0)
13 oled.text("I2C: " + hex(adresler[0]), 0, 16)
14 oled.show()I2C(0, sda=..., scl=...) avvia l'unità I2C hardware sui pin scelti e scan() restituisce l'elenco degli indirizzi di tutti i dispositivi che rispondono sul bus. Se un sensore non funziona, questa scansione è la prima cosa da fare: un elenco vuoto indica un problema di collegamento, e un indirizzo diverso da quello atteso si corregge nel codice. Sul Pico i pin utilizzabili da ogni unità I2C sono fissi; per esempio per I2C0 funzionano le coppie GP0-GP1, GP4-GP5 o GP8-GP9, e scegliendo una coppia sbagliata ottieni un ValueError. Sull'ESP32 l'I2C si può assegnare a quasi tutti i pin. I dettagli del display sono in Display OLED e il protocollo in Cos'è l'I2C.
main.py e boot.py: il codice che parte all'avvio
Quando premi Esegui in Thonny, il codice gira solo in quel momento senza essere salvato sulla scheda; staccando l'USB sparisce. Perché il codice parta da solo a ogni accensione devi salvare il file sulla scheda con il nome main.py. All'avvio viene eseguito prima boot.py e poi main.py. boot.py serve per preparativi da fare una volta, come la connessione Wi-Fi o l'impostazione dell'orologio; il firmware dell'ESP32 crea questo file da solo, mentre sul Pico di solito non c'è. Il tuo programma vero e proprio sta sempre in main.py. Puoi richiamare in main.py funzioni scritte in altri file con import e salvare misure nel file system della scheda con open().
1# main.py: kart her açıldığında otomatik çalışır / runs automatically every time the board starts
2import time
3from machine import Pin
4
5time.sleep(3) # Ctrl+C ile durdurmak için güvenlik payı / a safety window for Ctrl+C
6led = Pin("LED", Pin.OUT)
7sayac = 0
8
9try:
10 while True:
11 sayac += 1
12 led.value(sayac % 2)
13 print("Calisiyor / running", sayac)
14 time.sleep(1)
15except KeyboardInterrupt: # Thonny'de Stop ya da Ctrl+C / Stop in Thonny or Ctrl+C
16 led.value(0)
17 print("Durduruldu / stopped")Caricare i file: Thonny e mpremote
Se stai iniziando, Thonny è la strada più semplice: scrivi il codice, scegli File > Salva come, nella finestra che si apre seleziona Raspberry Pi Pico o MicroPython device e chiama il file main.py. Aprendo Visualizza > File vedi affiancati i file del computer e quelli della scheda, e li copi dall'uno all'altro con il tasto destro. Per chi ama la riga di comando e usa un editor come VS Code, lo strumento ufficiale è mpremote; si installa con pip install mpremote e si collega da solo alla prima scheda MicroPython che trova.
| Comando mpremote | Cosa fa |
|---|---|
| mpremote | Si collega alla prima scheda trovata e apre il REPL (uscita: Ctrl+X) |
| mpremote ls | Elenca i file sulla scheda |
| mpremote cp main.py :main.py | Copia un file dal computer alla scheda; i due punti (:) indicano la scheda |
| mpremote run test.py | Esegue il file senza salvarlo sulla scheda e ne mostra l'output |
| mpremote mip install ssd1306 | Scarica la libreria con la connessione del computer e la installa nella cartella /lib della scheda |
| mpremote reset | Riavvia la scheda |
| mpremote connect COM3 ls | Si collega alla scheda su una porta specifica (su macOS e Linux ad esempio /dev/ttyACM0) |
Aggiungere librerie: mip
In MicroPython non c'è pip; al suo posto si usa il piccolo gestore di pacchetti mip. Su una scheda che può andare su internet, come Pico W o ESP32, ti colleghi prima al Wi-Fi e poi scrivi nel REPL import mip e mip.install("ssd1306"); il pacchetto viene scaricato dal repository ufficiale micropython-lib e messo nella cartella /lib della scheda. Puoi installare anche un driver da GitHub con mip.install("github:utente/repository"). Per un Pico senza Wi-Fi fai la stessa cosa dal computer con il comando mpremote mip install o con il menu Strumenti > Gestisci pacchetti di Thonny. Anche copiare sulla scheda un driver di un solo file (ad esempio un .py scritto per un sensore) funziona; finché il file si trova nella radice o in /lib, lo carichi con import. I passaggi per collegarsi al Wi-Fi sono in Wi-Fi con il Pico W.
MicroPython o Arduino C++?
| Caratteristica | MicroPython | Arduino C++ |
|---|---|---|
| Linguaggio | Sintassi Python 3 | C++ e core Arduino |
| Come gira | Un interprete sulla scheda esegue bytecode | Compilato in codice macchina sul computer |
| Ciclo di prova | Immediato nel REPL; salvare richiede 1–2 secondi | Compilazione e caricamento a ogni modifica, 10–60 secondi |
| Velocità | I cicli in Python puro sono circa 10–100 volte più lenti | Velocità nativa |
| Temporizzazione | Il garbage collector ogni tanto fa brevi pause | Prevedibile fino al microsecondo |
| File system | Sì: main.py, file di dati e di impostazioni | No; serve la EEPROM o una libreria aggiuntiva |
| Librerie | micropython-lib e driver della comunità | L'enorme ecosistema di librerie Arduino |
| Schede | Pico, ESP32, ESP8266 | Quasi tutte, comprese Uno, Nano e Mega |
| Messaggi di errore | Messaggio chiaro con numero di riga durante l'esecuzione | Errori di compilazione; durante l'esecuzione si segue con Serial.print |
| Ideale per | Imparare, prove rapide, Wi-Fi e gestione dei dati | Temporizzazione precisa, schede con poca memoria, tante librerie pronte |
In pratica decide il tuo progetto. Leggere un sensore e inviarlo via Wi-Fi, servire una pagina web o pilotare un display richiede meno righe e si fa prima in MicroPython. Generare segnali con precisione al microsecondo, aggiornare centinaia di LED molto velocemente o avere solo una scheda piccola come la Uno fa pendere la bilancia verso il C++. Puoi accelerare una funzione lenta con il decoratore @micropython.native e ridurre le pause del garbage collector evitando di creare nuove liste e stringhe dentro i cicli. Per scegliere la scheda vedi anche Arduino o ESP32.
Errori comuni e soluzioni
| Errore o sintomo | Causa | Soluzione |
|---|---|---|
| ImportError: no module named 'ssd1306' | La libreria non è sulla scheda | Installala con mip o mpremote mip, oppure copia il file .py sulla scheda |
| IndentationError | Indentazione incoerente, spazi e tabulazioni mescolati | Usa 4 spazi in tutto il file; Thonny lo fa per te |
| OSError: [Errno 5] EIO (I2C) | Il dispositivo non risponde: collegamenti, indirizzo o alimentazione | Controlla l'indirizzo con scan(), verifica SDA e SCL |
| ValueError: bad SCL pin | I pin scelti non appartengono a quell'unità I2C | Scegli la coppia giusta di I2C0 o I2C1 dal pinout del Pico |
| Il codice funziona in Thonny ma non dopo aver staccato l'USB | Il file non è stato salvato sulla scheda come main.py | Con Salva come salvalo sulla scheda come main.py |
| MemoryError: memory allocation failed | RAM piena: una lista grande, un testo lungo o un buffer enorme | Elabora i dati a pezzi, chiama gc.collect(), usa bytearray |
| Thonny: Device is busy or does not respond | main.py è in un ciclo senza pause oppure un altro programma usa la porta | Stop o Ctrl+C, chiudi l'altro programma, se serve cancella la flash |
MicroPython è la strada più breve verso il mondo dei microcontrollori se conosci già Python: vedi il risultato appena provi un pin nel REPL e con poche righe leggi un sensore e ti colleghi al Wi-Fi. Quando avrai imparato i moduli di base, l'idea di main.py e la temporizzazione senza blocchi con ticks_ms, i tuoi progetti cresceranno in fretta. Nell'app BlueGrays trovi progetti con il Raspberry Pi Pico con LED, semaforo, pulsanti e PWM, con schemi di collegamento e codice MicroPython passo passo.
Domande frequenti
Cos'è MicroPython?
MicroPython è una piccola versione del linguaggio Python 3 pensata per i microcontrollori. Grazie al firmware installato sulla scheda, schede come il Raspberry Pi Pico e l'ESP32 eseguono direttamente codice Python; con il modulo machine accedi a pin, PWM, ADC e I2C.
MicroPython e Python sono la stessa cosa?
La sintassi è la stessa, ma MicroPython è un sottoinsieme ridotto del Python per desktop. Mancano librerie grandi come numpy e pandas, la libreria standard è ridotta e i numeri decimali sono a 32 bit su Pico ed ESP32. In cambio c'è il modulo machine per l'accesso diretto all'hardware.
Meglio MicroPython o Arduino?
Dipende dal tuo obiettivo. MicroPython è più comodo per imparare, fare prove rapide e realizzare progetti che inviano dati via Wi-Fi; Arduino C++ è più veloce, ha una temporizzazione più precisa e offre molte più librerie pronte. Pico ed ESP32 si possono programmare in entrambi i modi.
MicroPython funziona su Arduino Uno?
No. Il chip ATmega328P di Arduino Uno ha solo 2 KB di RAM e 32 KB di flash, e l'interprete MicroPython non ci sta. Se vuoi usare MicroPython, scegli una scheda più potente come il Raspberry Pi Pico o l'ESP32.
Come si installa una libreria in MicroPython?
Su una scheda collegata a internet scrivi nel REPL import mip e mip.install("nome_pacchetto"). Sulle schede senza Wi-Fi fai lo stesso dal computer con il comando mpremote mip install nome_pacchetto o con il gestore di pacchetti di Thonny. Anche copiare sulla scheda driver di un solo file funziona.
Come si salva il codice in modo permanente sul Pico?
In Thonny scegli Raspberry Pi Pico da File > Salva come e chiama il file main.py. A ogni avvio viene eseguito prima boot.py e poi main.py da solo; anche se stacchi l'USB dal computer e lo colleghi a un'altra sorgente a 5 V, il programma continua a funzionare.
Progetti da realizzare dopo questo articolo
Vedi tutti i progetti
Lampeggio LED Integrato Raspberry Pi Pico (Pico e Pico W)
Il progetto di apertura della serie Raspberry Pi Pico! Facciamo lampeggiare il LED verde integrato per verificare che la scheda funzioni — un classico primo esperimento "Hello World". NESSUN componente esterno, solo Pico e cavo USB. Il codice è scritto in MicroPython (il linguaggio ufficialmente supportato dalla Raspberry Pi Foundation). Impara la classe machine.Pin, la modalità Pin.OUT, i metodi led.on()/off() e time.sleep() in Thonny IDE. Segui ogni commutazi

Accensione di un LED esterno con Raspberry Pi Pico (breadboard)
Il passo successivo dopo il LED integrato di Pico: collegare un LED esterno alla breadboard e controllarlo tramite il pin GP14. Con questo progetto imparerai come utilizzare qualsiasi pin GPIO generico del Pico come uscita, la polarità del LED (stelo lungo = anodo/+, stelo corto = catodo/–) e perché è indispensabile un resistore di limitazione della corrente (220 Ω). Se non inserisci il resistore, l’LED riceverà una corrente eccessiva e potrebbe bruciarsi. Il circuito è molto semplice: Pico GP14

Raspberry Pi Pico Due LED alternati (Flip-Flop)
Il passo successivo dopo il LED singolo sul Pico: due LED lampeggiano alternativamente in un pattern flip-flop classico. Due LED di colori diversi (rosso su GP14, verde su GP13) scambiano stati ogni 500ms. Pin.toggle() di MicroPython rende il codice breve. Base di semafori, lampeggianti.

Simulatore Semaforo Raspberry Pi Pico (3 LED Sequenziali)
Simuliamo un vero semaforo con LED rosso, giallo e verde. Verde 4 sec "vai", giallo 1,5 sec "preparati", rosso 3 sec "fermati" e rosso+giallo 1 sec "partenza" (pattern europeo). Impara la definizione di funzione, la logica della macchina a stati e la sincronizzazione multi-GPIO. Circuito semplice: 3 LED su GP11/GP12/GP13.

Raspberry Pi Pico LED Controllato da Pulsante (Push)
Primo progetto di input con Pico — lettura pulsante! LED si accende mentre il pulsante è premuto. Impara Pin.IN, Pin.PULL_UP e button.value(). GP14 LED, GP2 pulsante con PULL_UP interno. Premuto = 0, rilasciato = 1 — standard.

Raspberry Pi Pico Pulsante Debounce: IRQ vs Software Polling
Una pressione e il codice conta 3-4? È contact bounce! Confronta 2 metodi di conteggio in Serial: polling RAW (cattura bounce, conta male) vs IRQ + software debounce (preciso). Impara fisica del bounce, software debounce, Pin.irq() interrupt, IRQ_FALLING trigger, ISR handler, sicurezza delle variabili globali ISR.

Raspberry Pi Pico PWM LED Fade (Effetto Respiro)
Il LED non lampeggia più — respira! Con il PWM (modulazione di larghezza d'impulso) del Raspberry Pi Pico, la luminosità sale e scende lentamente. Impara la classe machine.PWM, duty_u16() (luminosità a 16 bit 0–65535), la frequenza PWM, i cicli range() e l'uscita quasi analogica. Base per miscelazione colori RGB, controllo motori, servo e buzzer.

Raspberry Pi Pico LED RGB Ciclo di Colori (PWM a 3 Canali)
Un LED, milioni di colori! Un LED RGB contiene 3 LED: rosso, verde e blu. Con un canale PWM del Pico per ciascuno, i colori si mescolano: rosso + verde = giallo, verde + blu = ciano, tutti e tre = bianco. Il LED scorre 8 colori. Impara più canali PWM, funzioni (def), miscelazione RGB, conversione da 8 a 16 bit (x257) e catodo comune vs anodo comune.
Altri articoli
App BlueGrays
Costruisci questo circuito passo passo sul telefono
Schema, codice ed elenco componenti in un’unica schermata. Oltre 200 progetti Arduino, ESP32 e Pico da realizzare.
Inquadra con il telefono
Punta la fotocamera sul codice: si apre lo store del tuo telefono.
oppure apri lo store

