#!/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