Mbot2 Line Follower Code May 2026

def follow_line(self, duration=None): """ Main line following loop Args: duration: Time to follow line in seconds (None = run until stopped) """ print("Starting line follower...") print("Press Ctrl+C to stop") try: running = True start_time = time.time() while running: # Check duration if duration and (time.time() - start_time) >= duration: print(f"Completed duration seconds of line following") break # Read sensors sensors = self.read_line_sensors() position = self.calculate_line_position(sensors) # Calculate time delta for PID current_time = time.time() dt = current_time - self.last_time self.last_time = current_time if position is not None: # Line detected - follow it self.line_lost_timer = 0 # Calculate error (0 = center) error = position # Get PID output turn_speed = self.pid_control(error, dt) # Dynamic speed adjustment based on how centered we are # Slower on turns, faster on straight lines speed_factor = 1.0 - (abs(error) * 0.2) current_base_speed = max(self.MIN_SPEED, self.BASE_SPEED * speed_factor) # Set motor speeds self.set_motor_speeds(current_base_speed, turn_speed) # Debug output print(f"Pos: position:+.2f | Turn: turn_speed:+5.1f | " f"Speed: current_base_speed:5.1f | Sensors: sensors") else: # No line detected - handle line loss self.line_lost_timer += dt if self.line_lost_timer > self.EMERGENCY_STOP_TIME: print("Line lost for too long!") self.stop() if self.search_for_line(): # Reset PID state after finding line self.reset_pid() continue else: print("Cannot find line. Stopping.") break else: # Short line loss - just stop and wait self.stop() print("Waiting for line...") # Small delay to prevent overwhelming the system time.sleep(0.02) except KeyboardInterrupt: print("\nStopped by user") finally: self.stop()

def reset_pid(self): """Reset PID controller state""" self.integral = 0 self.previous_error = 0 self.last_time = time.time() mbot2 line follower code

def search_for_line(self): """ When line is lost, search by rotating slowly Returns: True if line found, False if search timeout """ print("Line lost! Searching...") search_start = time.time() search_duration = 3 # Maximum search time (seconds) while time.time() - search_start < search_duration: sensors = self.read_line_sensors() position = self.calculate_line_position(sensors) if position is not None: print("Line found!") return True # Rotate slowly to search self.bot.set_left_motor_speed(self.MIN_SPEED) self.bot.set_right_motor_speed(-self.MIN_SPEED) time.sleep(0.05) print("Line search failed!") return False mbot2 line follower code

choice = input("\nSelect option: ").strip() mbot2 line follower code