Robottiohjelmointi – Lego Spike Prime

1. Perustehtävät

Liike

Tehtävä 1. Liikkuminen eteen- ja taaksepäin

Esimerkkikoodi:

from hub import port 
import runloop 
import motor_pair 

async def main(): 
    #alustetaan moottoripari 
    motor_pair.pair(motor_pair.PAIR_1, port.C, port.D) 

    #Ajetaan suoraan  10s asetetulla nopeudella. 
    await motor_pair.move_for_time(motor_pair.PAIR_1, 5000, 0, velocity=500) 

    #Ajetaan suoraan10s asetetulla nopeudella. 
    await motor_pair.move_for_time(motor_pair.PAIR_1, 5000, 0, velocity=-500) 

runloop.run(main()) 

Ratkaisun voi toteuttaa myös palikoita käyttäen seuraavasti:

Tehtävä 2. Kääntyminen

Esimerkkikoodi:

from hub import port 
import runloop 
import motor_pair 

async def main(): 
    # alustetaan moottoripari 
    motor_pair.pair(motor_pair.PAIR_1, port.C, port.D) 

    #käänny oikealle 
    await motor_pair.move_tank_for_degrees(motor_pair.PAIR_1, 180, 1000, 0) 

    #käänny vasemmalle 
    await motor_pair.move_tank_for_degrees(motor_pair.PAIR_1, 180, 0, 1000) 

runloop.run(main()) 

Ratkaisun voi toteuttaa myös palikoita käyttäen seuraavasti:

Tehtävä 3. Liikkuminen + kääntyminen

Esimerkkikoodi:

from hub import port
import runloop
import motor_pair

async def main(): 
    # alustetaan moottoripari 
    motor_pair.pair(motor_pair.PAIR_1, port.C, port.D)

    #suoraan taaksepäin
    await motor_pair.move_for_time(motor_pair.PAIR_1, 5000, 0, velocity=-500)

    #kääntyminen oikealle
    await motor_pair.move_tank_for_degrees(motor_pair.PAIR_1, 180, 0, 1000)

    #suoraan eteenpäin
    await motor_pair.move_for_time(motor_pair.PAIR_1, 5000, 0, velocity=500)

runloop.run(main())

Ratkaisun voi toteuttaa myös palikoita käyttäen seuraavasti:

Anturit

Tehtävä 4. Valomatriisi

Esimerkkikoodi:

from hub import light_matrix

#näyttää Terve!-tekstin robotin valomatriisilla
light_matrix.write("Terve!")

Ratkaisun voi toteuttaa myös palikoita käyttäen seuraavasti:

b) Kuva valomatriisiin. Tulosta robotin valomatriisiin kuva ja vaihda robotin käynnistyspainikkeen väri haluamaksesi.

Esimerkkikoodi:

from hub import light, light_matrix
import color

#Näyttää kirahvin kuvan robotin valomatriisilla
light_matrix.show_image(light_matrix.IMAGE_GIRAFFE)

#Värjää käynnistyspainikkeen violetiksi
light.color(light.POWER, color.PURPLE)

Ratkaisun voi toteuttaa myös palikoita käyttäen seuraavasti:

Tehtävä 5. Väri- ja valosensori

Esimerkkikoodi:

import color_sensor
from hub import port
import color

if color_sensor.color(port.B) == color.YELLOW:
    print("Keltainen havaittu")
Tehtävä 6. Gyroanturi

Esimerkkikoodi:

from hub import port, motion_sensor as ms
import runloop, motor 

moottori1 = port.C
moottori2 = port.D 

async def main():
    ms.reset_yaw(0)
    motor.run(moottori1, 300)
    motor.run(moottori2, 300)
    while ms.tilt_angles()[0] < 850:
        await runloop.sleep_ms(5)
    motor.stop(moottori1)
    motor.stop(moottori2)

    await runloop.sleep_ms(600)

    motor.run(moottori1, -300)
    motor.run(moottori2, -300)
    ms.reset_yaw(0)
    while ms.tilt_angles()[0] > -850:
        await runloop.sleep_ms(5)
    motor.stop(moottori1)
    motor.stop(moottori2)

