Lego Prosjekt 3 Kode

#!/usr/bin/env pybricks-micropython
# Gr. 8 - Innlevering 3
# Importerer nødvendige biblioteker for EV3 robot
from pybricks.hubs import EV3Brick
from pybricks.ev3devices import (Motor, TouchSensor, ColorSensor,
                                 InfraredSensor, UltrasonicSensor, GyroSensor)
from pybricks.parameters import Port, Stop, Direction, Button, Color
from pybricks.tools import wait, StopWatch, DataLog
from pybricks.robotics import DriveBase
from pybricks.media.ev3dev import SoundFile, ImageFile
from time import time, sleep
import random

# Variabler og definisjoner
ev3 = EV3Brick()

# Angir motor egenskaper og forteller om portfordelingen
left_motor = Motor(Port.C)    # Venstre motor på port C
right_motor = Motor(Port.B)   # Høyre motor på port B
cs = ColorSensor(Port.S3)     # Fargesensor på sensor port 3
ds = UltrasonicSensor(Port.S2) # Ultralyd sensor på sensor port 2

# Oppretter robot med hjuldiameter og akselavstand
robot = DriveBase(left_motor, right_motor, wheel_diameter = 56, axle_track = 114)

looped = True                 # Variabel for å kontrollere hovedløkka
previousTime,stopTime = time(),10  # Tidsstyringsvariabler
sounds = [SoundFile.CHEERING, SoundFile.FANFARE, SoundFile.MAGIC_WAND]  # Liste med lydfiler
drive_speed = 100             # Kjørehastighet
proportional_gain = 1.2       # Forsterkning for linjefølging
b,w = 9, 83 # Definerer sort og hvit verdier for sensoren, som lar oss justere etter en grense verdi som den skal forsøke å nå.
th = (b+w)/2 # threshold verdi - grenseverdi mellom sort og hvit 

# Definerer danserutiner med lyd, hastighet og varighet
def dances():
    options = [
        (sounds[0], 100, 1000),   # Jubel, hastighet 100, 1 sekund
        (sounds[1], 150, 1500),   # Fanfare, hastighet 150, 1.5 sekunder
        (None, 120, 2000),        # EV3-Speaker, hastighet 120, 2 sekunder
        (sounds[2], 125, 1500)    # Tryllestav, hastighet 125, 1.5 sekunder
    ]
    return random.choice(options)    # Returnerer tilfeldig dans

# Hovedløkke
while True:
    while looped: # Gir en løkke vi kan stoppe
        # Sjekker om det er en hindring nærmere enn 200mm
        if ds.distance() < 200:
            looped = False                          # Stopper hovedløkka
            robot.stop()                            # Stopper roboten
            ev3.speaker.play_file(sounds[random.randint(0,1)])  # Spiller tilfeldig lyd
            break
        
        ev3.screen.print(ds.distance())            # Viser avstand på skjermen
        deviation = cs.reflection() - th           # Beregner avvik fra grenseverdi
        turn_rate = proportional_gain * deviation  # Beregner svingrate basert på avvik
        robot.drive(drive_speed, turn_rate)        # Kjører roboten med beregnet hastighet og sving

        # Sjekker om det har gått nok tid til å starte dans
        if time() - previousTime >= stopTime:
            looped = False                         # Stopper hovedløkka
            robot.stop()                           # Stopper roboten
            sound, speed, duration = dances()      # Henter tilfeldig dans
            if sound:
                ev3.speaker.play_file(sound)       # Spiller lydfil hvis tilgjengelig
            else:
                ev3.speaker.beep()                 # Spiller beep-lyd hvis ingen lydfil
                robot.drive_time(0, speed, duration)    # Svinger høyre
                robot.drive_time(0, -speed, duration)   # Svinger venstre
            sleep(.5)                              # Kort pause
            robot.drive(drive_speed, turn_rate)    # Fortsetter å kjøre
            looped = True                          # Starter hovedløkka på nytt
            previousTime = time()                  # Nullstiller tidsteller