Udforsk verdenen af indlejrede systemer med Python. Denne omfattende guide dækker MicroPython, CircuitPython, hardwareintegration og virkelige projekter.
Python på metal: Et dybdegående kig på indlejret programmering og mikrocontrollerintegration
I årtier var verdenen af indlejrede systemer—de små computere, der driver alt fra smartwatches til industrielt maskineri—det eksklusive domæne for lavniveau sprog som C, C++ og Assembly. Disse sprog tilbyder uovertruffen kontrol og ydeevne, men de kommer med en stejl indlæringskurve og lange udviklingscyklusser. Indtast Python, sproget kendt for sin enkelhed, læsbarhed og enorme økosystem. Engang begrænset til webservere og datavidenskab, er Python nu i gang med et kraftfuldt ryk ind i hjertet af hardwaren, hvilket demokratiserer elektronikken for en ny generation af udviklere, hobbyister og innovatorer over hele verden.
Denne guide er din omfattende introduktion til den spændende verden af Python indlejret programmering. Vi vil udforske, hvordan et højniveau sprog som Python kan styre hardware direkte, undersøge de vigtigste platforme, der gør dette muligt, og gennemgå praktiske eksempler for at få dig i gang på din rejse fra software til silicium.
Python Embedded Ecosystem: Mere end bare CPython
Du kan ikke bare installere den standard Python, du bruger på din bærbare computer (kendt som CPython), på en typisk mikrocontroller. Disse enheder har ekstremt begrænsede ressourcer—vi taler om kilobyte RAM og megahertz processorkraft, en skarp kontrast til gigabytes og gigahertz i en moderne computer. For at bygge bro over denne kløft blev der skabt specialiserede, slanke implementeringer af Python.
MicroPython: Python til mikrocontrollere
MicroPython er en komplet omskrivning af programmeringssproget Python 3, optimeret til at køre på begrænset hardware. Skabt af Damien George, har det til formål at være så kompatibelt som muligt med standard Python, mens det giver direkte adgang på lavt niveau til hardware.
- Nøglefunktioner: Det inkluderer en interaktiv Read-Eval-Print Loop (REPL), der giver dig mulighed for at oprette forbindelse til et board og udføre kode linje for linje uden et kompilerings trin. Det er meget effektivt, har et lille hukommelsesfodaftryk og leverer kraftfulde moduler som
machinetil direkte hardwarekontrol (GPIO, I2C, SPI osv.). - Bedst til: Udviklere, der ønsker maksimal ydeevne, finkornet kontrol over hardware og kompatibilitet på tværs af en bred vifte af mikrocontrollere. Det er tættere på "metallet" og foretrækkes ofte til mere ydelseskritiske applikationer.
CircuitPython: Den begyndervenlige kraftcentral
CircuitPython er en forgrening af MicroPython oprettet og vedligeholdt af Adafruit, en førende virksomhed inden for gør-det-selv (DIY) elektronik. Selvom det deler en kerne med MicroPython, er dets filosofi centreret om brugervenlighed og uddannelse.
- Nøglefunktioner: Den mest fremtrædende funktion er, hvordan den præsenterer mikrocontrolleren for din computer. Når du sætter et CircuitPython-kort i, vises det som et lille USB-drev. Du skal blot redigere din
code.py-fil på dette drev og gemme den; kortet genindlæses og kører din nye kode automatisk. Det har også en samlet API på tværs af alle understøttede kort, hvilket betyder, at kode til læsning af en sensor på ét kort fungerer på et andet med minimale ændringer. - Bedst til: Begyndere, undervisere og alle, der er fokuseret på hurtig prototyping. Indlæringskurven er blidere, og det omfattende biblioteksøkosystem, der leveres af Adafruit, gør det utroligt enkelt at integrere sensorer, skærme og andre komponenter.
MicroPython vs. CircuitPython: En hurtig sammenligning
At vælge mellem dem afhænger ofte af dine projektmål og erfaringsniveau.
- Filosofi: MicroPython prioriterer hardwarespecifikke funktioner og ydeevne. CircuitPython prioriterer enkelhed, konsistens og lethed i indlæringen.
- Workflow: Med MicroPython bruger du typisk et værktøj som Thonny til at oprette forbindelse til enhedens REPL og uploade filer. Med CircuitPython trækker og slipper du en
code.py-fil på USB-drevet. - Hardwareunderstøttelse: MicroPython understøtter en lang række kort fra mange producenter. CircuitPython understøtter primært kort fra Adafruit og udvalgte tredjepartspartnere, men dens support er dyb og veldokumenteret.
- Biblioteker: CircuitPython har et massivt, kurateret sæt biblioteker, der er nemme at installere. MicroPython-biblioteker er også tilgængelige, men kan være mere fragmenterede.
For denne guide vil koncepterne og mange kodeeksempler være gældende for begge, med mindre modifikationer. Vi vil påpege forskelle, hvor de er signifikante.
Valg af din hardware: Mikrocontrollerens slagmark
Antallet af mikrocontrollere (MCU'er), der kan køre Python, er eksploderet i de seneste år. Her er nogle af de mest populære og tilgængelige muligheder for et globalt publikum.
Raspberry Pi Pico & RP2040
Må ikke forveksles med den fuldblæste Raspberry Pi-computer, Pico er et billigt, højtydende mikrocontrollerkort bygget omkring den tilpassede RP2040-chip. Det er blevet en global favorit til Python på hardware.
- Nøglefunktioner: En kraftfuld dual-core ARM Cortex-M0+ processor, en generøs 264 KB RAM og en unik funktion kaldet Programmable I/O (PIO), der giver mulighed for oprettelse af brugerdefinerede hardwaregrænseflader. Den nyere Pico W-model tilføjer indbygget Wi-Fi.
- Hvorfor det er fantastisk til Python: Det har officiel førsteklasses support til MicroPython og er også godt understøttet af CircuitPython. Dens lave pris (ofte under $10 USD) og stærke ydeevne gør den til en utrolig værdi.
Espressif ESP32 & ESP8266
Fremstillet af det Shanghai-baserede selskab Espressif Systems er ESP-familien af chips de ubestridte mestre af IoT. De er kendt for deres integrerede Wi-Fi- og Bluetooth-funktioner, hvilket gør dem til standardvalget til tilsluttede projekter.
- Nøglefunktioner: Kraftfulde single- eller dual-core processorer, indbygget Wi-Fi og (på ESP32) Bluetooth. De er tilgængelige på tusindvis af forskellige udviklingskort fra producenter over hele verden.
- Hvorfor de er fantastiske til Python: Fremragende MicroPython-understøttelse giver dig mulighed for at bygge tilsluttede enheder med blot et par linjer Python-kode. Deres processorkraft er mere end nok til komplekse opgaver som at køre webservere eller håndtere data fra flere sensorer.
Adafruit Feather, ItsyBitsy og Trinket økosystemer
Adafruit tilbyder en bred vifte af kort i standardiserede formfaktorer. Dette er ikke specifikke chips, men snarere produktfamilier designet til at fungere problemfrit inden for CircuitPython-økosystemet.
- Nøglefunktioner: Kort i Feather-familien deler en fælles pinout, hvilket gør dem udskiftelige. Mange inkluderer indbyggede batteriopladningskredsløb og stik. De fås med en række mikrocontrollere, herunder RP2040, ESP32 og andre.
- Hvorfor de er fantastiske til Python: De er designet fra bunden til CircuitPython. Denne tætte integration betyder en glat plug-and-play-oplevelse med adgang til hundredvis af biblioteker og tutorials.
Kom godt i gang: Din første "Hello, World" på hardware
Lad os gå fra teori til praksis. Den traditionelle "Hello, World" af indlejret programmering blinker en LED. Denne enkle handling bekræfter, at hele din værktøjskæde—fra din kodeeditor til firmwaren på kortet—fungerer korrekt.
Forudsætninger
- Et understøttet mikrocontrollerkort (f.eks. Raspberry Pi Pico, ESP32 eller et Adafruit-kort).
- Et USB-kabel, der understøtter dataoverførsel (ikke kun opladning).
- En computer (Windows, macOS eller Linux).
Trin 1: Installer firmware
Dit kort skal have MicroPython- eller CircuitPython-tolken installeret på det. Dette kaldes "flashing af firmwaren".
- For CircuitPython: Besøg circuitpython.org, find dit kort, og download
.uf2-filen. Sæt dit kort i bootloader-tilstand (dette involverer normalt at holde en "BOOT"- eller "RESET"-knap nede, mens du sætter det i). Det vises som et USB-drev. Træk den downloadede.uf2-fil over på den. Drevet skubbes ud og vises igen, nu med navnet CIRCUITPY. - For MicroPython: Besøg micropython.org, find dit kort, og download firmwarefilen (ofte en
.uf2- eller.bin-fil). Processen er den samme: sæt kortet i bootloader-tilstand og kopier filen over.
Trin 2: Opsæt din editor
Selvom du kan bruge enhver teksteditor, gør en dedikeret IDE udviklingen meget lettere. Thonny IDE anbefales stærkt til begyndere. Det er gratis, på tværs af platforme og leveres med indbygget support til MicroPython og CircuitPython. Det registrerer automatisk dit kort, giver adgang til enhedens REPL og gør det nemt at uploade filer.
Trin 3: Koden til den blinkende LED
Nu til koden. Opret en ny fil med navnet main.py til MicroPython, eller rediger den eksisterende code.py til CircuitPython.
Eksempel til MicroPython på en Raspberry Pi Pico W:
import machine
import utime
# Onboard LED'en på en Pico W er tilgængelig via et specielt navn
led = machine.Pin("LED", machine.Pin.OUT)
while True:
led.toggle()
print("LED toggled!")
utime.sleep(0.5) # Vent i et halvt sekund
Eksempel til CircuitPython på de fleste Adafruit-kort:
import board
import digitalio
import time
# Onboard LED'en er normalt forbundet til en pin med navnet 'LED'
led = digitalio.DigitalInOut(board.LED)
led.direction = digitalio.Direction.OUTPUT
while True:
led.value = not led.value
print("LED toggled!")
time.sleep(0.5)
Kodeopdeling:
import: Vi importerer biblioteker til at styre hardware (machine,digitalio,board) og administrere tid (utime,time).- Pin-opsætning: Vi definerer, hvilken fysisk pin vi vil styre (onboard LED'en) og konfigurerer den som en udgang.
- Løkken:
while True:-løkken kører for evigt. Inde i løkken skifter vi LED'ens tilstand (tændt til slukket eller slukket til tændt), udskriver en meddelelse til seriekonsollen (synlig i Thonny) og holder derefter pause i et halvt sekund.
Gem denne fil på din enhed. Onboard LED'en skal straks begynde at blinke. Tillykke, du har lige kørt Python direkte på en mikrocontroller!
Dyk dybere: Kerneprincipper for Python på mikrocontrollere
At blinke en LED er kun begyndelsen. Lad os udforske de grundlæggende begreber, du bruger til at bygge mere komplekse projekter.
Generel Input/Output (GPIO)
GPIO-ben er de fysiske forbindelser, der lader din mikrocontroller interagere med verden. De kan konfigureres som enten input (for at læse data fra knapper eller sensorer) eller outputs (for at styre lysdioder, motorer eller relæer).
Læsning af et knaptryk (MicroPython):
import machine
import utime
button = machine.Pin(14, machine.Pin.IN, machine.Pin.PULL_DOWN)
while True:
if button.value() == 1:
print("Button is pressed!")
utime.sleep(0.1)
Her konfigurerer vi pin 14 som et input med en intern pull-down-modstand. Løkken kontrollerer løbende, om knappens værdi er 1 (høj), hvilket indikerer, at den er blevet trykket på.
Arbejde med sensorer
De fleste interessante projekter involverer sensorer. Python gør det nemt at læse fra både analoge og digitale sensorer.
- Analoge sensorer: Disse sensorer, som f.eks. fotomodstande (måling af lys) eller potentiometre, giver en variabel spænding. Mikrocontrollerens analog-til-digital konverter (ADC) læser denne spænding og konverterer den til et tal.
- Digitale sensorer: Disse mere avancerede sensorer (som temperatur/fugtighedssensorer, accelerometer) kommunikerer ved hjælp af specifikke protokoller. De to mest almindelige er I2C (Inter-Integrated Circuit) og SPI (Serial Peripheral Interface). Disse protokoller giver flere enheder mulighed for at kommunikere med mikrocontrolleren ved hjælp af kun et par ben. Heldigvis behøver du sjældent at kende detaljerne på lavt niveau, da biblioteker håndterer kommunikationen for dig.
Aflæsning af temperatur med en BMP280-sensor (CircuitPython):
import board
import adafruit_bmp280
# Opret et I2C busobjekt
i2c = board.I2C() # Bruger standard SCL- og SDA-ben
# Opret et sensorobjekt
bmp280 = adafruit_bmp280.Adafruit_BMP280_I2C(i2c)
# Læs temperaturen
temperature = bmp280.temperature
print(f"Temperature: {temperature:.2f} C")
Pulsbreddemodulering (PWM)
PWM er en teknik, der bruges til at simulere en analog udgang på en digital pin. Ved hurtigt at skifte en pin til og fra kan du styre den gennemsnitlige spænding, hvilket er nyttigt til at dæmpe en LED, styre hastigheden på en DC-motor eller placere en servomotor.
Tilslutningsmuligheder og tingenes internet (IoT)
Det er her, kort som ESP32 og Pico W virkelig skinner. Med indbygget Wi-Fi gør Python det forbavsende enkelt at bygge IoT-enheder.
Tilslutning til Wi-Fi
At tilslutte din enhed til et netværk er det første skridt. Du skal oprette en fil (ofte kaldet secrets.py i CircuitPython) for at gemme dine netværksoplysninger sikkert.
Tilslutning af en ESP32 til Wi-Fi (MicroPython):
import network
SSID = "DitNetværksNavn"
PASSWORD = "DitNetværksAdgangskode"
station = network.WLAN(network.STA_IF)
station.active(True)
station.connect(SSID, PASSWORD)
while not station.isconnected():
pass
print("Forbindelsen lykkedes")
print(station.ifconfig())
Foretagelse af webanmodninger
Når du er tilsluttet, kan du interagere med internettet. Du kan hente data fra Application Programming Interfaces (API'er), sende sensordata til en webtjeneste eller udløse online handlinger.
Hentning af JSON-data fra en API (ved hjælp af urequests-biblioteket):
import urequests
response = urequests.get("http://worldtimeapi.org/api/timezone/Etc/UTC")
data = response.json()
print(f"Den aktuelle UTC-tid er: {data['datetime']}")
response.close()
MQTT: Sproget for IoT
Mens HTTP er nyttigt, er guldstandarden for IoT-kommunikation MQTT (Message Queuing Telemetry Transport). Det er en letvægts publish-subscribe-protokol designet til netværk med lav båndbredde og høj latenstid. En enhed kan "udgive" sensordata til et "emne", og enhver anden enhed (eller server), der er "abonneret" på det emne, modtager dataene med det samme. Dette er langt mere effektivt end konstant at afstemme en webserver.
Avancerede emner og bedste praksis
Efterhånden som dine projekter vokser, vil du støde på begrænsningerne af en mikrocontroller. Her er nogle bedste fremgangsmåder til at skrive robust indlejret Python-kode.
- Hukommelsesstyring: RAM er din mest værdifulde ressource. Undgå at oprette store objekter som lister eller lange strenge inde i løkker. Brug
gc-modulet (import gc; gc.collect()) til manuelt at udløse affaldsindsamling og frigøre hukommelse. - Strømstyring: For batteridrevne enheder er strømeffektivitet kritisk. De fleste mikrocontrollere har en "deepsleep"-tilstand, der lukker det meste af chippen ned, forbruger meget lidt strøm og kan vågne op efter et bestemt tidspunkt eller fra en ekstern udløser.
- Filssystem: Du kan læse og skrive filer til den indbyggede flash-hukommelse, ligesom på en almindelig computer. Dette er perfekt til at logge data eller gemme konfigurationsindstillinger.
- Afbrydelser: I stedet for konstant at kontrollere en knaps tilstand i en løkke (en proces kaldet afstemning), kan du bruge en afbrydelse. En Interrupt Request (IRQ) er et hardwaresignal, der sætter hovedkoden på pause for at køre en speciel funktion og derefter genoptager. Dette er langt mere effektivt og lydhørt.
Virkelige projektideer
Klar til at bygge? Her er et par ideer, der kombinerer de koncepter, vi har diskuteret:
- Smart vejrstation: Brug en ESP32 med en BME280-sensor til at måle temperatur, fugtighed og tryk. Vis dataene på en lille OLED-skærm, og publicer dem via MQTT til et dashboard som Adafruit IO eller Home Assistant.
- Automatisk plantevandingssystem: Tilslut en jordfugtighedsføler til en Raspberry Pi Pico. Når jorden er tør, skal du bruge en GPIO-pin til at aktivere et relæ, der tænder for en lille vandpumpe i et par sekunder.
- Brugerdefineret USB-makropad: Brug et CircuitPython-kort, der understøtter USB HID (Human Interface Device), som f.eks. en Pico eller mange Adafruit-kort. Programmer knapper til at sende komplekse genveje eller indtaste foruddefinerede tekst, hvilket øger din produktivitet.
Konklusion: Fremtiden er indlejret i Python
Python har grundlæggende ændret landskabet for indlejret udvikling. Det har sænket adgangsbarrieren, hvilket gør det muligt for softwareudviklere at styre hardware og hardwareingeniører at prototype hurtigere end nogensinde før. Enkelheden ved at læse en sensor eller oprette forbindelse til internettet på blot et par linjer læsbar kode er en game-changer.
Rejsen fra en blinkende LED til en fuldt udstyret IoT-enhed er utrolig givende. Det globale samfund og rigdommen af open source-biblioteker betyder, at du aldrig er helt alene, når du støder på en udfordring. Så vælg et kort, flash firmwaren, og start dit eventyr i den spændende krydsning mellem Python og den fysiske verden. Den eneste grænse er din fantasi.