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:VREDNOST
Primeri:
  • 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



□ Korisni spoljašnji resursi



Kombinovanjem radio komunikacije, senzora i aktuatora možeš razviti ozbiljne STEM i IoT projekte, kao i radove za školska i regionalna takmičenja.