runloop.run(main())
b) Robotti on tässä tehtävässä oikein päin, kun valomatriisi on kohti kattoa. Kirjoita koodi, joka havaitsee robotin kolmiulotteisen asennon ja näyttää valomatriisilla oikeanlaisen kuvion. Jos robotti on oikein päin, matriisilla näytetään hymiö. Jos se on väärinpäin, näytetään surunaama. Muuten näytetään se suunta, johon robottia olisi käännettävä, jotta se olisi oikein päin. 

Esimerkkikoodi:

from hub import light_matrix, motion_sensor
import orientation, runloop

async def main():
    while True:
        side = motion_sensor.up_face()

        # Oikein päin
        if side == motion_sensor.TOP:
            light_matrix.show_image(light_matrix.IMAGE_HAPPY)

        # Ylösalaisin
        elif side == motion_sensor.BOTTOM:
            light_matrix.show_image(light_matrix.IMAGE_SAD)

        # Kaiutin ylöspäin → käännä taakse
        elif side == motion_sensor.FRONT:
            light_matrix.set_orientation(orientation.DOWN)
            light_matrix.show_image(light_matrix.IMAGE_ARROW_N)

        # USB-portti ylöspäin → käännä eteen 
        elif side == motion_sensor.BACK:
            light_matrix.set_orientation(orientation.UP)
            light_matrix.show_image(light_matrix.IMAGE_ARROW_N)

        # Vasen sivu ylöspäin → käännä oikealle
        elif side == motion_sensor.LEFT:
            light_matrix.set_orientation(orientation.LEFT)
            light_matrix.show_image(light_matrix.IMAGE_ARROW_N) 

        # Oikea sivu ylöspäin → käännä vasemmalle 
        elif side == motion_sensor.RIGHT:
            light_matrix.set_orientation(orientation.RIGHT)
            light_matrix.show_image(light_matrix.IMAGE_ARROW_N)

        await runloop.sleep_ms(100)

runloop.run(main())
Tehtävä 7. Etäisyysanturi

Esimerkkikoodi:

from hub import light_matrix, port
import runloop, distance_sensor as ds, motor, time

moottori1 = port.C
moottori2 = port.D

async def main():
    while True:

        etäisyys = ds.distance(port.A)
        motor.run(moottori1, -600)
        motor.run(moottori2, 600)

        if etäisyys > 200 or etäisyys == -1 or etäisyys is None:
            time.sleep_ms(100)

        else:
            motor.run(moottori1, 600)
            motor.run(moottori2, -600)
            time.sleep_ms(1000)
            motor.stop(moottori1)
            motor.stop(moottori2)
            break

    await light_matrix.write(str(etäisyys))

runloop.run(main())
Tehtävä 8. Voima-anturi

Esimerkkikoodi:

from hub import button, port
import force_sensor
import time

players = 1
min_players = 1
max_players = 5

print("Valitse kilpailijoiden määrä")
print("Oikea = lisää, vasen = aloittaa pelin")
print("Kilpailijoita:", players)

while True:
    if button.pressed(button.RIGHT):
        if players < max_players:
            players += 1
            print("Kilpailijoita:", players)
        time.sleep(0.3)

    if button.pressed(button.LEFT):
        print("\nKISA ALKAA!")
        time.sleep(0.5)
        break

    time.sleep(0.05)

all_results = []

for player in range(1, players + 1):
    print("\nKILPAILIJA", player)
    results = []

    for press in range(1, 4):
        max_force = 0
        print("Painallus", press, ": paina anturia")

        # Odota painalluksen alkua
        while force_sensor.force(port.E) == 0:
            time.sleep(0.01) 

        # Mittaa painalluksen ajan
        while force_sensor.force(port.E) > 0:
            f = force_sensor.force(port.E)
            if f > max_force:
                max_force = f
            time.sleep(0.01)

        results.append(max_force)
        print("→ Tulos:", max_force, "%\n")
        time.sleep(0.5)

    best = max(results)
    all_results.append(best)

    print("Kilpailijan", player, "paras tulos:", best, "%")

