Skip to main content

1.2 Blinkanje LED-ice


Ovaj primjer pali i gasi LED-icu pomoću Soldered NULA MINI pločice. To je obično prvi projekt pri učenju mikrokontrolera jer te uvodi u najosnovniji koncept: dovođenje pina u visoko (uključeno) ili nisko (isključeno) stanje.

U ovoj dokumentaciji naučit ćeš:

  • Kako dodijeliti pin varijabli za lakše upravljanje kodom.
  • Kako konfigurirati pin kao izlaz pomoću Pin.OUT.
  • Kako kontrolirati stanja pina pomoću value() (1 i 0)
  • Kako koristiti time.sleep() za pauziranje izvršavanja programa

Potreban hardver:

  • 1x Soldered NULA MINI pločica
  • 1x Breadboard
  • 1x LED-ica (bilo koje boje)
  • 1x otpornik od 330 ohma
  • Jumper žice
  • USB-c kabel

Spajanje komponenti

Prvo sastavi krug. Prođi korake po redu, jer svaki ovisi o onome prije njega.

1. Umetni NULA MINI pločicu na breadboard

ℹ️
Ovaj korak pretpostavlja da znaš kako je breadboard spojen iznutra i što su njegove naponske vodilice (power rails). Za uvod pogledaj stranicu dokumentacije Osnove breadboarda.

Ako tvoja pločica ima muške headere zalemljene na pinove, utisni je u breadboard. Spajanje svega ostalog je tako lakše i urednije.

NULA MINI na breadboardu
NULA MINI na breadboardu

Ako ih nema, spoji komponente direktno na pločicu. Zbrkanije je, ali radi.

2. Spoji LED-icu na NULA MINI pločicu

Uzmi jumper žicu i spoji jedan kraj na slobodan GPIO pin na pločici. Za potrebe ovog primjera koristit ćemo pin IO4. Spoji drugi kraj na bilo koji slobodan red na breadboardu (slobodan znači da na njemu ništa nije spojeno!).

Korak 2 spajanja
Korak: 2

Uzmi jedan otpornik od 330 ohma i spoji jedan kraj u isti red kao i žicu. Spoji drugi kraj otpornika u neki drugi slobodan red.

Korak 3 spajanja
Korak: 3

Pogledaj dvije nožice LED-ice. Jedna je duža od druge:

Korak 4 spajanja
Korak: 4

Spoji dužu (anodu) u red koji je spojen s drugim krajem otpornika od 330 ohma.

Korak 5 spajanja
Korak: 5

Kraća nožica, katoda, ide na pin GND na NULA pločici.

Spoji NULA MINI pločicu na računalo preko USB-c kabela:

USB veza
Spajanje NULA MINI pločice na računalo preko USB-c kabela.

Uvoz onoga što nam treba

MicroPython drži kod koji razgovara s hardverom u modulima, i moraš uvesti dijelove koje želiš prije nego ih možeš koristiti. Modul machine sadrži sve vezano za hardver, a Pin je njegov dio koji upravlja pojedinim pinom. Modul time je ono što nam omogućuje pauziranje programa.

from machine import Pin
import time
ℹ️
Oba modula ugrađena su u firmware na pločici, pa za ovaj primjer nema se što instalirati. Qwiic senzori kasnije u kitu su drugačiji: njima trebaju driveri iz lib foldera, kako je opisano na stranici Postavljanje MicroPythona.

Dodjeljivanje pinova varijablama

Umjesto pisanja broja pina direktno u svaki poziv funkcije, možeš ga spremiti u varijablu radi bolje čitljivosti. U ovom primjeru varijabli PIN_NUMBER dodijeljena je vrijednost 4, što odgovara pinu IO4 na NULA pločici. Ako kasnije odlučiš prebaciti LED-icu na drugi pin, moraš izmijeniti samo varijablu na jednom mjestu, a ostatak koda će i dalje raditi.

Poslužit će bilo koji pin označen s IO. Dijagram ispod prikazuje sve njih:

Svi dostupni GPIO pinovi na NULA MINI
Svi dostupni GPIO pinovi na NULA MINI

Obje varijable deklariramo na vrhu datoteke, prije nego ih bilo što koristi:

# Ovo je varijabla kojoj predajemo broj pina na koji smo spojili LED-icu.
# NULA pločica ima logiku imenovanja pinova ovako: IO4, gdje je 4 broj koji dajemo varijabli.
PIN_NUMBER = 4

# Ovo je varijabla koja definira vrijeme blinkanja, u sekundama.
DELAY_S = 1
⚠️
Primijeti da se DELAY_S mjeri u sekundama, a ne u milisekundama. To je jedno od mjesta gdje se MicroPython razlikuje od Arduina: delay(1000) u skici i time.sleep(1) ovdje oboje čekaju jednu sekundu. Predavanje 1000 funkciji time.sleep() zamrznulo bi LED-icu na više od šesnaest minuta.
ℹ️
Velika slova u PIN_NUMBER i DELAY_S su Python konvencija za vrijednosti koje se ne bi trebale mijenjati dok program radi. Ništa te ne sprječava da ih napišeš malim slovima, ali velika slova govore svakome koji čita kod da su ovo postavke, a ne radne varijable.

