B3B35RO1| Ing. David Pařil - Python a BriVis pro Briana
2006
2013
2006
2013
2020
2006
2013
2020
2025
2006
2013
2020
2025
2006
2013
2020
2025
„Inteligentní“ kostka
2 dotykové senzory
Zvukový sensor
Světelný sensor
Ultrazvukový sensor
3 velké servo motory
„Inteligentní“ kostka
2 dotykové senzory
Gyroskop
Světelný sensor
Ultrazvukový sensor
2 velké servo motory
1 malý servo motor
„Inteligentní“ kostka
2 tlakové senzory
Gyroskop (integr.)
Světelný sensor
2 Ultrazvukové sens.
1 větší servo motor
2 malé servo motory
„Inteligentní“ kostka
2 dotykové senzory
Gyroskop
Světelný sensor
Ultrazvukový sensor
2 velké servo motory
1 malý servo motor
2006
2013
2020
2025
256 KB Flash
64 KB RAM
48 MHz
BT
16 MB Flash
64 MB RAM
300 MHz
BT + Ext. Wi-Fi
SD Karta
1 MB Flash
320 KB RAM
100 MHz
BT
16 MB Flash
8 MB RAM
Dualcore 240 MHz
Wifi + BT
RT coprocessor
USB-C, SD Karta
2006
2013
2020
2025
Barevný dotykový display
Rotační enkodér
Reproduktor
Headphone jack
SD Karta
USB-C Fastcharge
Motorporty
Senzorporty
Nahlašte problémy s Brianem
Připojte se k vývoji
→ parildav@fel.cvut.cz | hlinovsm@fel.cvut.cz
Přehled podporovaných programovacích jazyků:
Platforma | Grafické | uPython | Java | C | ostatní |
---|---|---|---|---|---|
NXT | ✅ | ❌ | ⚠️ | ⚠️ | ⚠️ |
EV3 | ✅ | ✅ | ⚠️ | ⚠️ | ⚠️ |
SPIKE | ✅ | ✅ | ❌ | ❌ | ❌ |
BRIAN | ✅ | ✅ | ❌ | ❔ | ❌ |
✅ oficiální podpora
⚠️ neoficiální podpora
❌ nepodporováno
❔ možná v budoucnu
Do Briana lze nahrát soubory:
Brian umí pustit libovolný uPython soubor
→ např. hello_world.py
s validní uPython syntaxí + BrianAPI.
print("Ahoj, tady Brian")
Grafické programování pro Briana
Umožňuje:
Typicky: 192.168._._ (viz Brian nastavení)
Realtime :o
Přes Bremote můžete otevřít Brivis v
Synchronizovaném režimu
BriVis se propisuje do Briana v reálném čase.
Obě karty musí zůstat otevřené!
(Doporučuji side-by-side s konzolí)
Libovolné IDE:
Lze si stáhnout balíček python typing:
https://voltavian.com/docs/brian/assets/brian.typing.zip
Rozšíření do VS Code
Dokumentace Briana, primárně Python API
🇨🇿 brian.fel.cvut.cz/cs/introduction.html
🇬🇧 brian.fel.cvut.cz/introduction.html
Dokumentace Briana + nástroje pro aktualizaci a USB debug:
🇬🇧 voltavian.com/docs/brian/fwupdate/
*Firefox nepodporuje komunikaci s USB zařízeními
Vzorové projekty a příklady pro práci s Brianem.
Od prvních programů až po regulace.
Dočasný odkaz
Kostka: LCD + tlačítka + reproduktory
4 Senzorové porty
4 Motorové porty
START / STOP
Okamžité zastavení robota
ZVUK
DISPLAY
BAREVNÁ TLAČÍTKA
Základní buggy-drive robot se světelným senzorem na sledování čáry:
https://www.tinyurl.com/brian-line-follower
Servo motory
tj. DC (stejnosměrný) motor, převodovka a
Enkodér
děrované kolečko
2 svítící LED a 2 fotodiody
enkodér
Source: lastminuteengineers.com
2006
2013
2020
2ot/s
~20Ncm
2ot/s
20Ncm
3ot/s
8Ncm
2ot/s
8Ncm
2ot/s
3.5Ncm
1ot/s
1.8Ncm
2025
Tlačítko – nedetekuje sílu, pouze zmáčknuto/nezmáčknuto (spike detekuje sílu)
Stisk musí být kolmý – jinak nefunguje spolehlivě
Využití:
Měří intenzitu okolního osvětlení.
Umí si rozsvítit přídavnou červenou [nebo RGB] LED diodu.
Využití:
RGB neoficiální verze
Množství odraženého světla závisí na barvě objektu/světla, úhlu, …
Sensor si umí sám nasvítit předměty červenou barvou.
Trik: můžeme se senzorem blikat a porovnávat hodnoty s a bez přisvícení
→ získáme čistě hodnotu přisvícení*
(* zanedbaje nelinearity měření)
Vysílá ultrazvukový signál a čeká na jeho opětovné přijetí.
Z prodlevy mezi vysíláním a příjmem signálu vypočítá vzdálenost.
Citlivý na odrazivost překážky a úhel dopadu!!
Využití:
Source: www.ubuy.vn
Source: www.hackster.io/ioarvanit/measuring-distance-with-sound-353c17
Source: www.hackster.io/ioarvanit/measuring-distance-with-sound-353c17
Source: www.hackster.io/ioarvanit/measuring-distance-with-sound-353c17
Pouze jednoosý rotační akcelerometr.
Dvojitá integrace -> integrační chyby.
Potřebuje pravidelně kalibrovat!
Využití:
Source: https://www.researchgate.net/publication/261417429_Modeling_and_simulation_of_the_MEMS_vibratory_gyroscope
Úlohy pro akademický rok 2025/26:
~ 48 bodů
~ 14 bodů
~ 10 bodů
= 20 bodů
≤ 240 bodů
Délka dráhy ~9m
Body:
Pro běžná kola: 60cm/s ≈ 3,4 otáčky za sekundu
Pro velká kola: 60cm/s ≈ 2,3 otáčky za sekundu
(za předpokladu, že robot nezatáčí)
Až 40 políček (bodů)
Časový limit 90s
Časový limit 60s
Časový limit 90s
Až 240 bodů
Možnost účasti na Robosoutěži
Řízení (regulace) je všude kolem nás…
Řízený systém využívá 1 nebo více regulátorů.
Základním principem regulace je, že se hodnota regulované veličiny měří a porovnává s požadovanou referenční hodnotou, a jejich rozdíl (tak zvaná regulační odchylka) se používá pro ovlivňování soustavy takovým způsobem, aby se regulační odchylka zmenšovala.
Source: cs.wikipedia.org/wiki/Regulace_(technika)
Snažíme se minimalizovat chybu…
Snažíme se minimalizovat chybu…
Nejjednodušší typ regulace - dvoustavová regulace
Nastavujeme pouze
threshold
Bang bang lze využít pouze v situacích, kdy přesnost a bezpečnost nehraje roli.
Source: https://cerpadla.heureka.cz/gude-gs-7502-pl-94641
Regulátor vhodný pro většinu využití. Nejpoužívanější druh regulace.
Proporcionálně
Integračně
Derivační
Regulátor
Nastavuje se pomocí koeficientů \(\textcolor{white}{K_P, K_I, K_D}\), které udávají, jak moc se daná složka regulátoru projevuje.
import brian.sensors as sensors
import brian.motors as motors
color = sensors.EV3.ColorSensorEV3(sensors.SensorPort.S3)
motor_l = motors.EV3LargeMotor(motors.MotorPort.A)
motor_l.wait_until_ready()
motor_r = motors.EV3LargeMotor(motors.MotorPort.B)
motor_r.wait_until_ready()
Kp = 4 # Otestovaná hodnota
WHITE = 80 # Změřené hodnoty
BLACK = 0
target = ( WHITE + BLACK ) / 2
while True:
lightValue = color.reflected_value()
error = lightValue - target
turn = Kp * error
motor_l.run_at_speed(200 + turn)
motor_r.run_at_speed(200 - turn)
Na vstupu a výstupu regulátoru chceme vždy hodnoty ve stejném rozmezí.
Špatná implementace:
Dobrá implementace:
Regulátor PID potřebuje vždy stejné rozmezí vstupů, aby dával stejné výstupy.
(na vstupu musí být vždy stejná data, aby se jeho chování neměnilo)
\(Err = chceme - máme\)
\(\textcolor{magenta}{P} = \textcolor{magenta}{K_P} \times Err\)
\(integrace = integrace + Err \times \delta t\)
\(\textcolor{magenta}{I} = \textcolor{magenta}{K_I} \times integrace\)
\(derivace = (Err - prevErr) / \delta t\)
\(\textcolor{magenta}{D} = \textcolor{magenta}{K_D} \times derivace\)
\(\textcolor{magenta}{out} = \textcolor{magenta}{P + I + D}\)
\(prevErr = Err\)
V uPythonu time.time()
je int!
Lze využít:
Integrační složka může při dlouho trvající chybě (zatáčka) nabývat obřích hodnot.
Anti-windup mechanismy zamezují integrační složce nabýt nebezpečných rozměrů.
Což přidává další parametr do regulátoru.
Výhody:
Nevýhody:
Děkuji za pozornost
Ing. David Pařil