Atraskite įterptųjų sistemų pasaulį su Python. Išsamus vadovas apima MicroPython, CircuitPython, aparatinės įrangos integravimą ir realius projektus pasaulinei auditorijai.
Python ant geležies: Gilus pasinerimas į įterptąjį programavimą ir mikrovaldiklių integravimą
Dešimtmečius įterptųjų sistemų pasaulis – mažyčiai kompiuteriai, maitinantys viską nuo išmaniųjų laikrodžių iki pramoninių mašinų – buvo išskirtinė žemo lygio kalbų, tokių kaip C, C++ ir Asembleris, sritis. Šios kalbos siūlo neprilygstamą valdymą ir našumą, tačiau jos pasižymi stačia mokymosi kreive ir ilgais kūrimo ciklais. Įeina Python – kalba, garsėjanti savo paprastumu, skaitomumu ir plačia ekosistema. Anksčiau apribotas žiniatinklio serveriais ir duomenų mokslais, Python dabar galingai veržiasi į aparatinės įrangos širdį, demokratizuodamas elektroniką naujai kūrėjų, mėgėjų ir inovatorių kartai visame pasaulyje.
Šis vadovas yra jūsų išsamus įvadas į jaudinantį Python įterptojo programavimo pasaulį. Išnagrinėsime, kaip aukšto lygio kalba, tokia kaip Python, gali tiesiogiai valdyti aparatinę įrangą, ištirsime pagrindines platformas, kurios tai leidžia, ir peržiūrėsime praktinius pavyzdžius, kad pradėtumėte savo kelionę nuo programinės įrangos iki silicio.
Python įterptoji ekosistema: daugiau nei tik CPython
Negalite tiesiog įdiegti standartinio Python, kurį naudojate nešiojamajame kompiuteryje (žinomo kaip CPython), į tipinį mikrovaldiklį. Šie įrenginiai turi itin ribotus išteklius – kalbame apie kilobaitus RAM ir megahercus apdorojimo galios, o tai yra didelis kontrastas gigabaitams ir gigahercams šiuolaikiniame kompiuteryje. Norint užpildyti šią spragą, buvo sukurtos specializuotos, taupios Python implementacijos.
MicroPython: Python mikrovaldikliams
MicroPython yra visiškai perrašyta Python 3 programavimo kalgos versija, optimizuota veikti ribotos aparatinės įrangos aplinkoje. Sukurta Damieno George'o, ji siekia būti kuo suderinamesnė su standartiniu Python, tuo pačiu suteikiant tiesioginę, žemo lygio prieigą prie aparatinės įrangos.
- Pagrindinės savybės: Jame yra interaktyvus skaitymo-įvertinimo-spausdinimo ciklas (REPL), leidžiantis prisijungti prie plokštės ir vykdyti kodą eilutė po eilutės be kompiliavimo etapo. Jis yra labai efektyvus, turi mažą atminties pėdsaką ir suteikia galingus modulius, tokius kaip
machinetiesioginiam aparatinės įrangos valdymui (GPIO, I2C, SPI ir kt.). - Tinka: Kūrėjams, norintiems maksimalaus našumo, tikslaus aparatinės įrangos valdymo ir suderinamumo su įvairiais mikrovaldikliais. Jis yra arčiau "geležies" ir dažnai pasirenkamas našumui kritiškesnėms programoms.
CircuitPython: Pradedantiesiems draugiškas galingumas
CircuitPython yra MicroPython atšaka, sukurta ir prižiūrima Adafruit – pirmaujančios įmonės „pasidaryk pats“ (DIY) elektronikos srityje. Nors ji dalijasi šerdimi su MicroPython, jos filosofija orientuota į naudojimo paprastumą ir švietimą.
- Pagrindinės savybės: Ryškiausia savybė yra tai, kaip ji pristato mikrovaldiklį jūsų kompiuteriui. Prijungus CircuitPython plokštę, ji pasirodo kaip mažas USB diskas. Jūs tiesiog redaguojate savo
code.pyfailą šiame diske ir jį išsaugote; plokštė automatiškai perkrauna ir paleidžia jūsų naują kodą. Ji taip pat turi vieningą API visoms palaikomoms plokštėms, o tai reiškia, kad kodas jutiklio skaitymui vienoje plokštėje veiks kitoje su minimaliais pakeitimais. - Tinka: Pradedantiesiems, pedagogams ir visiems, kurie sutelkia dėmesį į greitą prototipų kūrimą. Mokymosi kreivė yra švelnesnė, o plati Adafruit teikiama bibliotekų ekosistema leidžia neįtikėtinai paprastai integruoti jutiklius, ekranus ir kitus komponentus.
MicroPython prieš CircuitPython: Greitas palyginimas
Pasirinkimas tarp jų dažnai priklauso nuo jūsų projekto tikslų ir patirties lygio.
- Filosofija: MicroPython prioritetą teikia aparatinės įrangos specifinėms funkcijoms ir našumui. CircuitPython prioritetą teikia paprastumui, nuoseklumui ir lengvam mokymuisi.
- Darbo eiga: Su MicroPython paprastai naudojate įrankį, pvz., Thonny, kad prisijungtumėte prie įrenginio REPL ir įkeltumėte failus. Su CircuitPython vilkite ir numetate
code.pyfailą į USB diską. - Aparatinės įrangos palaikymas: MicroPython palaiko platų plokščių asortimentą iš daugelio gamintojų. CircuitPython pirmiausia palaiko Adafruit ir pasirinktų trečiųjų šalių partnerių plokštes, tačiau jo palaikymas yra išsamus ir gerai dokumentuotas.
- Bibliotekos: CircuitPython turi didelį, kuruojamą bibliotekų rinkinį, kurį lengva įdiegti. MicroPython bibliotekos taip pat prieinamos, tačiau gali būti labiau fragmentuotos.
Šiame vadove aptariamos koncepcijos ir daugelis kodo pavyzdžių bus taikomi abiem, su nedideliais pakeitimais. Nurodysime skirtumus, kai jie yra reikšmingi.
Aparatinės įrangos pasirinkimas: Mikrovaldiklių mūšio laukas
Mikrovaldiklių (MCU), galinčių paleisti Python, skaičius pastaraisiais metais smarkiai išaugo. Štai keletas populiariausių ir prieinamiausių variantų pasaulinei auditorijai.
Raspberry Pi Pico & RP2040
Nereikia painioti su visavertiu Raspberry Pi kompiuteriu, Pico yra nebrangi, didelio našumo mikrovaldiklio plokštė, sukurta aplink specialų RP2040 mikroschemą. Ji tapo pasauline mėgstamiausia Python aparatinės įrangos srityje.
- Pagrindinės savybės: Galingas dviejų branduolių ARM Cortex-M0+ procesorius, didelė 264KB RAM atmintis ir unikali funkcija, vadinama programuojamu įvesties/išvesties (PIO), kuri leidžia kurti pasirinktines aparatinės įrangos sąsajas. Naujesnis Pico W modelis turi integruotą Wi-Fi.
- Kodėl puikiai tinka Python: Ji turi oficialų, aukščiausios klasės MicroPython palaikymą ir taip pat puikiai palaikoma CircuitPython. Jos žema kaina (dažnai mažiau nei 10 USD) ir stiprus našumas daro ją neįtikėtinai vertinga.
Espressif ESP32 ir ESP8266
Sukurtos Šanchajuje įsikūrusios įmonės Espressif Systems, ESP mikroschemų šeima yra neginčijami daiktų interneto (IoT) čempionai. Jos žinomos dėl savo integruotų Wi-Fi ir Bluetooth galimybių, todėl yra numatytasis pasirinkimas prijungtiems projektams.
- Pagrindinės savybės: Galingi vieno arba dviejų branduolių procesoriai, integruotas Wi-Fi ir (ESP32 atveju) Bluetooth. Jos yra prieinamos tūkstančiuose skirtingų kūrimo plokščių iš gamintojų visame pasaulyje.
- Kodėl jos puikiai tinka Python: Puikus MicroPython palaikymas leidžia kurti prijungtus įrenginius vos keliais Python kodo eilučių. Jų apdorojimo galia yra daugiau nei pakankama sudėtingoms užduotims, tokioms kaip žiniatinklio serverių veikimas ar duomenų tvarkymas iš kelių jutiklių.
Adafruit Feather, ItsyBitsy ir Trinket ekosistemos
Adafruit siūlo platų plokščių asortimentą standartizuotuose formos faktoriuose. Tai nėra specifiniai lustai, o veikiau produktų šeimos, skirtos sklandžiai veikti CircuitPython ekosistemoje.
- Pagrindinės savybės: Feather šeimos plokštės turi bendrą kontaktų išdėstymą, todėl jas galima keisti. Daugelis turi integruotas baterijų įkrovimo grandines ir jungtis. Jos yra prieinamos su įvairiais mikrovaldikliais, įskaitant RP2040, ESP32 ir kitus.
- Kodėl jos puikiai tinka Python: Jos yra sukurtos nuo pat pradžių CircuitPython. Ši glaudus integravimas reiškia sklandų, "prijunk ir paleisk" patyrimą su prieiga prie šimtų bibliotekų ir pamokų.
Pradedame: Jūsų pirmasis "Hello, World" ant aparatinės įrangos
Pereikime nuo teorijos prie praktikos. Tradicinis "Hello, World" įterptajame programavime yra LED mirksėjimas. Šis paprastas veiksmas patvirtina, kad visa jūsų įrankių grandinė – nuo kodo redaktoriaus iki programinės įrangos plokštėje – veikia tinkamai.
Būtinosios sąlygos
- Palaikoma mikrovaldiklio plokštė (pvz., Raspberry Pi Pico, ESP32 arba Adafruit plokštė).
- USB kabelis, kuris palaiko duomenų perdavimą (ne tik įkrovimą).
- Kompiuteris (Windows, macOS arba Linux).
1 žingsnis: Įdiekite programinę įrangą
Jūsų plokštėje turi būti įdiegtas MicroPython arba CircuitPython interpretatorius. Tai vadinama "firmware įrašymu".
- CircuitPython atveju: Apsilankykite circuitpython.org, raskite savo plokštę ir atsisiųskite
.uf2failą. Įjunkite plokštę į „bootloader“ režimą (tam paprastai reikia laikyti nuspaustą "BOOT" arba "RESET" mygtuką, jungiant ją). Ji pasirodys kaip USB diskas. Nutempkite atsisiųstą.uf2failą ant jos. Diskas bus išimtas ir vėl pasirodys, dabar pavadintas CIRCUITPY. - MicroPython atveju: Apsilankykite micropython.org, raskite savo plokštę ir atsisiųskite programinės įrangos failą (dažnai
.uf2arba.binfailą). Procesas panašus: įjunkite plokštę į „bootloader“ režimą ir nukopijuokite failą.
2 žingsnis: Nustatykite savo redaktorių
Nors galite naudoti bet kokį teksto redaktorių, speciali IDE labai palengvina kūrimą. Thonny IDE yra labai rekomenduojamas pradedantiesiems. Ji yra nemokama, daugiaplatformė ir turi integruotą MicroPython ir CircuitPython palaikymą. Ji automatiškai aptinka jūsų plokštę, suteikia prieigą prie įrenginio REPL ir palengvina failų įkėlimą.
3 žingsnis: Mirksinčio LED kodas
Dabar prie kodo. Sukurkite naują failą pavadinimu main.py MicroPython atveju arba redaguokite esamą code.py CircuitPython atveju.
Pavyzdys, skirtas MicroPython, veikiančiam Raspberry Pi Pico W:
\nimport machine\nimport utime\n\n# Integruotas LED ant Pico W pasiekiamas specialiu pavadinimu\nled = machine.Pin("LED", machine.Pin.OUT)\n\nwhile True:\n led.toggle()\n print("LED toggled!")\n utime.sleep(0.5) # Palaukite pusę sekundės\n
Pavyzdys, skirtas CircuitPython, veikiančiam daugelyje Adafruit plokščių:
\nimport board\nimport digitalio\nimport time\n\n# Integruotas LED paprastai prijungtas prie kontakto pavadinimu 'LED'\nled = digitalio.DigitalInOut(board.LED)\nled.direction = digitalio.Direction.OUTPUT\n\nwhile True:\n led.value = not led.value\n print("LED toggled!")\n time.sleep(0.5)\n
Kodo analizė:
import: Importuojame bibliotekas aparatinės įrangos valdymui (machine,digitalio,board) ir laiko valdymui (utime,time).- Kontakto nustatymas: Apibrėžiame, kurį fizinį kontaktą norime valdyti (integruotą LED) ir konfigūruojame jį kaip išvestį.
- Ciklas:
while True:ciklas veikia amžinai. Cikle keičiame LED būseną (įjungti arba išjungti), spausdiname pranešimą į nuosekliąją konsolę (matomą Thonny) ir tada sustabdome pusę sekundės.
Išsaugokite šį failą savo įrenginyje. Integruotas LED turėtų nedelsiant pradėti mirksėti. Sveikiname, jūs ką tik paleidote Python tiesiogiai mikrovaldiklyje!
Gilėjame: pagrindinės Python koncepcijos mikrovaldikliuose
LED mirksėjimas yra tik pradžia. Panagrinėkime pagrindines koncepcijas, kurias naudosite kurdami sudėtingesnius projektus.
Bendrosios paskirties įvestis/išvestis (GPIO)
GPIO kontaktai yra fiziniai ryšiai, leidžiantys jūsų mikrovaldikliui sąveikauti su pasauliu. Juos galima konfigūruoti kaip įvestis (duomenims nuskaityti iš mygtukų ar jutiklių) arba išvestis (LED, variklių ar relių valdymui).
Mygtuko paspaudimo skaitymas (MicroPython):
\nimport machine\nimport utime\n\nbutton = machine.Pin(14, machine.Pin.IN, machine.Pin.PULL_DOWN)\n\nwhile True:\n if button.value() == 1:\n print("Mygtukas paspaustas!")\n utime.sleep(0.1)\n
Čia konfigūruojame 14 kontaktą kaip įvestį su vidiniu „pull-down“ rezistoriumi. Ciklas nuolat tikrina, ar mygtuko reikšmė yra 1 (aukšta), rodanti, kad jis buvo paspaustas.
Darbas su jutikliais
Dauguma įdomių projektų apima jutiklius. Python leidžia lengvai nuskaityti duomenis tiek iš analoginių, tiek iš skaitmeninių jutiklių.
- Analoginiai jutikliai: Šie jutikliai, tokie kaip foto rezistoriai (matuoja šviesą) arba potenciometrai, teikia kintamą įtampą. Mikrovaldiklio analoginis-skaitmeninis keitiklis (ADC) nuskaito šią įtampą ir paverčia ją skaičiumi.
- Skaitmeniniai jutikliai: Šie pažangesni jutikliai (pvz., temperatūros/drėgmės jutikliai, akselerometrai) bendrauja naudodami specifinius protokolus. Du labiausiai paplitę yra I2C (Inter-Integrated Circuit) ir SPI (Serial Peripheral Interface). Šie protokolai leidžia keliems įrenginiams bendrauti su mikrovaldikliu naudojant vos kelis kontaktus. Laimei, jums retai reikia žinoti žemo lygio detales, nes bibliotekos tvarko ryšį už jus.
Temperatūros skaitymas naudojant BMP280 jutiklį (CircuitPython):
\nimport board\nimport adafruit_bmp280\n\n# Sukurkite I2C magistralės objektą\ni2c = board.I2C() # Naudoja numatytuosius SCL ir SDA kontaktus\n\n# Sukurkite jutiklio objektą\nbmp280 = adafruit_bmp280.Adafruit_BMP280_I2C(i2c)\n\n# Nuskaitykite temperatūrą\ntemperature = bmp280.temperature\nprint(f"Temperatūra: {temperature:.2f} C")\n
Impulsų pločio moduliavimas (PWM)
PWM yra technika, naudojama imituoti analoginį išvesties signalą ant skaitmeninio kontakto. Greitai įjungiant ir išjungiant kontaktą, galima valdyti vidutinę įtampą, kuri yra naudinga LED pritemdymui, nuolatinės srovės variklio greičio valdymui arba servo variklio pozicionavimui.
Ryšys ir daiktų internetas (IoT)
Čia iš tiesų spindėja tokios plokštės kaip ESP32 ir Pico W. Su integruotu Wi-Fi, Python leidžia stebėtinai paprastai kurti daiktų interneto įrenginius.
Prisijungimas prie Wi-Fi
Įrenginio prijungimas prie tinklo yra pirmas žingsnis. Turėsite sukurti failą (CircuitPython dažnai vadinamą secrets.py), kad saugiai saugotumėte savo tinklo kredencialus.
ESP32 prijungimas prie Wi-Fi (MicroPython):
\nimport network\n\nSSID = "YourNetworkName"\nPASSWORD = "YourNetworkPassword"\n\nstation = network.WLAN(network.STA_IF)\nstation.active(True)\nstation.connect(SSID, PASSWORD)\n\nwhile not station.isconnected():\n pass\n\nprint("Prisijungimas sėkmingas")\nprint(station.ifconfig())\n
Interneto užklausų vykdymas
Prisijungę galite sąveikauti su internetu. Galite gauti duomenis iš programų programavimo sąsajų (API), siųsti jutiklio duomenis į žiniatinklio paslaugą arba inicijuoti internetinius veiksmus.
JSON duomenų gavimas iš API (naudojant `urequests` biblioteką):
\nimport urequests\n\nresponse = urequests.get("http://worldtimeapi.org/api/timezone/Etc/UTC")\ndata = response.json()\nprint(f"Dabartinis UTC laikas: {data['datetime']}")\nresponse.close()\n
MQTT: Daiktų interneto kalba
Nors HTTP yra naudingas, auksinis standartas daiktų interneto (IoT) komunikacijai yra MQTT (Message Queuing Telemetry Transport). Tai lengvas publikavimo-prenumeravimo protokolas, skirtas mažo pralaidumo, didelės delsos tinklams. Įrenginys gali "publikuoti" jutiklio duomenis į "temą", o bet kuris kitas įrenginys (arba serveris), "prenumeravęs" šią temą, iš karto gaus duomenis. Tai daug efektyviau nei nuolat apklausti žiniatinklio serverį.
Išplėstinės temos ir geriausios praktikos
Augant jūsų projektams, susidursite su mikrovaldiklio apribojimais. Štai keletas geriausių praktikų, kaip rašyti patikimą įterptąjį Python kodą.
- Atminties valdymas: RAM yra jūsų brangiausias resursas. Venkite kurti didelių objektų, tokių kaip sąrašai ar ilgos eilutės cikluose. Naudokite
gcmodulį (import gc; gc.collect()), kad rankiniu būdu inicijuotumėte šiukšlių surinkimą ir atlaisvintumėte atmintį. - Energijos valdymas: Baterijomis maitinamiems įrenginiams energijos efektyvumas yra kritinis. Dauguma mikrovaldiklių turi "gilų miego" režimą, kuris išjungia didžiąją dalį lusto, sunaudoja labai mažai energijos ir gali atsibusti po nustatyto laiko arba nuo išorinio paleidiklio.
- Failų sistema: Galite skaityti ir rašyti failus į integruotą „flash“ atmintį, kaip ir įprastame kompiuteryje. Tai puikiai tinka duomenų registravimui ar konfigūracijos nustatymų saugojimui.
- Pertraukimai: Užuot nuolat tikrinus mygtuko būseną cikle (procesas vadinamas apklausa), galite naudoti pertraukimą. Pertraukimo užklausa (IRQ) yra aparatinės įrangos signalas, kuris sustabdo pagrindinį kodą, kad būtų paleista speciali funkcija, o tada atnaujinamas. Tai daug efektyviau ir jautriau.
Realūs projekto idėjų pavyzdžiai
Pasiruošę kurti? Štai keletas idėjų, kurios apjungia aptartas koncepcijas:
- Išmanioji orų stotis: Naudokite ESP32 su BME280 jutikliu temperatūrai, drėgmei ir slėgiui matuoti. Rodykite duomenis mažame OLED ekrane ir publikuokite juos per MQTT į prietaisų skydelį, pvz., Adafruit IO arba Home Assistant.
- Automatizuota augalų laistymo sistema: Prijunkite dirvožemio drėgmės jutiklį prie Raspberry Pi Pico. Kai dirvožemis sausas, naudokite GPIO kontaktą, kad aktyvuotumėte relę, kuri kelioms sekundėms įjungs mažą vandens siurblį.
- Individualizuotas USB makro klaviatūra: Naudokite CircuitPython plokštę, kuri palaiko USB HID (Human Interface Device), pvz., Pico arba daugelį Adafruit plokščių. Užprogramuokite mygtukus siųsti sudėtingus klaviatūros sparčiuosius klavišus arba įvesti iš anksto apibrėžtą tekstą, padidindami savo produktyvumą.
Išvada: Ateitis yra įterpta Python
Python iš esmės pakeitė įterptosios plėtros kraštovaizdį. Ji sumažino įėjimo barjerą, leidžianti programinės įrangos kūrėjams valdyti aparatinę įrangą, o aparatinės įrangos inžinieriams kurti prototipus greičiau nei bet kada anksčiau. Jutiklio skaitymo ar prisijungimo prie interneto paprastumas vos keliomis skaitomo kodo eilutėmis yra esminis pokytis.
Kelionė nuo mirksinčio LED iki visiškai veikiančio daiktų interneto įrenginio yra neįtikėtinai naudinga. Pasaulinė bendruomenė ir daugybė atvirojo kodo bibliotekų reiškia, kad niekada nebūsite vieni, kai susidursite su iššūkiu. Taigi, pasirinkite plokštę, įrašykite programinę įrangą ir pradėkite savo nuotykius jaudinančioje Python ir fizinio pasaulio sankirtoje. Vienintelis apribojimas yra jūsų vaizduotė.