MicroPython — Radio projekti i igre
Sada kada znaš kako micro:bit uređaji mogu međusobno da komuniciraju, vreme je da to znanje primeniš u **praktičnim projektima i igrama**. Ova lekcija pokazuje kako kombinovati radio, LED matricu i dugmad za zanimljive mini-projekte.
Šta znači radio.config(group=...)?
Kada koristimo radio komunikaciju na micro:bit uređajima, veoma je važno da podesimo grupu.
radio.config(group=23)
Zašto je grupa važna?
Micro:bit radio funkcioniše kao bežični kanal. Svaka grupa predstavlja poseban komunikacioni kanal.
- Ako dva uređaja imaju istu grupu → mogu da komuniciraju.
- Ako imaju različite grupe → neće primati međusobne poruke.
Primer iz učionice
Ako u istoj prostoriji radi više timova, svaki tim treba da koristi drugačiji broj grupe kako se poruke ne bi mešale.
Na primer:
radio.config(group=1) # Tim 1
radio.config(group=2) # Tim 2
radio.config(group=3) # Tim 3
Koji broj grupe mogu koristiti?
Broj grupe može biti od 0 do 255. Bitno je samo da svi uređaji koji treba da komuniciraju koriste isti broj.
Ako radio komunikacija ne funkcioniše, prvo proveri da li su uređaji podešeni na istu grupu.
Šta znači radio.config(power=...)?
Pored podešavanja grupe, možemo podesiti i jačinu radio signala.
radio.config(power=7)
Šta znači power?
Parametar power određuje jačinu radio signala,
odnosno koliko daleko poruka može da putuje.
- 0 → najmanja jačina (kraći domet, manja potrošnja energije)
- 7 → najveća jačina (najveći domet)
Kada koristiti veću snagu?
- Kada su uređaji udaljeni
- Kada postoji više prepreka (zidovi, nameštaj)
- Na takmičenjima sa većim prostorom
Kada koristiti manju snagu?
- Kada su uređaji blizu
- Kada želiš da smanjiš potrošnju baterije
- Kada u učionici radi više timova
Primer kompletne konfiguracije
radio.on()
radio.config(group=23, power=6)
Ovim podešavamo komunikacionu grupu i snagu signala. Svi uređaji koji treba da komuniciraju moraju imati istu grupu.
1. Radio brojač
Jedan uređaj šalje brojeve, a drugi ih prikazuje. Idealno za bodovanje ili takmičenja.
# Uređaj 1: šalje brojeve
from microbit import *
import radio
radio.on()
radio.config(group=1)
broj = 0
while True:
if button_a.was_pressed():
broj += 1
radio.send(str(broj))
display.show(broj)
sleep(500)
# Uređaj 2: prima i prikazuje brojeve
from microbit import *
import radio
radio.on()
radio.config(group=1)
while True:
poruka = radio.receive()
if poruka:
display.show(int(poruka))
2. Igra “Zagrej dugme” (Hot Potato)
Igrači prosleđuju „vruću lopticu“ pritiskom na dugme. Ako je u njihovom posedu duže od određenog vremena, LED prikazuje simbol poraza.
# micro:bit uređaj igrača
from microbit import *
import radio
import time
radio.on()
radio.config(group=1)
vruce = False
start_time = 0
while True:
if button_a.was_pressed() and not vruce:
radio.send("HOT")
vruce = True
start_time = running_time()
display.show(Image.SQUARE)
poruka = radio.receive()
if poruka == "HOT" and not vruce:
vruce = True
start_time = running_time()
display.show(Image.SQUARE)
if vruce and running_time() - start_time > 5000:
display.show(Image.SAD)
vruce = False
radio.send("HOT")
3. Saveti za dalje projekte
- Koristi
radio.config(group=broj)da napraviš više timova - Kombinuj LED matricu sa radio porukama za animacije
- Probaj praviti mini igre sa bodovanjem, brojačem i vremenskim limitima
- Uvek testiraj poruke između dva uređaja pre nego što praviš kompleksnu igru
□ Ovde možeš koristiti i MakeCode blokove za početni test, a zatim preći u MicroPython za više kontrole i fleksibilnosti.
4. Napredni projekat: Radio reakcija (Refleks igra)
Dva micro:bit uređaja takmiče se ko će brže reagovati. Jedan uređaj šalje signal "GO", a drugi mora što brže da pritisne dugme. Rezultat (vreme reakcije) šalje se nazad.
Uređaj 1 – Sudija
from microbit import *
import radio
import random
radio.on()
radio.config(group=1)
while True:
sleep(random.randint(2000, 5000))
radio.send("GO")
start = running_time()
while True:
odgovor = radio.receive()
if odgovor:
reakcija = int(odgovor)
display.scroll("Rez: " + str(reakcija))
break
Uređaj 2 – Igrač
from microbit import *
import radio
radio.on()
radio.config(group=1)
while True:
poruka = radio.receive()
if poruka == "GO":
start = running_time()
while not button_a.was_pressed():
pass
reakcija = running_time() - start
radio.send(str(reakcija))
□ Ovde se kombinuju:
- radio komunikacija
- merenje vremena (
running_time()) - uslovne petlje
- pretvaranje string → broj
5. Projekat: Radio + Akcelerometar (Nagib kontrola)
Jedan micro:bit šalje podatke o nagibu (x osa), drugi ih koristi da pomera tačku po LED matrici.
Predajnik
from microbit import *
import radio
radio.on()
radio.config(group=1)
while True:
x = accelerometer.get_x()
radio.send(str(x))
sleep(200)
Prijemnik
from microbit import *
import radio
radio.on()
radio.config(group=1)
pozicija = 2
while True:
poruka = radio.receive()
if poruka:
x = int(poruka)
if x > 300:
pozicija += 1
elif x < -300:
pozicija -= 1
pozicija = max(0, min(4, pozicija))
display.clear()
display.set_pixel(pozicija, 2, 9)
Ovo je osnova za pravljenje:
- bežičnog kontrolera
- mini trkaćih igara
- navigacionih igara
Mini izazov
Pokušaj da napraviš igru u kojoj:
- micro:bit A šalje temperaturu
- micro:bit B prikazuje □ ako je temperatura > 30
- inače prikazuje □
Dodatni izazov:
- pošalji i temperaturu i nagib u istoj poruci (npr. "28,150")
- razdvoji podatke pomoću
split(",")
Skriveni mini kviz — Radio projekti
Proveri svoje znanje
Mini kviz: Radio komunikacija
1. Zašto se koristi str() prilikom slanja brojeva?
2. Koja funkcija meri vreme u milisekundama?
3. Kako ograničiti poziciju tačke između 0 i 4?
Pedagoški savet
Ako radiš u učionici:
- Prvo testiraj jednostavno slanje teksta
- Zatim pređi na brojeve
- Na kraju kombinuj više podataka u jednoj poruci
- Objasni učenicima razliku između stringa i broja
□ Sledeći korak je pravljenje složenijih timskih igara, sa bodovanjem, vremenskim ograničenjima i kombinovanjem više senzora.
Veliki završni projekat — Mini multiplayer igra
U ovom projektu praviš pravu multiplayer igru između više micro:bit uređaja.
Igra se zove: „Radio Arena – Lov na signal“
Cilj igre
- Jedan micro:bit je server (arena)
- Ostali su igrači
- Server nasumično šalje „meta signal“
- Igrači moraju što brže da reaguju
- Najbrži dobija poen
Šta se uči?
- radio komunikacija
- mini protokol poruka
- identifikacija igrača (ID)
- merenje vremena
- logika bodovanja
Ovo je završni projekat koji kombinuje sve što si do sada učio.
1. Mini radio protokol
Da bi više uređaja moglo da komunicira, uvodimo jednostavan protokol:
TIP_PORUKE:VREDNOSTPrimeri:
- START
- GO
- WIN:2 → igrač 2 je pobedio
- POINT:3 → igrač 3 dobija poen
Ovo omogućava da kasnije proširimo igru bez menjanja strukture.
2. Server (Arena kontroler)
from microbit import *
import radio
import random
radio.on()
radio.config(group=7)
igraci = {}
runda = 0
while True:
sleep(random.randint(3000, 6000))
radio.send("GO")
start = running_time()
display.show(Image.TARGET)
pobednik = None
while running_time() - start < 5000:
poruka = radio.receive()
if poruka and poruka.startswith("HIT:"):
igrac_id = poruka.split(":")[1]
pobednik = igrac_id
break
if pobednik:
if pobednik not in igraci:
igraci[pobednik] = 0
igraci[pobednik] += 1
radio.send("WIN:" + pobednik)
display.scroll("Pobednik " + pobednik)
else:
display.scroll("Niko")
Server:
- šalje signal GO
- čeka odgovor HIT:ID
- dodeljuje poen
- objavljuje pobednika
3. Kod za igrača
Svaki igrač mora imati svoj ID.
from microbit import *
import radio
radio.on()
radio.config(group=7)
igrac_id = "1" # promeni za svakog igrača
while True:
poruka = radio.receive()
if poruka == "GO":
display.show(Image.SQUARE)
while not button_a.was_pressed():
pass
radio.send("HIT:" + igrac_id)
if poruka and poruka.startswith("WIN:"):
pobednik = poruka.split(":")[1]
if pobednik == igrac_id:
display.show(Image.HAPPY)
else:
display.show(Image.SAD)
Igrač:
- čeka signal GO
- pritisne dugme
- šalje HIT:ID
- prima informaciju ko je pobedio
4. Proširenje igre (napredni nivo)
Sada možeš dodati:
- ✔ limit do 5 poena (kraj igre)
- ✔ zvučni signal pre GO
- ✔ lažni signal (FEJK) za zbunjivanje
- ✔ korišćenje akcelerometra umesto dugmeta
- ✔ prikaz tabele rezultata
Primer kraja igre:
if igraci[pobednik] == 5:
radio.send("END:" + pobednik)
display.scroll("Kraj igre")
5. Analiza projekta
Ovaj projekat uvodi važne koncepte:
- Master–Client arhitektura
- Mini komunikacioni protokol
- Identifikacija uređaja
- Rad sa string funkcijama (split, startswith)
- Rečnik (dictionary) za bodove
Ovo je osnova za:
- mrežne igre
- IoT sisteme
- bežične senzorske mreže
Razmisli:
- Šta ako dva igrača pošalju HIT u isto vreme?
- Kako rešiti konflikt?
- Kako dodati autentifikaciju uređaja?
Radio Arena RPG — Strategija i energija
Ovo je napredna verzija multiplayer igre. Sada svaki igrač ima:
- energiju (HP)
- napad
- odbranu
- specijalnu moć
Cilj igre
- Igrači se bežično napadaju
- Svaki pogodak smanjuje energiju protivnika
- Pobeđuje onaj ko poslednji ostane sa energijom > 0
Ovo je pravi mali bežični RPG sistem.
1. Radio RPG protokol
Uvodimo strukturirane poruke:
ATTACK:ID:snaga DEFEND:ID SPECIAL:ID STATUS:ID:energija DEAD:ID
Primer:
ATTACK:2:15
→ Igrač 2 napada snagom 15
2. Osnovni kod igrača
from microbit import *
import radio
import random
radio.on()
radio.config(group=9)
igrac_id = "1"
energija = 100
odbrana = False
while True:
poruka = radio.receive()
# Napad dugme A
if button_a.was_pressed():
snaga = random.randint(5, 20)
radio.send("ATTACK:" + igrac_id + ":" + str(snaga))
display.show(Image.SWORD)
sleep(500)
display.clear()
# Odbrana dugme B
if button_b.was_pressed():
odbrana = True
radio.send("DEFEND:" + igrac_id)
display.show(Image.SHIELD)
sleep(500)
display.clear()
# Obrada primljene poruke
if poruka and poruka.startswith("ATTACK:"):
podaci = poruka.split(":")
napadac = podaci[1]
snaga = int(podaci[2])
if napadac != igrac_id:
if odbrana:
snaga = snaga // 2
odbrana = False
energija -= snaga
if energija <= 0:
radio.send("DEAD:" + igrac_id)
display.show(Image.SKULL)
else:
display.scroll(str(energija))
3. Specijalna moć (tresenje uređaja)
Ako igrač protrese micro:bit, aktivira specijalni napad.
if accelerometer.was_gesture("shake"):
snaga = random.randint(20, 35)
radio.send("SPECIAL:" + igrac_id + ":" + str(snaga))
display.show(Image.DIAMOND)
sleep(800)
display.clear()
Specijal može:
- imati veći napad
- trošiti dodatnu energiju
- imati cooldown (vremensko ograničenje)
4. Strategija igre
Igra sada zahteva razmišljanje:
- Kada napasti?
- Kada se braniti?
- Kada čuvati specijal?
Moguće nadogradnje:
- ✔ Energetski napitak (oporavak)
- ✔ Ograničenje specijala (1 po rundi)
- ✔ Timovi (group kanali)
- ✔ Mana sistem (energija za specijal)
5. Napredni koncepti koje ova igra uvodi
- Distribuirani sistem
- Stanje (state machine)
- Upravljanje resursima
- Protokol sa više tipova poruka
- Simulacija mrežne igre
Pitanja za analizu:
- Šta ako dva igrača napadnu istovremeno?
- Kako sprečiti spam napade?
- Kako sinhronizovati energiju između uređaja?
Ovo je već konceptualno blizu pravim multiplayer igrama.
Napredni projektni primer — Radio trka
U ovom projektu dva micro:bit uređaja učestvuju u bežičnoj trci. Svaki igrač pritiskom na dugme A povećava svoj rezultat, a rezultat se šalje drugom uređaju putem radio komunikacije. Pobednik je onaj ko prvi stigne do 10 poena.
Podešavanje (obavezno na oba uređaja)
from microbit import *
import radio
radio.on()
radio.config(group=42)
Kod za oba igrača
from microbit import *
import radio
radio.on()
radio.config(group=42)
moj_rezultat = 0
protivnik = 0
while True:
# Povećaj rezultat pritiskom na A
if button_a.was_pressed():
moj_rezultat += 1
radio.send(str(moj_rezultat))
display.show(moj_rezultat)
# Primi rezultat protivnika
poruka = radio.receive()
if poruka:
protivnik = int(poruka)
# Provera pobede
if moj_rezultat >= 10:
display.scroll("POBEDA")
break
if protivnik >= 10:
display.scroll("PORAZ")
break
sleep(100)
Kako funkcioniše projekat?
- Svaki uređaj vodi svoj rezultat.
- Rezultat se šalje kao tekstualna poruka.
- Primljena poruka se pretvara u broj pomoću
int(). - Kada neko dostigne 10 poena, igra se završava.
Ideje za proširenje (takmičarski nivo)
- Dodaj odbrojavanje pre početka igre.
- Dodaj zvučni signal pri pobedi.
- Uvedi vremensko ograničenje (npr. 30 sekundi).
- Dodaj trećeg igrača (radio mreža).
- Implementiraj jednostavnu potvrdu prijema poruke (ACK sistem).
Ovaj projekat razvija razumevanje radio komunikacije, rada sa numeričkim podacima i logike igre. Pogodan je za školska takmičenja i STEM demonstracije.
Skriveni mini kviz — Radio RPG (energija i strategija)
Proveri da li razumeš kako funkcioniše radio RPG sistem: poruke, energija, napad i odbrana.
Otvori kviz
Mini kviz: Radio Arena RPG
1. Šta znači poruka ATTACK:2:15?
2. Šta se dešava ako je odbrana aktivna tokom napada?
3. Koja funkcija omogućava specijalni napad tresenjem uređaja?
4. Šta treba proveriti pre smanjenja energije?
5. Šta znači ako energija padne na 0 ili manje?
Povezane lekcije i korisni resursi
Ako želiš da proširiš znanje o MicroPython radio komunikaciji, pogledaj sledeće lekcije i resurse.
□ Srodne lekcije na SvetProgramiranja.com
-
MicroPython — Radio komunikacija
Osnovni principi slanja i primanja poruka između micro:bit uređaja. -
MicroPython — Ugrađeni senzori
Rad sa akcelerometrom, dugmadima i senzorima. -
MicroPython — Dodatni senzori i aktuatori
Povezivanje servo motora, ultrazvučnih senzora i spoljašnjih modula. -
MicroPython — Petlje i vreme
Razumevanjewhilepetlji i vremenskih kašnjenja. -
Python projekti za školu
Ideje za takmičenja i praktične školske projekte.
□ Korisni spoljašnji resursi
-
Zvanični micro:bit sajt
Projekti, dokumentacija i edukativni materijali. -
Online MicroPython editor za micro:bit
Pokreni i testiraj kod direktno u pregledaču. -
Zvanična MicroPython dokumentacija za micro:bit
Detaljna objašnjenja funkcija kao što suradio.send(),radio.receive()iradio.config().
Kombinovanjem radio komunikacije, senzora i aktuatora možeš razviti ozbiljne STEM i IoT projekte, kao i radove za školska i regionalna takmičenja.