def _change_direction(self): # Check right side. ev3.unregisterEvent(self._is_close_to_object) ev3.set_led(ev3.LED_RED_PULSE) ev3.motor.lego.turn(self.configurator.drive, EV3Drive.TURN_RIGHT, self.speed, self.speed, self.configurator.get_left_motors(), self.configurator.get_right_motors(), True) time.sleep(self.turn_time) self.configurator.drive.stop() if self._is_close_to_object(): # Right side is not good, turn left ev3.motor.lego.turn(self.configurator.drive, EV3Drive.TURN_LEFT, self.speed, self.speed, self.configurator.get_left_motors(), self.configurator.get_right_motors(), True) time.sleep(2 * self.turn_time) self.configurator.drive.stop() if self._is_close_to_object(): # Left is not good, go back. ev3.motor.lego.turn(self.configurator.drive, EV3Drive.TURN_LEFT, self.speed, self.speed, self.configurator.get_left_motors(), self.configurator.get_right_motors(), True) time.sleep(self.turn_time) self.configurator.drive.stop() self.configurator.drive.start(EV3Motor.MOVE_FORWARD, self.speed) ev3.set_led(ev3.LED_GREEN_PULSE) ev3.registerEvent(self._is_close_to_object, self._change_direction)
def start(self): print "Starting 3" if not self.configurator.drive: print "No drive no fun. Quitting." return ev3.set_led(ev3.LED_ORANGE_PULSE) self._register_for_keys()
def setup(self): if not self._is_init: self.drive = EV3Drive([ev3.MOTOR_B, ev3.MOTOR_C]) self.canon = EV3Canon(ev3.MOTOR_A, 3) self.touch_sensor = EV3TouchSensor(ev3.SENSOR_1) self.color_sensor = EV3ColorSensor(ev3.SENSOR_3) self.ir_sensor = EV3IRSensor(ev3.SENSOR_4) self._is_init = True self.ir_sensor.set_proximity_mode() ev3.set_led(ev3.LED_GREEN_PULSE) self.color_sensor.set_reflect_mode()
def _change_direction(self): # Check right side. ev3.unregisterEvent(self._is_close_to_object) ev3.set_led(ev3.LED_RED_PULSE) ev3.motor.lego.turn(self.configurator.drive, EV3Drive.TURN_RIGHT, self.speed, self.speed, self.configurator.get_left_motors(), self.configurator.get_right_motors(), True) time.sleep(self.turn_time) self.configurator.drive.stop() distance_right = self.configurator.ir_sensor.get_distance() if distance_right <= 73: # There is some object in sight. Check left. ev3.motor.lego.turn(self.configurator.drive, EV3Drive.TURN_LEFT, self.speed, self.speed, self.configurator.get_left_motors(), self.configurator.get_right_motors(), True) time.sleep(2 * self.turn_time) self.configurator.drive.stop() distance_left = self.configurator.ir_sensor.get_distance() if distance_left <= self.close_to_object_ir_threshold and distance_right <= self.close_to_object_ir_threshold: # Left is not good. Same right. Go back. ev3.motor.lego.turn(self.configurator.drive, EV3Drive.TURN_LEFT, self.speed, self.speed, self.configurator.get_left_motors(), self.configurator.get_right_motors(), True) time.sleep(self.turn_time) self.configurator.drive.stop() else: if distance_right >= distance_left: # Go right ev3.motor.lego.turn(self.configurator.drive, EV3Drive.TURN_RIGHT, self.speed, self.speed, self.configurator.get_left_motors(), self.configurator.get_right_motors(), True) time.sleep(2 * self.turn_time) # else go left self.configurator.drive.start(EV3Motor.MOVE_FORWARD, self.speed) ev3.set_led(ev3.LED_GREEN_PULSE) ev3.registerEvent(self._is_close_to_object, self._change_direction)
def _arrow_key_pressed(self, key): time.sleep(0.75) # prevents key events spam if key == self._KEY_DOWN and self._mode == self._WAIT_FOR_DIR: # Don't go backwards. return # No spam while handling an event, please. self._unregister_from_keys_no_recovery() if self._mode == self._WAIT_FOR_DIR: self._current_dir = self.key_to_dir(key) print "Go to {0}...".format(self._current_dir) self._current_time = 0 self._mode = self._WAIT_FOR_TIME ev3.set_led(ev3.LED_RED_PULSE) elif key == self._KEY_DOWN: self._current_time = self._current_time + self._TIME_RESOLUTION print "... for {0} secs...".format(self._current_time) # Done. Carry on. self._register_for_keys_no_recovery()
def _enter_key_pressed(self): time.sleep(0.75) # prevents key events spam (make a constant out of this!) if self._mode == self._STARTING: self._mode = self._WAIT_FOR_DIR return if self._mode == self._WAIT_FOR_TIME: # No spam while handling an event, please. self._unregister_from_keys_no_recovery() self._path.append([self._current_dir, self._current_time]) self._current_dir = self._DIR_NONE self._current_time = 0 self._mode = self._WAIT_FOR_DIR ev3.set_led(ev3.LED_ORANGE_PULSE) # Done. Carry on. self._register_for_keys_no_recovery() else: self._unregister_from_keys() self._go()
def _enter_key_pressed(self): time.sleep( 0.75) # prevents key events spam (make a constant out of this!) if self._mode == self._STARTING: self._mode = self._WAIT_FOR_DIR return if self._mode == self._WAIT_FOR_TIME: # No spam while handling an event, please. self._unregister_from_keys_no_recovery() self._path.append([self._current_dir, self._current_time]) self._current_dir = self._DIR_NONE self._current_time = 0 self._mode = self._WAIT_FOR_DIR ev3.set_led(ev3.LED_ORANGE_PULSE) # Done. Carry on. self._register_for_keys_no_recovery() else: self._unregister_from_keys() self._go()
def _go(self): ev3.set_led(ev3.LED_GREEN) ev3.registerEvent(self.configurator.touch_sensor.is_pressed, self.stop) ev3.registerEvent(self._is_close_to_object, self._next_step, True) self._next_step()
def tear_down(self): ev3.set_led(ev3.LED_GREEN)
def get_driver(config): if len(sys.argv) < 2 or sys.argv[1] == "1": print "Variant 1" driver = ModifiedEV3RStormRobotDriver_1(config) elif sys.argv[1] == "2": print "Variant 2" driver = ModifiedEV3RStormRobotDriver_2(config) else: print "Variant 3" driver = ModifiedEV3RStormRobotDriver_3(config) return driver if __name__ == "__main__": ev3.open_all_devices() robot = EV3Robot() robot.setup(get_driver(ModifiedEV3RStormRobotConfig())) ev3.registerEvent(ev3.is_enter_button_pressed, robot.start) print "Ready..." ev3.run() print "Done..." ev3.set_led(ev3.LED_BLACK) ev3.close_all_devices()