Avtor: dr. Simon Vavpotič
Python in MikroPython sta popularna programska jezika med nadobudnimi mladimi programerji. Kako programiramo? Zakaj je lažje kot v C# in C++? Zakaj je Raspberry Pi 5/500/500+ z operacijskim sistemom Raspberry Pi Trixie odličen za preizkušanje umetne inteligence?
Python je konec osemdesetih let preteklega stoletja Guido van Rossum začel razvijati na osnovi programskega jezika ABC. Njegova popularnost pa je pripomogla k temu, da smo leta 2008 dobili že njegovo tretjo različico Python 3, ki jo danes poleg starejše Python 2 iz leta 2000, poganjajo skoraj vsi računalniki z Linuxom, v Windows 10 in 11 pa ju moramo namestiti posebej. Od letos (2026) Python Software Fundation, v skladu s petletnim razvojnim ciklom, zagotavlja popravke različic 3.10, 3.11, 3.12, 3.13 in 3.14, medtem ko jih za starejše različice ni.
Ta vsebina je samo za naročnike
Od leta 2003 je Python na lestvici TIOBE Programming Community Index (en.wikipedia.org/wiki/TIOBE_Programming_Community_Index) vselej uvrščen med deset najbolj popularnih programskih jezikov, kot prvi programski jezik pa ga poučujejo tudi na številnih šolah in fakultetah.


