Raspberry Pi Pico med MicroPython lar deg programmere Pico-kortet i Python fra første linje, og Pico 2 W er et godt kort å starte med. Du installerer MicroPython ved å kopiere én fil til kortet, skriver koden i Thonny og ser resultatet med en gang. Guiden har tre nivåer: blink en LED, dim den med en knapp og styr den fra mobilen over WiFi.
Pin("LED"). En ekstern LED kobler du til GP15 (pinne 20) gjennom en motstand på 220 Ω, og knappen til GP14 (pinne 19) med intern pull-up. Lagre som main.py når programmet skal starte av seg selv.Dette trenger du
| Nivå | Du bygger | Du lærer | Ekstra deler |
|---|---|---|---|
| 1: nybegynner | Blinkende LED, på kortet og på koblingsbrettet | Utganger, pauser og main.py | Rød LED, 220 Ω, to ledninger |
| 2: viderekommen | Knapp som dimmer LED-en, og temperaturmåling | Innganger, pull-up, PWM og ADC | Trykknapp, to ledninger |
| 3: avansert | Nettside som slår LED-en av og på | WiFi, sockets og HTTP | WiFi-nett på 2,4 GHz |
Kortet er Raspberry Pi Pico 2 W med RP2350-brikken, WiFi og Bluetooth. Du trenger også et koblingsbrett med 170 hull, koblingsledninger hann-hann, en rød 5 mm LED, en motstand på 220 Ω fra et motstandssett med 16 verdier, en 12 mm trykknapp og en micro-USB-kabel som overfører data, for eksempel en 4-i-1-kabel med micro-USB-plugg. LED-settet med 160 lysdioder har bare motstander på 1 kΩ; de virker, men gir svakere lys.
Pinnelister: lodd selv eller velg ferdig monterte
På produktbildene av Pico 2 W hos oss har kortet ingen pinnelister, bare loddehull langs de lange sidene. Kortet er laget for pinnelister med 2,54 mm pinneavstand som du lodder på selv. Du har to muligheter:
- Lodd på hunnlister. GPIO-kontaktsettet til Pico har to hunnlister på 1 × 20. Lodd dem på oversiden, så ser du fortsatt LED-en, BOOTSEL og tallene 1, 2 og 39 ved hjørnepinnene. Navnene GP0, GND og så videre står på undersiden av kortet, så tell deg fram fra pinne 1, slik pinout-tegningen viser. Hann-hann-ledningene går fra listene til koblingsbrettet, slik tegningene viser. Har du ikke loddet før? Les guiden om loddebolt og varmluft.
- Velg ferdig monterte pinner. Pico W-startsettet har en Pico W med monterte hannpinner, et koblingsbrett med 830 hull, LED-er, motstander, trykknapper, 40 hann-hann-ledninger og en micro-USB-kabel. Pico W bruker RP2040, men pinnene i denne guiden sitter på samme sted, og koden virker uendret. Last ned MicroPython-fila for Pico W; i BOOTSEL-modus heter disken RPI-RP2 i stedet for RP2350. Her står selve kortet i koblingsbrettet, over midtsporet, så ledningene går fra hullene ved siden av pinne 13, 18, 19 og 20, ikke fra hunnlistene som på tegningene.
Et åpent, gjennomsiktig kabinett for Pico beskytter kortet på pulten; sjekk at det passer til pinnelistene du lodder på.
Installer MicroPython på Raspberry Pi Pico 2 W
- Last ned riktig fil fra MicroPythons side for Pico 2 W: den øverste .uf2-fila under «Firmware» og «Releases», den som er merket «(latest)». Ikke velg «Preview builds»: det er uferdige utviklingsversjoner. «RISC-V CPU mode» er bare for deg som vil bruke RISC-V-kjernene. Pico, Pico W, Pico 2 og Pico 2 W har hver sin fil.
- Start i BOOTSEL-modus. Hold inne BOOTSEL-knappen mens du kobler kortet til PC-en. Slipp når disken RP2350 dukker opp.
- Kopier fila til RP2350-disken. Kortet skriver den til flashminnet og starter på nytt med MicroPython. Disken forsvinner, og det er slik det skal være.
- Neste gang holder det å koble til USB. BOOTSEL trenger du bare når fastvaren skal oppdateres.
Thonny kan også installere fastvaren: start kortet i BOOTSEL-modus som i trinn 2, klikk på tolkenavnet nederst til høyre, velg «Configure interpreter...», klikk på lenken «Install or update MicroPython» og velg varianten for Pico 2 W. Koden i guiden krever MicroPython 1.25 eller nyere. Får du AttributeError på IF_STA eller ipconfig, må du oppdatere fastvaren.
Kom i gang med Thonny
- Installer Thonny fra thonny.org, en gratis Python-editor for nybegynnere med støtte for MicroPython.
- Velg tolk: klikk på tolkenavnet nederst til høyre og velg «MicroPython (Raspberry Pi Pico)». Valget gjelder også Pico 2 W.
- Test i Shell nederst i vinduet: skriv
print("Hei fra Pico")og trykk Enter. Svaret kommer fra kortet. - Kjør koden i editoren med Run (F5). Stop (Ctrl+F2) avbryter programmet.
- Lagre på kortet: velg Save i File-menyen og deretter «Raspberry Pi Pico», ikke «This computer», og skriv
main.pysom filnavn. Filamain.pystarter automatisk hver gang kortet får strøm.
Pinout for Pico 2 W: pinnene du bruker
Hold kortet med USB-kontakten opp og komponentsiden mot deg. Pinne 1 er øverst til venstre og merket «1». Pinnene 1 til 20 går nedover venstre side, og 21 til 40 oppover høyre side. Tallet i koden er GP-nummeret, ikke pinnenummeret: Pin(15) betyr GP15 på pinne 20.
| Pinne | Navn | Bruk i guiden |
|---|---|---|
| 20 | GP15 | Ekstern LED, utgang og PWM |
| 19 | GP14 | Knapp, inngang med pull-up |
| 18 | GND | Jord for LED-en |
| 13 | GND | Jord for knappen |
| Ingen | LED (WL_GPIO0) | Innebygd LED, Pin("LED") |
| Ingen | ADC-kanal 4 | Innebygd temperatursensor |
| 36 | 3V3(OUT) | 3,3 V ut, brukes ikke her |
| 39 | VSYS | Strøminngang 1,8 til 5,5 V, brukes ikke her |
| 40 | VBUS | 5 V fra USB, brukes ikke her |
De andre GND-pinnene er 3, 8, 23, 28 og 38, og pinne 33 er analog jord (AGND). GP26 til GP28 på pinne 31, 32 og 34 kan også lese analoge spenninger.
Nivå 1: blink en LED med MicroPython
Del 1: den innebygde LED-en
LED-en ved USB-kontakten er koblet til trådløsbrikken CYW43439, ikke til RP2350. MicroPython kaller den derfor "LED". Skriv dette i editoren og trykk Run:
from machine import Pin
import time
led = Pin("LED", Pin.OUT)
while True:
led.toggle()
time.sleep(0.5)
Pin("LED", Pin.OUT)gjør LED-en til en utgang. Eldre eksempler for Pico uten W brukerPin(25), men på Pico 2 W er GP25 en intern pinne for trådløsbrikken.led.toggle()bytter mellom på og av,time.sleep(0.5)venter et halvt sekund, ogwhile True:gjentar alt sammen til du trykker Stop.
Del 2: en ekstern LED på GP15
Strømmen går fra GP15 gjennom motstanden og LED-en til GND. Motstanden begrenser strømmen; uten den kan både LED-en og pinnen ta skade. GP15 er også pinnen Raspberry Pi bruker i sine egne LED- og WiFi-eksempler.
- Trekk ut USB-kabelen.
- Legg koblingsbrettet til venstre for Picoen med den lange siden vannrett, så ledningene går ut til siden. Sett motstanden (rød, rød, brun) i nedre halvdel av brettet, fra kolonne 2 til 6. Tell fra venstre; de fem hullene i en kolonne er koblet sammen, og midtsporet skiller øvre og nedre halvdel.
- Sett LED-en med det lange beinet (anoden, +) i kolonne 6 og det korte (katoden, −) i kolonne 7.
- Koble pinne 20 (GP15, nederst på venstre side) til kolonne 2, og pinne 18 (GND, to pinner lenger opp) til kolonne 7.
- Sjekk strømveien før du kobler til USB: GP15, motstand, langt bein, LED, kort bein, GND.
Strømmen er høyst (3,3 V − spenningsfallet over LED-en) / motstanden. Produktsiden for LED-settet oppgir 2 til 2,3 V for røde LED-er og 3,2 V for blå, så en blå LED lyser bare svakt på 3,3 V. Bruk en rød LED i denne øvelsen. Motstanden på 220 Ω ligger innenfor området Raspberry Pi oppgir i sin egen LED-oppgave for Pico, omtrent 50 til 330 Ω.
| Motstand | Strøm med rød LED (2,0 V) | Resultat |
|---|---|---|
| 220 Ω | Opptil rundt 6 mA | Godt synlig lys |
| 330 Ω | Opptil rundt 4 mA | Litt svakere |
| 1 kΩ (LED-settet) | Opptil rundt 1,3 mA | Svakt, men synlig |
from machine import Pin
import time
led = Pin(15, Pin.OUT)
while True:
led.value(1)
time.sleep(0.5)
led.value(0)
time.sleep(0.5)
Pin(15, Pin.OUT) gjør GP15 til en utgang. value(1) gir 3,3 V på pinne 20 og tenner LED-en, og value(0) gir 0 V. Mer om motstandsverdier finner du i guiden om hva en resistor er og i fargekodekalkulatoren.
Hvis LED-en ikke lyser
- Snu LED-en: det lange beinet skal mot motstanden.
- Sjekk at ledningen sitter i pinne 20, den nederste til venstre, og ikke i pinne 19.
- Kontroller at motstanden er 220 Ω og ikke 220 kΩ (rød, rød, gul).
- Blinker den innebygde LED-en, men ikke den eksterne, er feilen i koblingen.
Prøv selv: lagre programmet på kortet som main.py og koble kortet til en USB-lader. LED-en skal blinke uten PC.
Nivå 2: knapp med pull-up og PWM-dimming
Hvert trykk på knappen gir sterkere lys, og etter fullt lys slokner LED-en. Du lærer å lese en inngang og å lage «halvt lys» med PWM.
Koble til knappen
- Trekk ut USB-kabelen og la LED-kretsen stå.
- Sett knappen over midtsporet med beina i kolonne 11 og 13, to bein i hver halvdel. Beina er koblet sammen to og to inni knappen, og et trykk kobler parene sammen.
- Koble pinne 19 (GP14) til kolonne 11 i nedre halvdel.
- Koble pinne 13 (GND) til kolonne 13 i øvre halvdel. Ledningene sitter da ved diagonalt motsatte bein, og det virker uansett hvordan beina er koblet sammen inni knappen.
Knappen trenger ingen egen motstand. Pin.PULL_UP kobler inn en intern motstand mot 3,3 V (32 til 86 kΩ ifølge RP2350-databladet), så pinnen leser 1 når knappen er sluppet. Når du trykker, kobles GP14 til GND, og pinnen leser 0.
from machine import Pin, PWM
import time
button = Pin(14, Pin.IN, Pin.PULL_UP)
led = PWM(Pin(15), freq=1000, duty_u16=0)
levels = [0, 1000, 6000, 20000, 65535]
step = 0
was_pressed = False
while True:
pressed = button.value() == 0
if pressed != was_pressed:
if pressed:
step = (step + 1) % len(levels)
led.duty_u16(levels[step])
print("Trinn", step, "duty", levels[step])
time.sleep_ms(50)
was_pressed = pressed
time.sleep_ms(10)
PWM(Pin(15), freq=1000, duty_u16=0)slår GP15 av og på 1000 ganger i sekundet. Hvor stor del av tiden pinnen er på (duty cycle), oppgir du som et tall fra 0 til 65535, og øyet ser bare svakere eller sterkere lys.- Verdiene i
levelsstiger raskt fordi selv lav duty cycle gir synlig lys. Raspberry Pis eget dimmeeksempel bruker også en kvadratisk kurve (duty * duty). pressed != was_pressedslår til når knappen endrer tilstand, ogif pressed:teller bare overgangen fra sluppet til trykket. Ellers ville lyset skifte mange ganger mens du holder knappen inne.time.sleep_ms(50)er enkel avprelling: kontaktene spretter i noen millisekunder både når du trykker og når du slipper. Pausen etter hver endring hindrer at ett trykk teller flere ganger.(step + 1) % len(levels)begynner på trinn 0 igjen etter siste trinn.
Den innebygde LED-en kan ikke dimmes slik, fordi den sitter på trådløsbrikken og ikke på en PWM-pinne.
Bonus: temperaturen i brikken med ADC
RP2350 har en temperatursensor på ADC-kanal 4. Den måler temperaturen i selve brikken, ikke i rommet, men viser godt hvordan en spenning blir et tall. RP2350-databladet (avsnitt 12.4.6) oppgir rundt 0,706 V ved 27 °C og −1,721 mV per grad, som gir formelen T = 27 − (U − 0,706) / 0,001721, der U er spenningen i volt.
from machine import ADC
import time
sensor = ADC(ADC.CORE_TEMP)
factor = 3.3 / 65535
while True:
voltage = sensor.read_u16() * factor
temp = 27 - (voltage - 0.706) / 0.001721
print("Brikketemperatur: %.1f °C" % temp)
time.sleep(2)
ADC(ADC.CORE_TEMP)velger temperaturkanalen, på Pico 2 W kanal 4, somADC(4)i Raspberry Pis eksempel. MicroPython slår på sensoren selv.read_u16()gir 0 til 65535 for 0 til 3,3 V, og ganget med3.3 / 65535blir det volt.- Resultatet er en tilnærming. Ifølge databladet kan 1 % feil i referansespenningen gi et avvik på over 4 °C, så kalibrer mot et termometer hvis du trenger nøyaktige verdier.
Hvis knappen ikke virker
- Legg inn
print(button.value())i løkka: 1 er sluppet, 0 er trykket. - Alltid 0: ledningene sitter på to bein som alltid er koblet sammen. Flytt GND-ledningen til beinet diagonalt motsatt.
- Alltid 1: sjekk at knappen står over midtsporet og at ledningen sitter i pinne 19.
Prøv selv: la LED-en lyse sterkere jo varmere brikken blir, eller bruk et avbrudd med button.irq(handler, Pin.IRQ_FALLING), der handler er en funksjon du skriver selv, slik Raspberry Pis avbruddseksempel viser.
Nivå 3: styr LED-en over WiFi med en liten nettside
Pico 2 W kobler seg til hjemmenettet og blir en liten webserver med lenkene «Slå på» og «Slå av» for LED-en på GP15. Koden bygger på Raspberry Pis eget webservereksempel for Pico W, men har passordet i en egen fil og leser forespørselen på en sikrere måte.
wifi_secrets.py, som du bare lagrer på Picoen. Da kan du dele main.py i klassen, på nett eller i Git uten passordet. Bruker du Git, skal fila stå i .gitignore. Ta heller ikke skjermbilder av den. Alle som får tak i kortet, kan lese filene på det.Fil 1: wifi_secrets.py
Skriv inn ditt eget nettnavn og passord, og lagre fila på «Raspberry Pi Pico» som wifi_secrets.py.
# Lagres bare på Picoen. Del aldri denne fila.
SSID = "navnet-på-nettet-ditt"
PASSWORD = "passordet-ditt"
Fil 2: main.py
import network
import socket
import time
from machine import Pin
import wifi_secrets
led = Pin(15, Pin.OUT, value=0)
led_on = False
network.country("NO")
wlan = network.WLAN(network.WLAN.IF_STA)
wlan.active(True)
wlan.connect(wifi_secrets.SSID, wifi_secrets.PASSWORD)
for _ in range(20):
status = wlan.status()
if status < 0 or status == network.STAT_GOT_IP:
break
print("Kobler til WiFi ...")
time.sleep(1)
if wlan.status() != network.STAT_GOT_IP:
raise RuntimeError("WiFi feilet, status %d" % wlan.status())
ip = wlan.ipconfig("addr4")[0]
print("Åpne http://%s/ i nettleseren" % ip)
PAGE = """<!DOCTYPE html>
<html lang="no"><head><meta charset="utf-8">
<meta name="viewport" content="width=device-width">
<title>Pico 2 W</title></head>
<body><h1>LED-en er %s</h1>
<p><a href="/on">Slå på</a> | <a href="/off">Slå av</a></p>
</body></html>
"""
HEADER = (b"HTTP/1.0 200 OK\r\n"
b"Content-Type: text/html; charset=utf-8\r\n\r\n")
addr = socket.getaddrinfo("0.0.0.0", 80)[0][-1]
server = socket.socket()
server.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
server.bind(addr)
server.listen(1)
while True:
client, remote = server.accept()
try:
client.settimeout(3)
request = client.readline()
while True:
header = client.readline()
if not header or header == b"\r\n":
break
parts = request.split(b" ")
path = parts[1] if len(parts) > 1 else b"/"
if path == b"/on":
led_on = True
elif path == b"/off":
led_on = False
led.value(1 if led_on else 0)
state = "PÅ" if led_on else "AV"
client.write(HEADER)
client.write((PAGE % state).encode())
except OSError as e:
print("Forbindelsesfeil:", e)
finally:
client.close()
Slik virker koden
import wifi_secretshenter nettnavn og passord. Mangler fila på kortet, stopper programmet medImportError.network.country("NO")setter landkoden for radioen. Uten landkode bruker driveren en standardinnstilling for hele verden, og da kan enkelte kanaler bli utilgjengelige, ifølge Raspberry Pis WiFi-dokumentasjon.network.WLAN(network.WLAN.IF_STA)lager et klientgrensesnitt mot ruteren, ogactive(True)slår radioen på.connect()starter tilkoblingen uten å vente på den.- Løkka venter i opptil 20 sekunder. MicroPython prøver som standard på nytt i det uendelige, også ved feil passord, så programmet trenger en egen tidsgrense.
network.STAT_GOT_IPbetyr at kortet har fått IP-adresse, og negativ status betyr feil. wlan.ipconfig("addr4")[0]er IP-adressen kortet har fått fra ruteren, for eksempel 192.168.1.42. Programmet skriver den ut i Shell.PAGEer nettsiden som tekst.%sbyttes ut med «PÅ» eller «AV», ogcharset="utf-8"gjør at æ, ø og å vises riktig.getaddrinfo("0.0.0.0", 80)ogbind()får serveren til å lytte etter tilkoblinger på port 80 fra alle enheter på nettet.SO_REUSEADDRlar deg starte programmet på nytt uten å vente på at porten blir ledig.server.accept()venter på en nettleser og gir en egen socket for den.settimeout(3)hindrer at en avbrutt forbindelse låser serveren.- Første linje fra nettleseren ser ut som
GET /on HTTP/1.1. Løkka etter den leser resten av HTTP-hodet fram til den tomme linjen, ogparts[1]er stien:/on,/offeller/. led_onhusker tilstanden. Svaret er HTTP-hodet iHEADERpluss siden, ogclient.close()ifinallylukker forbindelsen også ved feil.
Test og feilsøking
- Lagre begge filene på kortet og kjør
main.py. Shell viser «Kobler til WiFi ...» og så adressen. - Åpne adressen på en mobil eller PC på samme nett og trykk «Slå på».
- Når alt virker, kan kortet stå på en USB-lader. Adressen kan endre seg etter omstart; finn den i ruteren eller i Thonny.
- Status 1 etter 20 sekunder: kortet fikk ikke koblet seg til. MicroPython prøver på nytt i det uendelige, så også feil passord eller feil nettnavn kan vises som status 1. Sjekk nettnavn og passord i
wifi_secrets.py(store og små bokstaver), at nettet sender på 2,4 GHz, og flytt kortet nærmere ruteren. - Status −3, −2 eller −1: feil passord, nettet ble ikke funnet eller en annen feil. Sjekk de samme punktene.
- Status 2: kortet er koblet til nettet, men har ikke fått IP-adresse. Start ruteren eller kortet på nytt.
- Siden åpnes ikke: mobilen må være på samme nett, ikke på mobildata eller et eget gjestenett.
- Ustabil forbindelse: antennen sitter i motsatt ende av USB-kontakten, og databladet sier at ingenting bør stikke inn i antenneområdet. La ledningene fra pinne 18 til 20 gå ut til siden.
Prøv selv: legg til siden /temp, som viser brikketemperaturen fra nivå 2, eller styr den innebygde LED-en med Pin("LED", Pin.OUT).
Vanlige spørsmål
Hva er forskjellen på Pico 2 W og Pico W?
Pico 2 W har RP2350 med to Cortex-M33- eller to Hazard3 RISC-V-kjerner på opptil 150 MHz og 520 kB SRAM. Pico W har RP2040 med 264 kB SRAM. Pinnene i denne guiden sitter likt, men MicroPython-fila er forskjellig. Se også Raspberry Pi Pico eller ESP32.
Hvorfor finner ikke Thonny kortet?
Prøv en annen USB-kabel. Mange kabler fører bare strøm og ikke data. Kontroller tolken nederst til høyre. Vises disken RP2350 fortsatt, er MicroPython ikke installert. Kjører et program i en løkke, trykker du Stop.
Hvordan starter programmet uten PC?
Lagre det på kortet som main.py. MicroPython kjører fila hver gang kortet starter, så en USB-lader holder.
Tåler Pico 2 W 5 V på pinnene?
Nei, hold deg til 3,3 V. Utgangene gir 3,3 V, og GP26 til GP28 tåler ikke mer enn 3,3 V. RP2350-databladet beskriver en viss toleranse for høyere spenning på de digitale pinnene, men bare når kortet har strøm og pinnen er en inngang, så ikke stol på den. Bruk en nivåomformer mot 5 V-utstyr.
Må jeg holde inne BOOTSEL hver gang?
Nei, bare når fastvaren skal installeres eller oppdateres. Kjører kortet MicroPython, kan du skrive import machine og machine.bootloader() i Shell for å starte BOOTSEL-modus uten knappen.
Veien videre
Med LED, knapp, PWM, ADC og WiFi har du grunnlaget for de fleste små Pico-prosjekter. Til sensorer og display gir et koblingsbrett med 830 hull bedre plass. ESP32-guiden med MicroPython-eksempler går fra blink til webserver på ESP32, og guiden om GPIO med Python tar deg videre til Raspberry Pi. Er du usikker på hvilken plattform du skal velge, kan du begynne med oversikten over programmering med elektronikk.
Kilder
Installasjon og BOOTSEL følger Raspberry Pis MicroPython-dokumentasjon. Pinner, strøm og antenne er kontrollert mot databladet for Pico 2 W, og temperaturformel, pull-up og RP2350-E9 mot RP2350-databladet. LED-navnet, landkoden og webserveren bygger på Raspberry Pis WiFi-veiledning for Pico W-kortene og de offisielle MicroPython-eksemplene. Pin, PWM, ADC og WLAN følger MicroPythons hurtigreferanse for RP2.