Konfiguriranje pina kao ulaza ili izlaza

Svaki IO pin na NULA MINI može djelovati kao ulaz (čitanje signala s tipki, senzora i tako dalje) ili kao izlaz (slanje signala LED-icama, buzzerima, motorima i tako dalje). U ovom projektu, budući da je LED-ica komponenta kojom želimo upravljati, pin mora biti postavljen kao izlaz. Pinovi po zadanom ne "znaju" trebaju li slušati signale ili ih odašiljati.

IO vizualizirano
Vizualizacija ulaznog i izlaznog moda

U MicroPythonu za to ne pozivaš zasebnu funkciju kako radi pinMode() u Arduinu. Umjesto toga, kažeš čemu pin služi u trenutku kada ga stvaraš. Pin(PIN_NUMBER, Pin.OUT) stvara objekt koji predstavlja IO4 i istim potezom ga konfigurira kao izlaz. Taj objekt spremamo u varijablu led i od tada s pinom razgovaramo preko nje.

led = Pin(PIN_NUMBER, Pin.OUT)

Predavanje Pin.OUT znači da će pin pisati vrijednost. Pin.IN bi značilo obrnuto, da pin sluša signal koji dolazi izvana, kao što je stanje tipke. Ulaz uz to može primiti i treći argument, Pin.PULL_UP, koji uključuje unutarnji otpornik da drži pin u poznatom stanju kada ga ništa ne pobuđuje. On ide na svoje vlastito mjesto, a ne zamjenjuje Pin.IN, pa cijela linija izgleda Pin(BUTTON_PIN, Pin.IN, Pin.PULL_UP). Srest ćeš ga u 2.1 Brojač pritisaka tipke.


Ponavljanje unedogled

Arduino skica sastavljena je od dvije funkcije: setup() se izvršava jednom, a loop() se sam ponavlja iznova. MicroPython nema ni jednu ni drugu. On čita tvoju datoteku od prve linije do posljednje i onda se zaustavlja, pa ako želiš da se nešto ponavlja, to moraš sam reći, pomoću petlje.

Petlja while nastavlja izvršavati blok uvučen ispod nje sve dok je njezin uvjet istinit. Budući da je True uvijek istinit, ova petlja nikada ne završava i kod unutra se izvršava dok ne zaustaviš program.

while True:
# sve uvučeno ispod ovoga ponavlja se unedogled
ℹ️
Uvlačenje nije ukras. U Pythonu su razmaci na početku linije ono što interpreteru govori koje linije pripadaju petlji. Svaka linija koja se treba ponavljati mora biti uvučena jednako, a prva linija koja nije uvučena je ponovno izvan petlje.

Upravljanje stanjima pina pomoću value()

Kada je pin konfiguriran kao izlaz, njegovim stanjem upravljaš funkcijom value(). Pisanje led.value(1) postavlja pin na logičku visoku razinu (3.3 V na NULA MINI pločici), što dopušta struji da teče kroz spojeni krug, u ovom slučaju paleći LED-icu. Pisanje led.value(0) postavlja pin na 0 V, što zaustavlja tok struje i gasi LED-icu.

while True:
led.value(1) # Upali LED-icu
led.value(0) # Ugasi LED-icu
ℹ️
Gdje Arduino skica piše riječi HIGH i LOW, MicroPython koristi brojeve 1 i 0. Znače potpuno istu stvar.

Ako pokreneš kod kakav je gore, činit će se da LED-ica ne blinka uopće. Dvije linije se izvršavaju jedna za drugom u nekoliko milijuntih dijelova sekunde, daleko brže nego što tvoje oko može pratiti, pa LED-ica jednostavno izgleda slabo upaljena cijelo vrijeme.


Pauziranje izvršavanja programa

Da blinkanje postane vidljivo, koristimo time.sleep(), koji pauzira program za broj sekundi koji mu predaš. Naš DELAY_S je 1, pa svaka pauza traje jednu sekundu: kod upali LED-icu, čeka sekundu, ugasi je, čeka još jednu sekundu, i onda petlja počinje ponovno od vrha.

while True:

# value() mijenja ono što naš pin piše. Budući da radimo s digitalnim pinom, možemo prebacivati samo
# između dvije vrijednosti, visoke i niske, ovdje zapisane kao 1 i 0. Na NULA pločici je visoka 3.3V
# dok je niska 0V. Počinjemo dovođenjem pina u visoko stanje, dajući LED-ici 3.3V i paleći je.
led.value(1)

# time.sleep() započinje pauzu u kodu. Njezino trajanje zadaje se u sekundama.
time.sleep(DELAY_S)

# Dovodimo pin u nisko stanje, gaseći LED-icu.
led.value(0)

# Ostavi LED-icu ugašenu na trenutak.
time.sleep(DELAY_S)

Probaj promijeniti DELAY_S na 0.5 i pokrenuti ponovno. Za razliku od Arduino funkcije delay(), koja prima samo cijele milisekunde, time.sleep() bez problema prima decimalni broj, pa je pola sekunde potpuno valjana pauza.



Cijeli primjer

Pogledaj cijeli kod primjera na linku ispod:

1.2_LED_blinking.py

Primjer koji pokazuje kako upravljati blinkanjem obične LED-ice