Kaj sta Python in MikroPython?
Python je splošno-namenski visoko-nivojski programski jezik, ki poudarja enostavno berljivost in razumljivost programske kode, pri čemer namesto oklepajev za določanje podrednosti zaporedij ukazov (npr. ukazi znotraj programske zanke) uporablja zamikanje programskih vrstic. Dinamično določa podatkovne tipe programskih konstant in spremenljivk, obenem pa zanje tudi samostojno rezervira prostor v pomnilniku; oziroma slednjega samodejno sprosti, ko spremenljivke v programu niso več potrebne. Omogoča tudi tvorbo različnih programskih elementov, med katerimi so: strukture, objekti in funkcije. Zato v tem pogledu prav nič ne zaostaja za drugimi visoko-nivojskimi objektnimi programskimi jeziki, kot sta C++ in C#. Strukturalno in objektno programiranje sta v celoti podprta, ob čemer lahko v Python integriramo tudi programske objekte in strukture, napisane v drugih programskih jezikih.
MikroPyton je večinoma združljiv s Pythonom 3, njegova izvorna koda pa je napisana v programskem jeziku C. Optimiziran je za delovanje v mikrokontrolerjih, zaradi česar porabi veliko manj sistemskih sredstev od običajne različice, predvsem manj procesorskih in pomnilniških zmogljivosti.
Sestavljata ga prevajalnik programske kode v bajtni zapis ter interpretor tega zapisa, ki strogo zaporedno izvaja program vsakokrat, ko ga zaženemo. Vključuje tudi ključne Pythonove programske knjižnice in dodatne module, s katerimi lahko programer upravlja strojno opremo (oziroma funkcijske enote mikrokontrolerja) na najnižjem nivoju. MicroPython omogoča tudi uporabo vrinjenih zaporedij ukazov v zbirniku (angl. inline assembler), s pomočjo katerih lahko zagotovimo hitro delovanje performančno kritičnih delov programske kode. Vendar se moramo pri tem zavedati, da s tem lahko izgubimo prenosljivost programske kode na druge mikrokontrolerje.
Povejmo še, da je MicroPython leta 2013 ustvaril avstralski programer Damien George s podporo Kickstarterja. Prva različica se delovala na STM32F4 mikrokontrolerjih na razvojni plošči imenovani Pyboard. Nadaljnji razvoj MicroPythona od leta 2016 naprej je prinesel širšo podporo razvojnim ploščam in mikrokontrolerjem z ARM arhitekturo, med drugim tudi tistim na osnovi Raspberry Pijevega RP2040 mikrokontrolerja, Espressif Systemsovih ESP8266 in ESP32 modulov, Microchipovih razvojnih plošč z mikrokontrolerji SAMD21 in SAMD51 ter celo namenskih LEGO Mindstorms EV3 krmilnikov.
MikroPython je od leta 2017 podprt tudi za nekatere mikrokontrolerje in razvojne plošče z arhitekturo RISC-V (RISC-V32 in RISC-V64). Naj bo za prvo nadaljevanje teorije dovolj! Raje se lotimo programiranja!
Kako začeti?
Najprej potrebujemo razvojno okolje. Če uporabimo v SE347 predstavljeni Raspberry Pi 500+ ali katerega od drugih modelov Raspberry Pi z nameščenim operacijskim sistemom Raspberry Pi OS (Trixie), med programskimi orodji takoj opazimo priljubljeno razvojno okolje Thonny. Če Thonny iz kateregakoli vzroka ni nameščen, ga lahko namestimo s preprostim ukazom sudo apt install –y Thonny. Brezplačni Thonny lahko namestimo tudi v računalnike z Windows, tako da namestitven datoteko prenesemo iz spletne strani thonny.org.
Pri pisanju preprostih programov si lahko pomagamo tudi z Google AI mode, ChatGPT, Microsoft Copilotom ali katerim drugim javno dostopnim velikim jezikovnim modelom (LLM), ki lahko pripravi programsko kodo.
Mi smo namesto tega za začetek uporabili kar Raspberry Pi 5 z 8 GB RAM z nameščenim najnovejšim klobukom Raspberry Pi AI HAT+ 2 s kar 8 GB vgrajenega RAM za podporo delovanju modula Hailo-10H, na katerega smo najprej namestili qwen2:1.5b LLM model. Nakar smo mu zastavili naslednje vprašanje: »Write a program in Python3 that prints ASCII alphabet« (slov. Napiši progam v Pythonu3, ki izpiše ASCII abecedo) in dobili naslednji odgovor (pravilno zamikanje programskih vrstic je pri Pythonu izredno pomembno):
for letter in range(97, 104):
print(chr(letter), end=”)
Program v Thonnyju sicer deluje, a ne povsem pravilno, saj se izpiše le znakovni niz »abcdefg«. Za pravilno delovanje moramo vrednost druge konstante (104) spremeniti na vrednost 122. Vprašanje smo qwen2:1.5b LLM modelu zastavili tudi v slovenščini, vendar je bilo očitno, da je vprašanje razumel napačno.
Čeprav je Raspberry Pi AI HAT+2 lahko v veliko pomoč pri učenju česarkoli, je njegova cena primerljiva s ceno Raspberry Pi 5 s 16 GB RAM. Če imamo na voljo stalno hitro povezavo z internetom, lahko namesto njega uporabimo tudi zmogljivejši Google AI mode. Kot kaže, jezik pri tem ni ovira, saj zna na primer Google AI mode dovolj dobro prevajati med skoraj vsemi svetovnimi jeziki, da med prevodi stavki ne spremenijo smisla.


