Završni projekat: Micro:bit kao gejming kontroler

Lekcija 17 od 20 · Python i Processing
Okruženje:
primeri u ovoj lekciji pisani su za Processing Python Mode. Ako radiš u preporučenom okruženju Thonny + py5, većina koda ostaje ista, a imena sa velikim slovom u sredini pišu se malim slovima sa donjom crtom: mouseX → mouse_x, noStroke() → no_stroke(). Pogledaj tabelu razlika.

U ovoj lekciji koristićemo micro:bit kao gejming kontroler za igru napravljenu u Processing Python Mode okruženju. Podaci sa senzora nagiba šalju se preko serijske komunikacije, a Processing ih koristi za upravljanje objektima u realnom vremenu. Ovaj projekat povezuje MicroPython, senzore, grafiku i razvoj igara u jednu celinu.

U ovom projektu micro:bit postaje interaktivni kontroler igre. Nagib uređaja kontroliše kretanje, dok tasteri A i B aktiviraju posebne akcije.


Ovo je kompletan real-time sistem koji povezuje: senzore → serijsku komunikaciju → grafičku igru.



Pre nego što nastaviš

Ovaj projekat koristi znanje iz lekcije Vizuelni kontroler nagiba.

Ako još nisi radio serijsku komunikaciju između micro:bit-a i Processing-a, preporučujemo da prvo prođeš tu lekciju.

⬅ Pogledaj lekciju: Vizuelni kontroler nagiba

Cilj projekta


  • Micro:bit šalje nagib (X, Y)
  • Taster A aktivira boost (brže kretanje)
  • Taster B daje poene
  • Processing prikazuje igru i upravlja logikom

Ključna ideja:

Micro:bit je “kontroler”, a Processing je “igra”.


Arhitektura sistema


micro:bit (senzori + dugmad)
        ↓
uart.write("x,y,A,B\n")
        ↓
USB Serial
        ↓
Processing (Python Mode)
        ↓
Igra: kretanje + bodovi + boost


MicroPython kod (micro:bit)



from microbit import *
import utime

while True:
    x = accelerometer.get_x()
    y = accelerometer.get_y()

    a = button_a.is_pressed()
    b = button_b.is_pressed()

    # slanje 4 vrednosti u jednom redu
    uart.write(
        str(x) + "," +
        str(y) + "," +
        str(int(a)) + "," +
        str(int(b)) + "\n"
    )

    utime.sleep(0.05)

Format poruke:

x,y,A,B\n

  • A = boost (0 ili 1)
  • B = poeni (0 ili 1)


Processing kod (Python Mode – logika igre)


# Processing Python Mode – serijska biblioteka uključuje se ovako
# (u Javi bi bilo: import processing.serial.*;)
add_library('serial')

x_pos = 350
y_pos = 250
speed_multiplier = 1
score = 0
my_port = None


def setup():
    global my_port
    size(700, 500)
    print(Serial.list())   # spisak portova – izaberi pravi indeks
    my_port = Serial(this, Serial.list()[0], 115200)
    my_port.bufferUntil(10)  # 10 = znak za novi red


def draw():
    background(30)
    fill(0, 150, 255)
    ellipse(x_pos, y_pos, 50, 50)
    fill(255)
    textSize(20)
    text("Score: " + str(score), 20, 30)


def serialEvent(port):
    global x_pos, y_pos, speed_multiplier, score
    data = port.readStringUntil(10)
    if data is None:
        return
    values = data.strip().split(',')
    if len(values) != 4:
        return
    x = float(values[0])
    y = float(values[1])
    a = int(values[2])
    b = int(values[3])

    # dugme A = boost
    speed_multiplier = 2 if a == 1 else 1

    # kretanje i granice ekrana
    x_pos = constrain(x_pos + (x / 200.0) * speed_multiplier, 25, width - 25)
    y_pos = constrain(y_pos + (y / 200.0) * speed_multiplier, 25, height - 25)

    # dugme B = poeni
    if b == 1:
        score += 5


Kako igra radi?


  • Nagib pomera igrača
  • Taster A ubrzava kretanje
  • Taster B dodaje poene
  • Processing obrađuje sve u realnom vremenu

Eksperiment:

Promeni delilac u kretanju:

x_pos += (x / 100) * speed_multiplier
Šta se dešava kada povećavaš ili smanjuješ vrednost?


Šta učenici uče?


  • Kako se dizajnira komunikacioni protokol
  • Kako se kombinuju više senzora u jednoj poruci
  • Kako se podaci parsiraju i validiraju
  • Kako se senzor mapira na kretanje
  • Osnove dizajna 2D igre


Napredni izazovi


  • Dodaj više neprijatelja
  • Dodaj život (health system)
  • Dodaj restart igre
  • Dodaj zvuk pri sudaru
  • Dodaj nivoe težine


Zaključak


Ovaj projekat povezuje hardver i softver u jednu celinu:

  • micro:bit = senzor i kontroler
  • Serial = komunikacioni kanal
  • Processing = grafička igra

Finalni cilj:

Učenici prelaze iz “pisanja koda” u razumevanje čitavog interaktivnog sistema.

Kako podaci putuju od micro:bit-a do grafike?


