MicroPython → Mini projekti → py5 → micro:bit i py5 komunikacija


micro:bit → py5 komunikacija preko serijskog porta


Prvi py5 projekat sa micro:bit-om

Cilj: Kontrola grafike na računaru pomoću micro:bit-a


Do sada smo koristili:

  • micro:bit za očitavanje senzora
  • serial komunikaciju za slanje podataka
  • Processing Python Mode za prikaz grafike

Sada ćemo isto uraditi koristeći py5.

Na taj način dobijamo:

  • moderni Python 3
  • podršku za pyserial
  • lakše korišćenje dodatnih biblioteka
  • savremenije razvojno okruženje
Velika ideja:

micro:bit postaje kontroler. On šalje podatke o pokretu, a py5 ih pretvara u grafiku na ekranu.

Kako izgleda tok podataka?


U ovom projektu podaci putuju ovim redosledom:


micro:bit
    ↓
UART
    ↓
USB kabl
    ↓
COM port
    ↓
pyserial
    ↓
py5
    ↓
grafika na ekranu

Dakle:

  • micro:bit šalje podatke
  • pyserial ih prima
  • py5 ih prikazuje
Važno:

py5 ne čita serijski port direktno. Za komunikaciju koristi biblioteku pyserial.

Program za micro:bit


Micro:bit će:

  • čitati nagib uređaja
  • slati X i Y vrednosti
  • slati novu poruku deset puta u sekundi

from microbit import *
import utime

uart.init(baudrate=115200)

while True:

    x = accelerometer.get_x()
    y = accelerometer.get_y()

    uart.write(
        str(x) + "," +
        str(y) + "\n"
    )

    utime.sleep(0.1)

Poruke koje stižu računaru izgledaju ovako:


120,-45
135,-60
100,-80

Svaka linija sadrži:

  • X komponentu ubrzanja
  • Y komponentu ubrzanja

Instalacija pyserial biblioteke


Ako već nije instalirana:


pip install pyserial

ili:


python -m pip install pyserial

Bez ove biblioteke Python ne može da pristupi COM portovima.

Provera:

Pokreni:

pip show pyserial
Ako vidiš informacije o paketu, instalacija je uspešna.

Kako pronaći COM port?


Pre nego što napišemo program, moramo saznati koji COM port koristi micro:bit.

Možeš koristiti:

  • Device Manager (Windows)
  • ls /dev/tty* (Linux)

Na primer:


COM5

ili:


/dev/ttyACM0
Mini eksperiment:

Isključi micro:bit, pa ponovo pokreni listu portova. Koji port je nestao? To je najverovatnije micro:bit.

Prvi py5 program koji prima podatke


Ovaj program:

  • otvara COM port
  • prima X i Y vrednosti
  • crta lopticu
  • pomera lopticu naginjanjem micro:bit-a

import py5
import serial

x_pos = 300
y_pos = 200

ser = serial.Serial(
    "COM5",
    115200,
    timeout=0.1
)

def setup():

    py5.size(600, 400)


def draw():

    global x_pos
    global y_pos

    py5.background(240)

    while ser.in_waiting:

        line = (
            ser.readline()
            .decode("utf-8")
            .strip()
        )

        values = line.split(",")

        if len(values) == 2:

            x = float(values[0])
            y = float(values[1])

            x_pos = py5.width/2 + x/10
            y_pos = py5.height/2 + y/10

    py5.circle(
        x_pos,
        y_pos,
        50
    )

py5.run_sketch()
Napomena:

Obavezno zameni: "COM5" pravim portom na svom računaru.

Kako program funkcioniše?


1. Otvaranje serijskog porta



ser = serial.Serial(
    "COM5",
    115200
)

Ovde uspostavljamo vezu sa micro:bit-om.

Brzina mora biti ista kao u MicroPython programu.

2. Čitanje poruke



line = ser.readline()

Čita jednu kompletnu liniju teksta.

Na primer:


120,-45

3. Razdvajanje vrednosti



values = line.split(",")

Dobijamo:


["120", "-45"]

4. Pretvaranje u brojeve



x = float(values[0])
y = float(values[1])

Tekst pretvaramo u numeričke vrednosti.

5. Crtanje objekta



py5.circle(
    x_pos,
    y_pos,
    50
)

Na osnovu podataka sa senzora, menja se pozicija objekta na ekranu.

Zašto delimo sa 10?


Akcelerometar može vraćati vrednosti približno između:


-1024 ... +1024

To je mnogo više od dimenzija ekrana.

Zato koristimo:


x/10
y/10

kako bismo dobili sporije i preglednije kretanje.

Eksperimentiši:

Probaj:
  • x/5
  • x/20
  • x/50
Kako se menja osetljivost kontrolera?

Kako napraviti glatko kretanje?


Senzori uvek sadrže malu količinu šuma.

Zbog toga objekat može blago podrhtavati.

Jednostavno rešenje je prosečenje:


x_pos = 0.9*x_pos + 0.1*nova_x
y_pos = 0.9*y_pos + 0.1*nova_y

Ova tehnika se naziva:

  • smoothing
  • low-pass filter
  • eksponencijalno usrednjavanje
Za igre:

Kod kontrolisanja loptice ili reketa, smoothing gotovo uvek daje prijatnije iskustvo igranja.

Mini izazov


Proširi program tako da:

  • menja boju loptice
  • dodaje više objekata
  • prikazuje brojčane vrednosti senzora
  • dodaje granice ekrana
  • koristi smoothing
Veliki izazov:

Možeš li da napraviš Pong igru u kojoj se reket kontroliše isključivo naginjanjem micro:bit-a? To je jedan od najpopularnijih prvih projekata koji povezuje senzore, serijsku komunikaciju i grafiku.