Práce s knihovnou
Knihovna gyarab_mindstorms obsahuje funkce, které ulehčují programování robota. V téhle části se dozvíte o každé funkci a o tom, jak se používají.
Pohyb
forward(duration, speed, stop)- pohyb vpředbackward(duration, speed, stop)- pohyb vzadrotate_left(angle, speed)- přesná otočka vlevo na místě (s korekcí úhlu)rotate_right(angle, speed)- přesná otočka vpravo na místě (s korekcí úhlu)turn_left(angle, radius, speed, stop)- zatáčka vlevoturn_right(angle, radius, speed, stop)- zatáčka vpravo
Tip
Všechny příklady z této kapitoly jsou nahrané v robotovi v adresáři gyarab_mindstorms_examples. Spouští se tak, jak bylo popsáno v předchozí kapitole.
forward, backward
Posouvá robota dopředu/dozadu po danou dobu danou rychlostí.
Argumenty
duration- jak dlouho se má robot pohybovat v milisekundáchspeed(nepovinný) - rychlost, jakou se má robot pohybovat, hodnota od 1 do 1000, v základu 500stop(nepovinný) - viz Pohyb bez zastavení
Příklad (move_forward_backward.py)
#!/usr/bin/env pybricks-micropython
from gyarab_mindstorms import backward, forward, wait
# go forward for 1.5 seconds at default speed
forward(1500)
wait(1000) # wait for 1 second
# go backward for 1.5 seconds at default speed (return to start)
backward(1500)
wait(1000) # wait for 1 second
# go forward for half a second at max speed
forward(500, 1000)
wait(1000) # wait for 1 second
# go backward for 3 seconds slowly
backward(3000, 100)
Tip
Pro jízdu po trati pravděpodobně budete potřebovat příkazy jako: "Jeď rovně 30cm" ale tahle knihovna obsahuje jenom funkci pro pohyb po nějakou dobu nějakou rychlostí. Jak tedy na to? Může se hodit vyzkoušet různé varianty duration a speed a změřit, jakou vzdálenost robot urazil.
rotate_left, rotate_right
Robot se otáčí na místě do leva/do prava o daný úhel
Argumenty
angle- úhel, o jaký se má robot otočit ve stupníchspeed(nepovinný) - rychlost, jakou se má robot otáčet, hodnota od 1 do 1000, v základu 300
Příklad (move_rotate.py)
Robot se nejdříve otočí doprava o 180° a zase zpátky. Potom se otočí do prava o 120° a do leva o 30°. Celkově by tedy měl skončit otočený do prava o 90° oproti původní pozici.
#!/usr/bin/env pybricks-micropython
from gyarab_mindstorms import rotate_left, rotate_right, wait
# rotate right by 180 degrees at default speed
rotate_right(180)
wait(1000) # wait for 1 second
# rotate left by 180 degrees at default speed
rotate_left(180)
wait(1000) # wait for 1 second
# fast rotate right by 120 degrees
rotate_right(120, speed=1000)
wait(1000) # wait for 1 second
# slowly rotate left by 30 degrees
rotate_left(30, speed=50)
wait(1000) # wait for 1 second
Poznámka
Robot má tendenci otočku trochu "přestřelit", při malé rychlosti to není znatelné ale u vyšších už ano. Jednotlivé odchylky se navíc mohou sčítat, takže čím víckrát se bude robot otáčet, tím větší bude celková odchylka. Je tedy docela užitečné zkontrolovat o kolik stupňů se robot opravdu otočil.
turn_left, turn_right
turn_left(angle, radius, speed, stop), turn_right(angle, radius, speed, stop)
Robot zatáčí do leva/do prava.
Argumenty
angle- úhel, o jaký se má robot otočit ve stupníchradius- přibližný poloměr zatáčky, v milimetrech, měřeno od středu vnějšího kolaspeed(nepovinný) - rychlost vnějšího kola, hodnota od 1 do 1000, v základu 500stop(nepovinný) - viz Pohyb bez zastavení
Příklad (move_turn.py)
Robot jede ve tvaru osmičky.
#!/usr/bin/env pybricks-micropython
from gyarab_mindstorms import (
forward,
turn_left,
turn_right,
)
forward(2000)
turn_right(270, 300) # turn right by 270 degrees with a turning radius of 300mm
forward(2000)
turn_left(270, 300) # turn left by 270 degrees with a turning radius of 300mm
Note
Korekce směru robota při pohybu závisí na datech z gyroskopu. Občas se stane, že gyroskop vrací špaté hodnoty. Pokud si všimnete, že je otáčení robota nepřesné, zkuste ho restartovat.
Pohyb bez zastavení
Pokud jste si zkoušeli předchozí příklady, určitě jste si všimli, že robot se pohybuje "trhaně". Například pokud chceme aby jel rovně a pak zatočil, robot pojede rovně, zastaví a pak se znovu rozjede do zatáčky. To stojí nějaký čas. Jak zařídit, aby robot jezdil plynule?
U funkcí forward, backward, turn_left a turn_right k tomu slouží boolean argument stop. Ukážeme si to na funkci forward, u ostatních to ale funguje úplně stejně.
Když zavoláme funkci forward takhle:
Důležité!
Pokud používáte tyto funkce se stop=False, musíte za poslední takovou funkcí zavolat funkci stop(), jinak se robot nezastaví.
Příklad (move_turn_no_stop.py)
Robot projede dráhu ve tvaru osmičky bez zastavování mezi jednotlivými příkazy.
#!/usr/bin/env pybricks-micropython
from gyarab_mindstorms import forward, stop, turn_left, turn_right
forward(2000, stop=False)
turn_right(
270, 300, stop=False
) # turn right by 270 degrees with a turning radius of 300mm
forward(2000, stop=False)
turn_left(
270, 300, stop=False
) # turn left by 270 degrees with a turning radius of 300mm
stop() # IMPORTANT!!! - robot will not stop without this
← Předchozí: Nahrávání a spouštění programů
Pomocné funkce
display_print(message)beep()wait_for_button()
display_print()
Vypisuje zprávu na displej robota.
Argumenty
message - zpráva, která má být vypsána na display
Příklad (misc_display_print.py)
#!/usr/bin/env pybricks-micropython
from gyarab_mindstorms import display_print, wait
display_print("Hello, world!")
# Wait for 1 second
wait(1000)
beep()
Přehraje krátký tón.
Příklad (misc_beep.py)
wait_for_button()
Zastaví program a čeká na zmáčknutí prostředního tlačítka. Tuhle funkci se hodí zavolat v případě, že nechcete, aby se robot začal pohybovat ihned po spuštění programu.
Příklad (misc_wait_for_button.py)
Robot čeká na zmáčknutí tlačítka a pak jede dopředu.
#!/usr/bin/env pybricks-micropython
from gyarab_mindstorms import backward, forward, wait, wait_for_button
wait_for_button()
forward(1500)
Senzory
get_color()get_distance()get_gyro()
get_color()
Vrací data z senzoru barev.
Návratová hodnota
Funkce vrací následující barvy, případně None pokud není detekována žádná barva.
Color.BLACKColor.BLUEColor.GREENColor.YELLOWColor.REDColor.WHITEColor.BROWNNone
Příklad (sensor_color.py)
Program, který pořád čte barvu ze senzoru a určuje, jestli barva, kterou senzor vidí, je červená.
#!/usr/bin/env pybricks-micropython
from gyarab_mindstorms import Color, display_print, get_color, wait
while True:
# Get the color from the color sensor
color = get_color()
# Print error if no color was detected
if not color:
display_print("No color found")
continue
# Determine whether the color is red
if color == Color.RED:
display_print("Red")
else:
display_print("Not red")
# Wait for 100 milliseconds
wait(100)
get_distance()
Vrací vzdálenost od překážky podle ultrazvukového senzoru.
Návratová hodnota
vzdálenost v milimetrech
Příklad (sensor_distance.py)
Program čte vzdálenost z ultrazvukového senzoru a vypisuje ji na displej.
#!/usr/bin/env pybricks-micropython
from gyarab_mindstorms import display_print, get_distance, wait
while True:
# Get the distance from the ultrasonic sensor
distance = get_distance()
# Print the distance to the display
display_print(distance)
# Wait for 100 milliseconds
wait(100)
get_gyro()
Vrací aktuální orientaci robota podle gyroskopu.
Návratová hodnota
Vrací úhel robota oproti startu programu. Hodnota je od 0 do 359 stupňů, úhel roste ve směru hodinových ručiček, tzn.
- robot míří stejným směrem jako při spuštění => 0
- robot se otočil o 90° do prava => 90
- robot se otočil o 90° do leva => 270
Příklad (sensor_gyro.py)
Program čte úhel z gyroskopu a vypisuje jej na displej.
#!/usr/bin/env pybricks-micropython
from gyarab_mindstorms import display_print, get_gyro, wait
while True:
# Get the angle from the gyro sensor
angle = get_gyro()
# Print the angle to the display
display_print(angle)
# Wait for 100 milliseconds
wait(100)
Další příklady
Kružnice (move_circle.py)
Robot opisuje kružnici. Změnou proměnné radius můžete měnit poloměr kružnice.
Čtverec (move_square.py)
Robot jede ve tvaru čtverce. Délku strany čtverce závisí na tom, jak dlouho jede robot rovně mezi zatáčením.
from gyarab_mindstorms import forward, rotate_left
forward_duration = 2000 # in milliseconds
forward(forward_duration)
rotate_left(90, 100)
forward(forward_duration)
rotate_left(90, 100)
forward(forward_duration)
rotate_left(90, 100)
forward(forward_duration)
rotate_left(90, 100)
Slalom (move_zig_zag.py)
Robot jede ve slalom - střídavě zatačí doleva a doprava, každou zatáčkou objede půlkružnici.