Google AI mode smo zato vprašanje zastavili kar v slovenščini: »Napiši program v Pythonu3, ki izdela tabelo z desetimi vrednostmi in omogoči ročni vnos poljubne od teh vrednosti.«. Poglejmo odgovor:
def vnesi_deset_vrednosti():
»««
Zahteva od uporabnika vnos desetih vrednosti in jih shrani v seznam.
»««
Inicializacija praznega seznama (tabele)
vrednosti = []
stevilo_vrednosti = 10
print(f«Prosim, vnesite {stevilo_vredilo_
vrednosti} vrednosti:«)
Zanka se izvede 10-krat (od indeksa 0 do 9)
for i in range(stevilo_vrednosti):
Uporabnika pozove k vnosu
Uporabimo f-string za prikaz številke trenutnega vnosa (i + 1)
vnos = input(f«Vrednost številka {i + 1}: »)
Dodamo vneseno vrednost na konec seznama
vrednosti.append(vnos)
print(»\nUspešno ste vnesli vse vrednosti.«)
print(»Tukaj je končni seznam/tabela:«)
return vrednosti
Glavni del programa, ki kliče funkcijo in prikaže rezultat
if name == »main«:
tabela_vrednosti = vnesi_deset_vrednosti()
print(tabela_vrednosti)
Odgovor je skoraj uporaben program, za katerim nam ni treba brskati po spletu, ampak ga Google AI mode izdela po naših navodilih. Poleg so tudi navodila, kako ga lahko uporabimo, oziroma kako ga lahko shranimo v izvedljivo datoteko, ki jo lahko poljubno-krat zaženemo.
Kljub temu moramo v programu sami poiskati napako in jo odpraviti, preden ga lahko uspešno zaženemo. V izpisu programa vidimo, da je Google AI mode naredil napako, ki je v funkcijo print vnesel napačno ime spremenljivke. Pravilno bi bilo: »stevilo_vrednosti«.
Če po odpravi omenjene drobne napake program vnesemo v Thonny, deluje povsem v skladu s pričakovanji. Iz njega se lahko tudi marsikaj naučimo. Denimo, kako v Pythonu3 izdelamo programsko funkcijo in glavni program, kateri ukaz moramo uporabiti za vnos posamezne vrednosti in kako izdelamo tabelo, v kateri hranimo vrednosti.
Kot vidimo, je pri Python3 izredno pomembno zamikanje programskih vrstic, medtem ko lahko v marsikaterem drugem programskem jeziku, kot so Pascal, C, C# in C++, celoten program s pomočjo pravilne rabe oklepajev zapišemo v eni vrstici. Pri Pythonu oklepajev za definiranje osnovne programske strukture ne potrebujemo.
Upravljanje tipkovnice
Zdaj se lahko lotimo še upravljanja strojne opreme. Ker smo želeli pripraviti kar se da univerzalen primer, ki bi deloval na čim več računalnikih, smo Google AI mode prosili, naj izdela program v Pythonu 3, ki na tipkovnici vklopi funkcijo Num lock. Praviloma bi moral delovati na kateremkoli računalniku in ne samo na Raspberry Pi-jih, lahko pa bi se Google AI mode enostavno izgovoril, da tega ne zna naredit, a namesto tega dobimo uporaben primer z navodili za namestitev, ki deluje povsem pravilno:
import subprocess
import platform
import time
def vklopi_numlock():
»««
Vklopi funkcijo NumLock na tipkovnici z uporabo orodja numlockx v Linuxu.
»««
Preverimo, ali je sistem Linux (vključno z Raspberry Pi OS)
if platform.system() == »Linux«:
try:
Uporabimo subprocess, da zaženemo ukaz numlockx on
Argument ‘on’ vklopi NumLock, ‘off’ ga izklopi.
subprocess.run([»numlockx«, »on«], check=True)
print(»Uspešno poskusil vklopiti NumLock.«)
Dodamo kratko pavzo, da je učinek viden/potrjen
time.sleep(1)
except FileNotFoundError:
print(»NAPAKA: Orodje ‘numlockx’ ni najdeno.«)
print(»Prosim, namestite ga z ukazom: sudo apt install numlockx«)
except subprocess.CalledProcessError as e:
print(f«NAPAKA: Ukaz numlockx se ni izvedel pravilno. Koda napake: {e.returncode}«)
except Exception as e:
print(f«Prišlo je do nepričakovane napake: {e}«)
else:
print(f«Ta program deluje samo na sistemih
Linux/Raspberry Pi OS, ne na {platform.system()}.«)
print(»Za Windows ali macOS bi bila potrebna drugačna, specifična rešitev.«)
Izvedba funkcije
if name == »main«:
vklopi_numlock()
Preden lahko program zaženemo, moramo namestiti še ustrezno programsko orodje, katerim lahko upravljamo funkcijo Num lock, kar storimo z ukazom sudo apt install numlockx.
Kaj pa Python na klasičnem PC?
Kot klasični PC z arhitekturo ARM64 smo pri testiranju uporabili Raspberry Pi 500+ z nameščenimi Windows 11 ter Pythonom 3 (zadnja razpoložljiva preizkusna različica 3.15.0a3) in urejevalnikom programske kode zanj. Google AI mode je ob ponovljenem vprašanju, naj izdela program, ki na tipkovnici vklopi funkcijo Num lock, sam ugotovil, da uporabljamo operacijski sistem Windows 11 in ponudil dve možni rešitvi. Pri prvi, ki deluje tudi v drugih operacijskih sistemih, bi morali najprej z dodatnim Python modulom pip namestiti programsko orodje keyboard, druga rešitev pa uporabna le v Windows. Vseeno smo se odločili za slednjo, saj ne zahteva nameščanja dodatne programske opreme. Program:
import ctypes
import time
Konstante za Windows API
VK_NUMLOCK = 0x90
KEYEVENTF_EXTENDEDKEY = 0x1
KEYEVENTF_KEYUP = 0x2
def is_numlock_active():
»««Preveri, ali je Num Lock vklopljen v Windows.«««
GetKeyState vrne 1, če je tipka vklopljena (toggle state)
return ctypes.windll.user32.GetKeyState(VK_
NUMLOCK) != 0
def set_numlock_state(state):
»««Nastavi stanje Num Lock na True (vklopljeno) ali False (izklopljeno).«««
if is_numlock_active() != state:
print(f«Spreminjam stanje Num Lock na {state}…«)
Simulira pritisk in sprostitev tipke Num Lock
ctypes.windll.user32.keybd_event(VK_
NUMLOCK, 0x3A, KEYEVENTF_EXTENDEDKEY, 0)
ctypes.windll.user32.keybd_event(VK_
NUMLOCK, 0x3A, KEYEVENTF_EXTENDEDKEY | KEYEVENTF_KEYUP, 0)
time.sleep(0.1) # Daj sistemu čas, da obdela dogodek
print(»Stanje spremenjeno.«)
else:
print(f«Num Lock je že nastavljen na {state}.«)
if name == ‘main‘:
set_numlock_state(True) # Vklopi Num Lock
deluje brezhibno in ga lahko seveda uporabimo tudi v PC-ju z arhitekturo x64.
Moč umetne inteligence
Razvoj umetne inteligence nas je pripeljal do točke, ko nam ni potrebno več potrebno vsega programirati. Kljub temo pa moramo znati podati pravilne in smiselne zahteve za tvorbo programske kode ter preverjati izdelane delne rešitve in jih medsebojno povezati v celoto. Če na primer LLM naročimo izdelavo izvorne kode dobro znane računalniške igre Tetris, bomo dobili povezavo na spletno stran, kjer je ta na voljo za izbran programski jezik (v našem primeru Python 3).
Umetna inteligenca bo program dejansko izdelala samo takrat, ko za rešitev našega problema v spletu še ni objavljenih ustreznih rešitev. Obenem opredeli pogoje za izvajanje in pripravi natančna navodila njeno namestitev in poganjanje. Denimo, če zahtevamo izdelavo programske kode za merjenje vhodne napetosti in toka Raspberry Pi 5, moramo imeti pravice uporabe programčka vcgencmd, ki ga nato Python3 uporabi, da pridobi vrednosti napetosti in toka, ki ju z napis in oznakami vrednosti izpiše na ekran, denimo: »Raspberry Pi 5 Input Voltage: 5.12843893 V«.
Prihodnjič
Tokrat smo si ogledali precej uporabnih primerov v Pythonu 3, ki jih lahko poganjamo tudi v Raspberry Pi Zero, ki je uporaben za gradnjo mobilnih robotov in dronov. Znanje tako brez težav uporabimo tudi v praksi. Prihodnjič se lotimo kompleksnejšega programiranja, kjer bomo združili več funkcionalnosti in krmili strojno logiko.
Vsekakor ne bomo pozabili niti na MicroPython, ki ga bomo poganjali na Raspberry Pi Pico 2 W in ESP32 modulih. Omenimo še, da so v Pythonu 3 napisani tudi primeri programske kode, ki jih lahko uporabljamo za detekcijo in razpoznavanje predmetov v živi slike iz videa ali kamere. O tem več v prihodnjih nadaljevanjih.