# VOITTAJA

print("\nLOPPUTULOKSET")
for i, score in enumerate(all_results):
    print("Kilpailija", i + 1, ":", score, "%")

winner_force = max(all_results)
winner_index = all_results.index(winner_force) + 1

print("\nVOITTAJA")
print("Kilpailija", winner_index, "voitti voimalla", winner_force, "%") 
Tehtävä 9. Ääni

Esimerkkikoodi:

from hub import sound
import time

sound.beep(440, 300, 100)
time.sleep_ms(300)
sound.beep(440, 300, 100)
time.sleep_ms(300)
sound.beep(440, 300, 100)
time.sleep_ms(300)
sound.beep(555, 300, 100)
time.sleep_ms(300)
sound.beep(494, 300, 100)
time.sleep_ms(300)
sound.beep(494, 300, 100)
time.sleep_ms(300)
sound.beep(494, 300, 100)
time.sleep_ms(300)
sound.beep(587, 300, 100)
time.sleep_ms(300)
sound.beep(555, 300, 100)
time.sleep_ms(300)
sound.beep(555, 300, 100)
time.sleep_ms(300)
sound.beep(494, 300, 100)
time.sleep_ms(300)
sound.beep(494, 300, 100)
time.sleep_ms(300)
sound.beep(440, 300, 100)
time.sleep_ms(600)

Ratkaistavissa myös palikoilla:

Tehtävä 10. Painikkeet

Esimerkkikoodi:

from hub import button, port
import motor_pair
import runloop

async def main():
    motor_pair.pair(motor_pair.PAIR_1, port.C, port.D)
     
    while True:
        if button.pressed(button.LEFT):
            motor_pair.move_tank_for_degrees(motor_pair.PAIR_1, 180, 1000, 0)

        elif button.pressed(button.RIGHT):
            motor_pair.move_tank_for_degrees(motor_pair.PAIR_1, 180, 0, 1000)
        await runloop.sleep_ms(10)

runloop.run(main())

Ohjelmoinnin perusominaisuudet

Tehtävä 11. Silmukat

Esimerkkikoodi:

from hub import light_matrix, port, motion_sensor as ms
import runloop, motor

moottori1 = port.C
moottori2 = port.D

async def main():

    for i in range(8):
        print(i)
        ms.reset_yaw(0)

        motor.run(moottori1, 300)
        motor.run(moottori2, 300)

        while ms.tilt_angles()[0] < 700:
            await runloop.sleep_ms(5)
        motor.stop(moottori1)
        motor.stop(moottori2)

        print(i)

        motor.run(moottori1, -500)
        motor.run(moottori2, 500)
        await runloop.sleep_ms(500)

        motor.stop(moottori1)
        motor.stop(moottori2)

    await light_matrix.write("Ympäri")

runloop.run(main())

Tehtävä 12. Ehdot

Esimerkkikoodi:

from hub import port, light_matrix, light
import color_sensor
import color

while True:
    if color_sensor.color(port.F) == color.RED:
        light_matrix.write("PUNAINEN")
        light.color(light.POWER, color.RED)
    elif color_sensor.color(port.F) == color.GREEN:
        light_matrix.write("VIHREÄ")
        light.color(light.POWER, color.GREEN)
    elif color_sensor.color(port.F) == color.BLUE:
        light_matrix.write("SININEN")
        light.color(light.POWER, color.BLUE)
    elif color_sensor.color(port.F) == color.MAGENTA:
        light_matrix.write("MAGENTA")
        light.color(light.POWER, color.MAGENTA)
    elif color_sensor.color(port.F) == color.YELLOW:
        light_matrix.write("KELTAINEN")
        light.color(light.POWER, color.YELLOW)
    elif color_sensor.color(port.F) == color.ORANGE:
        light_matrix.write("ORANSSI")
        light.color(light.POWER, color.ORANGE)
    elif color_sensor.color(port.F) == color.AZURE:
        light_matrix.write("TAIVAANSININEN")
        light.color(light.POWER, color.AZURE)
    elif color_sensor.color(port.F) == color.BLACK:
        light_matrix.write("MUSTA")
        light.color(light.POWER, color.BLACK)
    elif color_sensor.color(port.F) == color.WHITE:
        light_matrix.write("VALKOINEN")
        light.color(light.POWER, color.WHITE)
    else:
        pass
