Programing Bot - Code V3

From RoboWiki
Jump to: navigation, search

Return back to project page: Programming Bot - Fedor Agarshev

Python code for the Programing Bot project:

 
from hub import light_matrix, port, button, light, speaker
import motor,time, color_sensor, motor_pair, force_sensor, distance_sensor, color



speaker_volume = 50
motor_pair.unpair(motor_pair.PAIR_1)
motor_pair.pair(motor_pair.PAIR_1, port.A, port.B)
motorPair = motor_pair.PAIR_1
colorSensor = port.E
motor_pair_speed = 500
forceSensor = port.F
distanceSensor = port.C

def some_button_pressed():
    return button.pressed(button.LEFT) or button.pressed(button.RIGHT)

def show_image(image):
    for y in range(0,len(image)):
        for x in range(0,len(image[y])):
            if image[y][x] == 1:
                light_matrix.set_pixel(x, y, 100)
            else:
                light_matrix.set_pixel(x, y, 0)



class Step_forward:
    def __init__(self):
        image = [[0,0,1,0,0],
                 [0,1,1,1,0],
                 [1,0,1,0,1],
                 [0,0,1,0,0],
                 [0,0,1,0,0]]
        show_image(image)
        self.previous_order = None
        self.next_order = None
        self.distance = 0

    def set_variables(self):
        while not force_sensor.is_pressed(forceSensor):
            pass
        while force_sensor.is_pressed(forceSensor):
            self.distance += 1
            speaker.beep(700, 500,speaker_volume)
            time.sleep_ms(10)

        speaker.beep(600, 500,speaker_volume)
        speaker.beep(670, 500,speaker_volume)
        speaker.beep(600, 500,speaker_volume)


    def set_previous_order(self, previous_order):
        self.previous_order = previous_order

    def set_next_order(self, next_order):
        self.next_order = next_order

    def get_next_order(self):
        return self.next_order

    def execute(self):
        motor_pair.move_for_degrees(motorPair, self.distance, 0, velocity= motor_pair_speed)

class Moving_forward_up_the_wall:
    def __init__(self):
        image = [[1,1,1,1,1],
                [0,0,1,0,0],
                [0,1,1,1,0],
                [1,0,1,0,1],
                [0,0,1,0,0]]
        show_image(image)
        self.previous_order = None
        self.next_order = None

    def set_variables(self):
        pass


    def set_previous_order(self, previous_order):
        self.previous_order = previous_order

    def set_next_order(self, next_order):
        self.next_order = next_order

    def get_next_order(self):
        return self.next_order

    def execute(self):
        motor_pair.move(motorPair,0, velocity= 300)
        while not distance_sensor.distance(distanceSensor) < 110:
            pass
        motor_pair.stop(motorPair)

class Right_forward:
    def __init__(self):
        image = [[0,0,1,0,0],
                [0,0,0,1,0],
                [1,1,1,1,1],
                [0,0,0,1,0],
                [0,0,1,0,0]]
        show_image(image)
        self.previous_order = None
        self.next_order = None
        self.angle = 0

    def set_variables(self):
        while not force_sensor.is_pressed(forceSensor):
            pass
        while force_sensor.is_pressed(forceSensor):
            self.angle += 1
            speaker.beep(700, 500,speaker_volume)
            time.sleep_ms(10)

        speaker.beep(600, 500,speaker_volume)
        speaker.beep(670, 500,speaker_volume)
        speaker.beep(600, 500,speaker_volume)

    def set_previous_order(self, previous_order):
        self.previous_order = previous_order

    def set_next_order(self, next_order):
        self.next_order = next_order

    def get_next_order(self):
        return self.next_order

    def execute(self):
        motor_pair.move_for_degrees(motorPair, self.angle, 100, velocity= motor_pair_speed)

class Left_forward:
    def __init__(self):
        image = [[0,0,1,0,0],
                [0,1,0,0,0],
                [1,1,1,1,1],
                [0,1,0,0,0],
                [0,0,1,0,0]]
        show_image(image)
        self.previous_order = None
        self.next_order = None
        self.angle = 0

    def set_variables(self):
        while not force_sensor.is_pressed(forceSensor):
            pass
        while force_sensor.is_pressed(forceSensor):
            self.angle += 1            
            speaker.beep(700, 500,speaker_volume)
            time.sleep_ms(10)

        speaker.beep(600, 500,speaker_volume)
        speaker.beep(670, 500,speaker_volume)
        speaker.beep(600, 500,speaker_volume)

    def set_previous_order(self, previous_order):
        self.previous_order = previous_order

    def set_next_order(self, next_order):
        self.next_order = next_order

    def get_next_order(self):
        return self.next_order

    def execute(self):
        motor_pair.move_for_degrees(motorPair, self.angle, -100, velocity= motor_pair_speed)


class Game:
    def __init__(self):
        self.count = 0
        self.first_order = None
        self.current_order = None

        #variables for target
        self.target_color = color.RED

    def create_order(self, order):
        while not some_button_pressed():
            pass
        if button.pressed(button.LEFT):
            return
        order.set_variables()
        if self.first_order == None:
            self.first_order = order
            self.current_order = order
        else:
            order.set_previous_order(self.current_order)
            self.current_order.set_next_order(order) #warning here is ok
            self.current_order = order
        self.count += 1

    def check_target(self):
        # Conditions for completing the task
        #    You can change them however you want.
        if color_sensor.color(colorSensor) == self.target_color:
            return True
        return False

    def play(self):
        light_matrix.write(str(self.count))
        while True:
            while color_sensor.color == -1:
                pass
            color1 = color_sensor.color(colorSensor)
            if color1 == color.GREEN:
                self.create_order(Left_forward())
            elif color1 == color.BLUE:
                self.create_order(Right_forward())
            elif color1 == 1:
                self.create_order(Step_forward())
            elif color1 == color.YELLOW:
                self.create_order(Moving_forward_up_the_wall())
            elif color1 == color.RED:
                image = [[0,1,1,0,0],
                        [0,1,1,1,0],
                        [0,1,1,1,1],
                        [0,1,1,1,0],
                        [0,1,1,0,0]]
                show_image(image)
                while not some_button_pressed():
                    pass
                if button.pressed(button.LEFT):
                    pass
                else:
                    while self.first_order != None:
                        self.first_order.execute()
                        self.first_order = self.first_order.get_next_order()
                        self.count -= 1
                        light_matrix.write(str(self.count))
                    if self.check_target():
                        light_matrix.write('Good job')
                        speaker.beep(800, 500,speaker_volume)
                        speaker.beep(870, 500,speaker_volume)
                        speaker.beep(800, 500,speaker_volume)

            light_matrix.write(str(self.count))

game = Game()
game.play()