MicroPython → Mini projekti → py5 → micro:bit i py5 komunikacija
micro:bit → py5 komunikacija preko serijskog porta
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
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
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.
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
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()
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.
Probaj:
x/5x/20x/50
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
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
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.