U ovoj lekciji smo videli kako micro:bit šalje podatke preko serial komunikacije.


Sada je važno razumeti šta se dešava “iza scene” — ceo put podataka.


Ključna ideja:

Micro:bit ne pravi grafiku.
On samo šalje podatke, a računar ih interpretira.


Tok podataka u sistemu


micro:bit → UART → USB → računar → Processing → grafika

  • micro:bit čita senzore (nagib, temperatura, dugmad)
  • uart.write() pretvara podatke u tekst
  • USB kabl prenosi podatke do računara
  • Processing čita dolazne poruke
  • podaci postaju grafika, animacija ili igra


Šta micro:bit zapravo šalje?


micro:bit ne šalje “grafiku” ili “objekte”, već samo običan tekst.


Primer jednostavnih poruka:

23
24
25

Processing te vrednosti može pretvoriti u:

  • kretanje objekta
  • graf temperature
  • promenu boje ili animaciju


Primer više vrednosti u jednoj poruci


Često se šalju dve ili više vrednosti zajedno:

23,512

To može značiti:

  • 23 → temperatura
  • 512 → svetlost ili drugi senzor

Zašto zarez?

Zarez je jednostavan “separator” koji omogućava Processing-u da lako razdvoji podatke pomoću split(',').


Mini eksperiment razumevanja


Razmisli:

Ako micro:bit pošalje:
120,-40
šta bi moglo da znači:
  • prvi broj?
  • drugi broj?
Kako bi to pretvorio u kretanje na ekranu?


Zašto je ovo važno?


Ovo je osnova svih sistema koji povezuju hardver i softver:

  • IoT uređaji
  • robotika
  • igre sa senzorima
  • interaktivne instalacije

U svim tim sistemima važi isti princip: uređaj šalje podatke → program ih interpretira.



Šta dalje učimo?


U sledećoj lekciji prelazimo na drugu stranu sistema: Processing program koji prima i crta podatke.


Učićemo:

  • kako se čita serial port
  • kako se razdvajaju podaci
  • kako se pravi real-time grafika

Finalna ideja:

micro:bit = senzor
Processing = mozak + grafika

Skriveni mini kviz — Vizuelna igra (micro:bit ↔ Processing)

Klikni da proveriš da li razumeš ključne koncepte igre: serial komunikaciju, mapiranje nagiba i logiku bodova/sudara.

Otvori kviz

Mini kviz: Vizuelna igra

1. Koji mikro:bit modul koristimo da šaljemo X i Y nagib računaru?




2. Koja linija u Processing kodu čita podatke sa micro:bit-a?


myPort.bufferUntil('\n');



3. Kako se mapira X nagib na horizontalnu poziciju objekta?




4. Kako igra detektuje sudar?




5. Kada igrač dobija poene?







Šta dalje?

U ovoj lekciji naučio si kako da micro:bit šalje podatke o nagibu i kako Processing može da ih pretvori u grafiku u realnom vremenu.

Sledeći korak je da te iste podatke iskoristiš za upravljanje igrom.

Nastavi na projekat: Micro:bit gejming kontroler →

U tom projektu koristićemo nagib micro:bit-a za kontrolu objekata, izbegavanje prepreka i sakupljanje poena.

Ista igra u py5 (Thonny)

Ako serijska biblioteka u Processing Python Mode-u ne radi (čest problem u Processing-u 4), isti projekat napravi u Thonny-ju sa py5 dodatkom. Umesto serialEvent() koristimo biblioteku pyserial i čitamo podatke u draw(). U Thonny-ju je instaliraj preko Tools → Manage packages → pyserial.

# py5, imported mode (Thonny + py5 dodatak). Kod micro:bit-a ostaje isti.
import serial
import serial.tools.list_ports

x_pos = 350
y_pos = 250
score = 0
ser = None


def nadji_microbit():
    for p in serial.tools.list_ports.comports():
        opis = (p.description or "").lower()
        if "micro:bit" in opis or "mbed" in opis or p.vid == 0x0D28:
            return p.device
    return None


def setup():
    global ser
    size(700, 500)
    port = nadji_microbit()
    if port:
        ser = serial.Serial(port, 115200, timeout=0)
    else:
        print("micro:bit nije pronađen")


def draw():
    global x_pos, y_pos, score
    background(30)

    # pročitaj sve poruke koje su stigle od prošlog frame-a
    while ser and ser.in_waiting:
        line = ser.readline().decode("utf-8", errors="ignore").strip()
        values = line.split(",")
        if len(values) != 4:
            continue
        x, y = float(values[0]), float(values[1])
        boost = 2 if values[2] == "1" else 1
        x_pos = constrain(x_pos + x / 200 * boost, 25, width - 25)
        y_pos = constrain(y_pos + y / 200 * boost, 25, height - 25)
        if values[3] == "1":
            score += 5

    fill(0, 150, 255)
    circle(x_pos, y_pos, 50)
    fill(255)
    text_size(20)
    text("Score: " + str(score), 20, 30)
Pre pokretanja: zatvori vezu Thonny-ja sa micro:bit-om (Stop, pa interpreter Local Python 3). Port može da koristi samo jedan program.