Tehtävä 13. Muuttujat

Esimerkkikoodi:

from hub import light_matrix as lm
import runloop

async def main():
    for i in range(1,11):
        await runloop.sleep_ms(1000)
        lm.write(str(i))

runloop.run(main())
Tehtävä 14. Yhdistelmä

Esimerkkikoodi:

from hub import light_matrix, port
import runloop, motor_pair

motor_pair.pair(motor_pair.PAIR_1, port.C, port.D)

async def main():
    var1 = 1
    var2 = 4
    while var1 < var2:
        var2 -= 1
        await light_matrix.write("M")
        motor_pair.move(motor_pair.PAIR_1, 0, velocity=500)
        await runloop.sleep_ms(1000)

    motor_pair.stop(motor_pair.PAIR_1)
    await light_matrix.write("S")

runloop.run(main())
Tehtävä 15. Funktiot

Esimerkkikoodi:

from hub import port, motion_sensor as ms
import runloop, motor

moottori1 = port.C
moottori2 = port.D

async def suorita_siksakki(matka, käännös):

    motor.run(moottori1, -500)
    motor.run(moottori2, 500)

    await runloop.sleep_ms(matka)

    ms.reset_yaw(0)

    motor.run(moottori1, 300)
    motor.run(moottori2, 300)

    while ms.tilt_angles()[0] < käännös:
        await runloop.sleep_ms(5)
    motor.stop(moottori1)
    motor.stop(moottori2)

    motor.run(moottori1, -500)
    motor.run(moottori2, 500)

    await runloop.sleep_ms(matka)

    ms.reset_yaw(0)

    motor.run(moottori1, -300)
    motor.run(moottori2, -300)

    while ms.tilt_angles()[0] > -käännös:
        await runloop.sleep_ms(5)

    motor.stop(moottori1)
    motor.stop(moottori2)

async def main():

    for i in range(3):
        await suorita_siksakki(500, 700)

runloop.run(main())
Tehtävä 16. Ajastus

Esimerkkikoodi:

from hub import port, sound
import motor_pair
import runloop
import time

async def main():
    motor_pair.pair(motor_pair.PAIR_1, port.C, port.D)
    time.sleep_ms(5000)
    motor_pair.move_tank_for_time(motor_pair.PAIR_1, 5000, 5000, 5000)
    time.sleep_ms(5000)
    motor_pair.move_tank_for_time(motor_pair.PAIR_1, 5000, -5000, 5000)
    time.sleep_ms(5000)
    sound.beep(500, 5000, 100)

runloop.run(main())

Voi luoda vastaavan myös ohjelmointipalikoita käyttäen.

2. Lopputyö

Jos etäisyysanturi ei havaitse mitään, se palauttaa arvon -1. Projektitehtäviin on sallittua lisätä omia parannuksia, kuten arvojen tulostamista komentokehotteeseen sekä aloitus- ja lopetusehtoja, kunhan kaikki vaaditut asiat toteutuvat. Koodiin on suositeltavaa lisätä omia selittäviä kommentteja #-merkillä. Pidä robotin nopeudet aluksi matalina ja nosta niitä vasta siinä vaiheessa, kun koodi toimii luotettavasti. Jos akku on vähissä, robotti toimii huonommin. Liian alhainen nopeus voi kuitenkin tehdä robotista tarpeettoman hitaan ja aiheuttaa toiminnallisia ongelmia.

Projektitehtävien tulee toimia vaadittavien ominaisuuksien mukaisesti. Robotin ei tarvitse toimia täysin virheettömästi, kunhan sen toiminta on pääosin samankaltainen kuin mallivideolla. Lopullisen koodin tulee ymmärtää riveittäin ja osata selittää, mitä kukin koodirivi tekee.