Izpētiet iegulto sistēmu pasauli ar Python. Šī visaptverošā rokasgrāmata aptver MicroPython, CircuitPython, aparatūras integrāciju un reālus projektus.
Python uz dzelzs: Iegremdēšanās iegultajā programmēšanā un mikrokontrolleru integrācijā
Gadu desmitiem iegulto sistēmu pasaule – sīkie datori, kas darbina visu, sākot no viedpulksteņiem līdz rūpnieciskajām iekārtām – bija zemo līmeņu valodu, piemēram, C, C++ un Assembly, ekskluzīvā domēna. Šīs valodas piedāvā nepārspējamu kontroli un veiktspēju, taču tās ir grūti apgūstamas un prasa ilgu izstrādes ciklu. Ienāca Python, valoda, kas pazīstama ar savu vienkāršību, lasāmību un plašo ekosistēmu. Savulaik ierobežots ar tīmekļa serveriem un datu zinātni, Python tagad jaudīgi virzās uz aparatūras centru, demokratizējot elektroniku jaunai izstrādātāju, entuziastu un inovatoru paaudzei visā pasaulē.
Šī rokasgrāmata ir jūsu visaptverošais ievads aizraujošajā Python iegultās programmēšanas pasaulē. Mēs izpētīsim, kā augsta līmeņa valoda, piemēram, Python, var tieši kontrolēt aparatūru, izpētīsim galvenās platformas, kas to padara iespējamu, un izskatīsim praktiskus piemērus, lai jūs varētu sākt savu ceļojumu no programmatūras uz silīciju.
Python iegultā ekosistēma: Vairāk nekā tikai CPython
Jūs nevarat vienkārši instalēt standarta Python, ko izmantojat savā klēpjdatorā (pazīstams kā CPython), tipiskā mikrokontrollerī. Šīm ierīcēm ir ārkārtīgi ierobežoti resursi – mēs runājam par kilobaitiem RAM un megahertziem apstrādes jaudas, kas ir diametrāli pretstatā gigabaitiem un gigaherciem modernā datorā. Lai novērstu šo plaisu, tika izveidoti specializēti, liesi Python implementācijas.
MicroPython: Python mikrokontrolleriem
MicroPython ir pilnībā pārrakstīta Python 3 programmēšanas valoda, kas optimizēta darbam uz ierobežotām aparatūrām. Tās autors ir Damjens Džordžs, un tās mērķis ir būt pēc iespējas saderīgākai ar standarta Python, vienlaikus nodrošinot tiešu, zema līmeņa piekļuvi aparatūrai.
- Galvenās iezīmes: Tā ietver interaktīvu nolasīšanas-novērtēšanas-drukāšanas cilpu (REPL), kas ļauj jums savienoties ar dēli un izpildīt kodu pa rindai bez kompilēšanas soļa. Tā ir ļoti efektīva, tai ir neliels atmiņas nospiedums un tā nodrošina jaudīgus moduļus, piemēram,
machine, tiešai aparatūras kontrolei (GPIO, I2C, SPI utt.). - Labākais priekš: Izstrādātājiem, kuri vēlas maksimālu veiktspēju, detalizētu aparatūras kontroli un saderību ar plašu mikrokontrolleru klāstu. Tā ir tuvāk pie "dzelzs" un bieži tiek izmantota veiktspējas kritiskākām lietojumprogrammām.
CircuitPython: iesācējiem draudzīgs jaudīgais risinājums
CircuitPython ir MicroPython atzars, ko izveidojis un uztur Adafruit, vadošais uzņēmums DIY elektronikas jomā. Lai gan tā kopīgā kodola daļa ir ar MicroPython, tās filozofija ir vērsta uz lietošanas vienkāršību un izglītību.
- Galvenās iezīmes: Izcilākā iezīme ir tas, kā mikrokontrolleris tiek prezentēts jūsu datoram. Kad pievienojat CircuitPython dēli, tas parādās kā mazs USB disks. Jūs vienkārši rediģējat savu
code.pyfailu šajā diskā un saglabājat to; dēlis pārlādē un automātiski palaidīs jūsu jauno kodu. Tā arī piedāvā vienotu API visiem atbalstītajiem dēliem, kas nozīmē, ka kods, lai nolasītu sensoru vienā dēlī, darbosies citā ar minimālām izmaiņām. - Labākais priekš: Iesācējiem, skolotājiem un ikvienam, kurš koncentrējas uz ātru prototipēšanu. Apguves process ir vieglāks, un Adafruit nodrošinātais plašais bibliotēku ekosistēma padara sensoru, displeju un citu komponentu integrēšanu neticami vienkāršu.
MicroPython pret CircuitPython: Ātrs salīdzinājums
Izvēle starp tām bieži vien ir atkarīga no jūsu projekta mērķiem un pieredzes līmeņa.
- Filozofija: MicroPython prioritizē aparatūras specifiskās funkcijas un veiktspēju. CircuitPython prioritizē vienkāršību, konsekvenci un mācīšanās vieglumu.
- Darbplūsma: Ar MicroPython parasti izmantojat tādu rīku kā Thonny, lai savienotos ar ierīces REPL un augšupielādētu failus. Ar CircuitPython jūs vienkārši velciet un nometiet
code.pyfailu uz USB diska. - Aparatūras atbalsts: MicroPython atbalsta plašu dēļu klāstu no daudziem ražotājiem. CircuitPython galvenokārt atbalsta Adafruit dēlus un atsevišķus trešo pušu partnerus, taču tā atbalsts ir dziļš un labi dokumentēts.
- Bibliotēkas: CircuitPython ir milzīgs, kurēts bibliotēku kopums, ko ir viegli instalēt. Ir pieejamas arī MicroPython bibliotēkas, taču tās var būt vairāk sadrumstalotas.
Šajā rokasgrāmatā jēdzieni un daudzi koda piemēri būs piemērojami abiem ar nelielām izmaiņām. Mēs norādīsim atšķirības, kur tās ir nozīmīgas.
Aparatūras izvēle: Mikrokontrolleru kaujas lauks
Mikrokontrolleru (MCU), kas var darbināt Python, skaits pēdējos gados ir sprādzienveidā pieaudzis. Šeit ir daži populārākie un pieejamākie risinājumi globālai auditorijai.
Raspberry Pi Pico un RP2040
Nepārprotiet ar pilnvērtīgu Raspberry Pi datoru, Pico ir lēts, augstas veiktspējas mikrokontrolleru dēlis, kas izveidots ap pielāgoto RP2040 mikroshēmu. Tā ir kļuvusi par globālu iecienītu Python aparatūrai.
- Galvenās iezīmes: Jaudīgs divkodolu ARM Cortex-M0+ procesors, ievērojami 264 KB RAM un unikāla funkcija, ko sauc Programmējamā I/O (PIO), kas ļauj izveidot pielāgotas aparatūras saskarnes. Jaunākais Pico W modelis pievieno iebūvētu Wi-Fi.
- Kāpēc tas ir lieliski piemērots Python: Tam ir oficiāls, pirmās klases atbalsts MicroPython, un to labi atbalsta arī CircuitPython. Tā zemā cena (bieži vien zem 10 USD) un spēcīgā veiktspēja padara to par neticamu vērtību.
Espressif ESP32 un ESP8266
Ražoti no Šanhajā bāzētā uzņēmuma Espressif Systems, ESP mikroshēmu saime ir neapstrīdami IoT čempioni. Tie ir pazīstami ar savām integrētajām Wi-Fi un Bluetooth iespējām, padarot tos par noklusējuma izvēli savienotajiem projektiem.
- Galvenās iezīmes: Jaudīgi viena vai divu kodolu procesori, iebūvēts Wi-Fi un (ESP32) Bluetooth. Tie ir pieejami tūkstošiem dažādu izstrādes dēļu no ražotājiem visā pasaulē.
- Kāpēc tie ir lieliski piemēroti Python: Lieliskais MicroPython atbalsts ļauj jums izveidot savienotas ierīces tikai ar dažām Python koda rindām. To apstrādes jaudas ir vairāk nekā pietiekami sarežģītiem uzdevumiem, piemēram, tīmekļa serveru darbināšanai vai datu apstrādei no vairākiem sensoriem.
Adafruit Feather, ItsyBitsy un Trinket ekosistēmas
Adafruit piedāvā plašu dēļu klāstu standartizētos formātfaktoros. Šīs nav specifiskas mikroshēmas, bet gan produktu saimes, kas paredzētas nevainojamai darbībai CircuitPython ekosistēmā.
- Galvenās iezīmes: Feather saimes dēļi dalās kopējā pinoutā, padarot tos savstarpēji aizvietojamus. Daudzi ietver iebūvētus akumulatoru uzlādes ķēdes un savienotājus. Tie ir pieejami ar dažādiem mikrokontrolleriem, tostarp RP2040, ESP32 un citiem.
- Kāpēc tie ir lieliski piemēroti Python: Tie ir veidoti no paša sākuma CircuitPython. Šī ciešā integrācija nozīmē vienmērīgu, plug-and-play pieredzi ar piekļuvi simtiem bibliotēku un pamācību.
Sākšana: jūsu pirmais "Sveika, pasaule!" aparatūrā
Pāriesim no teorijas pie prakses. Iegultās programmēšanas tradicionālais "Sveika, pasaule!" ir mirgojoša LED diode. Šis vienkāršais akts apstiprina, ka visa jūsu rīku ķēde – no koda redaktora līdz ierīces programmatūrai – darbojas pareizi.
Priekšnoteikumi
- Atbalstīts mikrokontrolleru dēlis (piemēram, Raspberry Pi Pico, ESP32 vai Adafruit dēlis).
- USB kabelis, kas atbalsta datu pārraidi (ne tikai uzlādi).
- Dators (Windows, macOS vai Linux).
1. solis: Instalējiet programmatūru (firmware)
Jūsu dēlim ir jābūt instalētam MicroPython vai CircuitPython interpretoram. To sauc par "firmware uzstādīšanu".
- CircuitPython: Apmeklējiet circuitpython.org, atrodiet savu dēli un lejupielādējiet
.uf2failu. Ievietojiet savu dēli bootloader režīmā (tas parasti ietver pogas "BOOT" vai "RESET" nospiešanu, pievienojot to). Tas parādīsies kā USB disks. Velciet un nometiet lejupielādēto.uf2failu uz to. Disks tiks izņemts un parādīsies atkārtoti, tagad nosaukts CIRCUITPY. - MicroPython: Apmeklējiet micropython.org, atrodiet savu dēli un lejupielādējiet programmatūras failu (bieži vien
.uf2vai.binfails). Process ir līdzīgs: ievietojiet dēli bootloader režīmā un kopējiet failu.
2. solis: Iestatiet savu redaktoru
Lai gan varat izmantot jebkuru teksta redaktoru, īpašs IDE padara izstrādi daudz vieglāku. Thonny IDE ir ļoti ieteicams iesācējiem. Tā ir bezmaksas, vairāku platformu un nāk ar iebūvētu atbalstu MicroPython un CircuitPython. Tā automātiski atklāj jūsu dēli, nodrošina piekļuvi ierīces REPL un atvieglo failu augšupielādi.
3. solis: Kods mirgojošai LED diodei
Tagad kods. Izveidojiet jaunu failu ar nosaukumu main.py MicroPython vai rediģējiet esošo code.py CircuitPython.
Piemērs MicroPython uz Raspberry Pi Pico W:
import machine
import utime
# Pico W iebūvētā LED tiek sasniegta, izmantojot īpašu nosaukumu
led = machine.Pin("LED", machine.Pin.OUT)
while True:
led.toggle()
print("LED pārslēgta!")
utime.sleep(0.5) # Pagaidiet pussekundi
Piemērs CircuitPython uz vairuma Adafruit dēļu:
import board
import digitalio
import time
# Iebūvētā LED parasti ir savienota ar pin, ko sauc par 'LED'
led = digitalio.DigitalInOut(board.LED)
led.direction = digitalio.Direction.OUTPUT
while True:
led.value = not led.value
print("LED pārslēgta!")
time.sleep(0.5)
Koda sadalījums:
import: Mēs importējam bibliotēkas aparatūras vadībai (machine,digitalio,board) un laika pārvaldībai (utime,time).- Pin iestatīšana: Mēs definējam, kuru fizisko pin mēs vēlamies kontrolēt (iebuiltā LED diode) un konfigurējam to kā izvadi.
- Cilpa:
while True:cilpa darbojas bezgalīgi. Cilpas iekšpusē mēs pārslēdzam LED diodes stāvokli (no ieslēgtas uz izslēgtu vai no izslēgtas uz ieslēgtu), drukājam ziņojumu sērijas konsolē (redzams Thonny) un pēc tam apturam uz pussekundi.
Saglabājiet šo failu savā ierīcē. Iebūvētā LED diodei vajadzētu nekavējoties sākt mirgot. Apsveicam, jūs tikko palaidāt Python tieši uz mikrokontrolleru!
Padziļināta izpēte: Python galvenie jēdzieni mikrokontrolleros
LED diodes mirgošana ir tikai sākums. Apskatīsim pamatjēdzienus, ko izmantosiet, veidojot sarežģītākus projektus.
Universālā I/O (GPIO)
GPIO pini ir fiziskie savienojumi, kas ļauj jūsu mikrokontrollerim mijiedarboties ar pasauli. Tos var konfigurēt kā ieejas (lai nolasītu datus no pogām vai sensoriem) vai izvades (lai vadītu LED diodes, motorus vai relejus).
Pogas nospiešanas nolasīšana (MicroPython):
import machine
import utime
button = machine.Pin(14, machine.Pin.IN, machine.Pin.PULL_DOWN)
while True:
if button.value() == 1:
print("Poga ir nospiesta!")
utime.sleep(0.1)
Šeit mēs konfigurējam 14. pinu kā ieejas ar iekšēju pull-down rezistoru. Cilpa nepārtraukti pārbauda, vai pogas vērtība ir 1 (augsta), norādot, ka tā ir nospiesta.
Darbs ar sensoriem
Lielākā daļa interesantu projektu ietver sensorus. Python padara to vieglu gan analogā, gan digitālā formātā nolasīt.
- Analogie sensori: Šie sensori, piemēram, fotoelementi (mēra gaismu) vai potenciometri, nodrošina mainīgu spriegumu. Mikrokontrollera analogā-digitālā pārveidotājs (ADC) nolasa šo spriegumu un pārvērš to par skaitli.
- Digitālie sensori: Šie modernākie sensori (piemēram, temperatūras/mitruma sensori, akselerometri) sazinās, izmantojot īpašus protokolus. Divi visizplatītākie ir I2C (Inter-Integrated Circuit) un SPI (Serial Peripheral Interface). Šie protokoli ļauj vairākām ierīcēm sazināties ar mikrokontrolleri, izmantojot tikai dažus pinus. Par laimi, jums reti kad ir jāzina zema līmeņa detaļas, jo bibliotēkas nodrošina saziņu jūsu vietā.
Temperatūras nolasīšana ar BMP280 sensoru (CircuitPython):
import board
import adafruit_bmp280
# Izveidojiet I2C kopnes objektu
i2c = board.I2C() # Izmanto noklusējuma SCL un SDA pinus
# Izveidojiet sensora objektu
bmp280 = adafruit_bmp280.Adafruit_BMP280_I2C(i2c)
# Nolasiet temperatūru
temperature = bmp280.temperature
print(f"Temperatūra: {temperature:.2f} C")
Impulsa platuma modulācija (PWM)
PWM ir tehnika, ko izmanto, lai simulētu analogu izvadi uz digitālā pina. Ātri ieslēdzot un izslēdzot pinu, var kontrolēt vidējo spriegumu, kas ir noderīgi LED diodes aptumšošanai, līdzstrāvas motora ātruma kontrolei vai servomotora pozicionēšanai.
Savienojamība un lietu internets (IoT)
Šeit ir vieta, kur tādi dēļi kā ESP32 un Pico W patiešām izceļas. Ar iebūvētu Wi-Fi Python padara IoT ierīču izveidi pārsteidzoši vienkāršu.
Savienojums ar Wi-Fi
Ierīces savienošana ar tīklu ir pirmais solis. Jums būs jāizveido fails (CircuitPython bieži sauc par secrets.py), lai droši glabātu savus tīkla akreditācijas datus.
ESP32 savienošana ar Wi-Fi (MicroPython):
import network
SSID = "Jūsu tīkla nosaukums"
PASSWORD = "Jūsu tīkla parole"
station = network.WLAN(network.STA_IF)
station.active(True)
station.connect(SSID, PASSWORD)
while not station.isconnected():
pass
print("Savienojums veiksmīgs")
print(station.ifconfig())
Tīmekļa pieprasījumu veikšana
Pēc savienojuma izveides varat mijiedarboties ar internetu. Varat iegūt datus no programmu saskarnēm (API), nosūtīt sensoru datus uz tīmekļa pakalpojumu vai ierosināt tiešsaistes darbības.
JSON datu iegūšana no API (izmantojot `urequests` bibliotēku):
import urequests
response = urequests.get("http://worldtimeapi.org/api/timezone/Etc/UTC")
data = response.json()
print(f"Pašreizējais UTC laiks ir: {data['datetime']}")
response.close()
MQTT: IoT valoda
Lai gan HTTP ir noderīgs, IoT komunikācijas zelta standarts ir MQTT (Message Queuing Telemetry Transport). Tas ir viegls publicēšanas-abonēšanas protokols, kas paredzēts zema joslas platuma, augsta latentuma tīkliem. Ierīce var "publicēt" sensoru datus uz "tēmu", un jebkura cita ierīce (vai serveris), kas ir "abonējusi" šo tēmu, nekavējoties saņems datus. Tas ir daudz efektīvāk nekā nepārtraukta tīmekļa servera aptaujošana.
Papildu tēmas un labākā prakse
Palielinoties jūsu projektiem, jūs saskarsieties ar mikrokontrollera ierobežojumiem. Šeit ir daži labākie veidi, kā rakstīt izturīgu iegulto Python kodu.
- Atmiņas pārvaldība: RAM ir jūsu visvērtīgākais resurss. Izvairieties veidot lielus objektus, piemēram, sarakstus vai garas virknes cilpās. Izmantojiet
gcmoduli (import gc; gc.collect()), lai manuāli izsauktu atkritumu savācēju un atbrīvotu atmiņu. - Enerģijas pārvaldība: Akumulatoru darbināmām ierīcēm energoefektivitāte ir kritiska. Lielākā daļa mikrokontrolleru ir "dziļā miega" režīmā, kas izslēdz lielāko daļu mikroshēmas, patērējot ļoti maz enerģijas, un var pamosties pēc noteikta laika vai no ārēja signāla.
- Failu sistēma: Jūs varat lasīt un rakstīt failus uz iebuiltās zibatmiņas, tāpat kā parastā datorā. Tas ir lieliski piemērots datu reģistrēšanai vai konfigurācijas iestatījumu glabāšanai.
- Pārtraukumi: Tā vietā, lai pastāvīgi pārbaudītu pogas stāvokli cilpā (process, ko sauc par aptauju), varat izmantot pārtraukumu. Pārtraukuma pieprasījums (IRQ) ir aparatūras signāls, kas aptur galveno kodu, lai palaistu īpašu funkciju, pēc tam atsāk. Tas ir daudz efektīvāk un atsaucīgāk.
Reālu projektu ideju izstāde
Gatavi būvēt? Šeit ir dažas idejas, kas apvieno apspriestās koncepcijas:
- Viedā laika stacija: Izmantojiet ESP32 ar BME280 sensoru, lai izmērītu temperatūru, mitrumu un spiedienu. Parādiet datus nelielā OLED ekrānā un publicējiet tos, izmantojot MQTT, uz informācijas paneli, piemēram, Adafruit IO vai Home Assistant.
- Automātiska augu laistīšanas sistēma: Savienojiet augsnes mitruma sensoru ar Raspberry Pi Pico. Kad augsne ir sausa, izmantojiet GPIO pinu, lai aktivizētu releju, kas uz dažām sekundēm ieslēdz mazu ūdens sūkni.
- Pielāgota USB makro poga: Izmantojiet CircuitPython dēli, kas atbalsta USB HID (Human Interface Device), piemēram, Pico vai daudzus Adafruit dēļus. Ieprogrammējiet pogas, lai nosūtītu sarežģītas tastatūras saīsnes vai rakstītu iepriekš definētu tekstu, uzlabojot jūsu produktivitāti.
Secinājums: Nākotne ir iegulta Python
Python ir fundamentāli mainījis iegultās izstrādes ainavu. Tas ir samazinājis ieejas barjeru, ļaujot programmatūras izstrādātājiem kontrolēt aparatūru un aparatūras inženieriem prototipēt ātrāk nekā jebkad agrāk. Lasīšanas vienkāršība, lai nolasītu sensoru vai savienotos ar internetu, veicot tikai dažas lasāmā koda rindas, maina spēles noteikumus.
Ceļojums no mirgojošas LED diodes līdz pilnvērtīgai IoT ierīcei ir neticami atalgojošs. Globālā kopiena un atvērtā pirmkoda bibliotēku bagātība nozīmē, ka jūs nekad neesat pilnīgi viens, saskaroties ar izaicinājumu. Tātad izvēlieties dēli, uzstādiet programmatūru un sāciet savu piedzīvojumu aizraujošajā Python un fiziskās pasaules krustpunktā. Vienīgais ierobežojums ir jūsu iztēle.