Refactor main.cpp to adjust ball detection threshold, clean up commented code, and add IR seeker test functionality

This commit is contained in:
Andrea Moro 2025-03-07 10:26:28 +01:00
parent 5d0a067fba
commit 76f1105a8f

View file

@ -1,7 +1,7 @@
#include <Arduino.h> #include <Arduino.h>
#include <Wire.h> #include <Wire.h>
#include "Adafruit_BNO08x_RVC.h" #include "Adafruit_BNO08x_RVC.h"
// #include <PixyI2C.h> // Commented out #include <PixyI2C.h> // Commented out
#include "Ultrasonic.h" // Commented out #include "Ultrasonic.h" // Commented out
#include "OmniWheelMotors.hpp" #include "OmniWheelMotors.hpp"
#include "DisplayLib.hpp" #include "DisplayLib.hpp"
@ -9,7 +9,7 @@
// Constants // Constants
#define MOTOR_SPEED 120 #define MOTOR_SPEED 120
#define ROTATION_ADJUSTMENT_SPEED 55 #define ROTATION_ADJUSTMENT_SPEED 55
#define SIGNAL_CLOSE_THRESHOLD 50 // Threshold for considering ball close (0 is closest, 255 is farthest) #define SIGNAL_CLOSE_THRESHOLD 30 // Threshold for considering ball close (0 is closest, 255 is farthest)
#define SIGNAL_TIMEOUT 5000 // Time in ms to consider ball lost if no detection #define SIGNAL_TIMEOUT 5000 // Time in ms to consider ball lost if no detection
// Pin definitions for the motors // Pin definitions for the motors
@ -21,11 +21,11 @@
#define MOTOR3_L_PWM 11 #define MOTOR3_L_PWM 11
// Sensor objects // Sensor objects
// PixyI2C pixy; // Commented out PixyI2C pixy;
Adafruit_BNO08x_RVC rvc = Adafruit_BNO08x_RVC(); Adafruit_BNO08x_RVC rvc = Adafruit_BNO08x_RVC();
Ultrasonic uSensor1 = Ultrasonic(7); Ultrasonic uSensor1 = Ultrasonic(7);
// Ultrasonic uSensor2 = Ultrasonic(10); // Commented out Ultrasonic uSensor2 = Ultrasonic(10); // Commented out
// Ultrasonic uSensor3 = Ultrasonic(9); // Commented out Ultrasonic uSensor3 = Ultrasonic(9); // Commented out
// Motor control object // Motor control object
OmniWheelMotors motors(MOTOR1_R_PWM, MOTOR1_L_PWM, OmniWheelMotors motors(MOTOR1_R_PWM, MOTOR1_L_PWM,
@ -50,7 +50,7 @@ void setup()
delay(10); delay(10);
Serial.println("ElBestia Robot Starting..."); Serial.println("ElBestia Robot Starting...");
// Initialize display // Initialize display
display.initDisplay(); display.initDisplay();
display.welcomeScreen(); display.welcomeScreen();
@ -71,15 +71,9 @@ void setup()
// Initialize motors // Initialize motors
motors.begin(); motors.begin();
motors.setSpeedLimits(150, 255); // Set min and max speeds motors.setSpeedLimits(150, 255); // Set min and max speeds
motors.setRotationTime(2000); // Set time for full rotation (2 seconds = 360°) motors.setRotationTime(2000); // Set time for full rotation (2 seconds = 360°)
Serial.println("Motors initialized"); Serial.println("Motors initialized");
// Brief motor test
motors.moveForward(MOTOR_SPEED);
delay(500);
motors.stop();
delay(200);
// Manual motor test // Manual motor test
analogWrite(MOTOR1_R_PWM, MOTOR_SPEED); analogWrite(MOTOR1_R_PWM, MOTOR_SPEED);
delay(500); delay(500);
@ -105,6 +99,27 @@ void setup()
delay(500); delay(500);
analogWrite(MOTOR3_L_PWM, 0); analogWrite(MOTOR3_L_PWM, 0);
// Test the IR Seeker
Wire.requestFrom(0x10 / 2, 2);
if (Wire.available())
{
int sensorNum = Wire.read();
int strength = Wire.read();
Serial.print("IR Seeker - Sensor: ");
Serial.print(sensorNum);
Serial.print(", Strength: ");
Serial.println(strength);
}
else
{
Serial.println("IR Seeker not found");
Serial.println("Stopping robot...");
display.clearDisplay();
display.displayMessage("IR Seeker not found");
display.displayError("Stopping robot...");
stop();
}
Serial.println("Initialization complete. Waiting for commands..."); Serial.println("Initialization complete. Waiting for commands...");
// wait for 'start' command from serial // wait for 'start' command from serial
@ -280,7 +295,7 @@ void searchForBall()
static int searchDirection = 1; // 1 for clockwise, -1 for counter-clockwise static int searchDirection = 1; // 1 for clockwise, -1 for counter-clockwise
static unsigned long lastSearchChange = 0; static unsigned long lastSearchChange = 0;
static int searchPhase = 0; // 0-3: increases search area over time static int searchPhase = 0; // 0-3: increases search area over time
Serial.println("Searching for ball..."); Serial.println("Searching for ball...");
display.clearDisplay(); display.clearDisplay();
display.printMessage("Searching for ball", 0, 10); display.printMessage("Searching for ball", 0, 10);
@ -291,19 +306,21 @@ void searchForBall()
{ {
Serial.print("Searching in last known direction: Sensor "); Serial.print("Searching in last known direction: Sensor ");
Serial.println(lastBallSensor); Serial.println(lastBallSensor);
// Use the last known direction to guide search // Use the last known direction to guide search
moveBasedOnSensor(lastBallSensor, 200); // Use medium strength value moveBasedOnSensor(lastBallSensor, 200); // Use medium strength value
delay(300); // Move briefly in that direction delay(300); // Move briefly in that direction
motors.stop(); motors.stop();
// Check for ball after moving // Check for ball after moving
Wire.requestFrom(0x10 / 2, 2); Wire.requestFrom(0x10 / 2, 2);
if (Wire.available() >= 2) { if (Wire.available() >= 2)
{
int sensorNum = Wire.read(); int sensorNum = Wire.read();
int strength = Wire.read(); int strength = Wire.read();
if (sensorNum >= 1 && sensorNum <= 12) { if (sensorNum >= 1 && sensorNum <= 12)
{
// Ball found! Update tracking info // Ball found! Update tracking info
lastBallSensor = sensorNum; lastBallSensor = sensorNum;
lastBallStrength = strength; lastBallStrength = strength;
@ -313,41 +330,44 @@ void searchForBall()
} }
} }
} }
// Systematic search pattern // Systematic search pattern
// Change direction periodically to avoid getting stuck // Change direction periodically to avoid getting stuck
if (millis() - lastSearchChange > 5000) { if (millis() - lastSearchChange > 5000)
searchDirection *= -1; // Reverse direction {
searchDirection *= -1; // Reverse direction
searchPhase = (searchPhase + 1) % 4; // Cycle through search phases searchPhase = (searchPhase + 1) % 4; // Cycle through search phases
lastSearchChange = millis(); lastSearchChange = millis();
} }
motors.rotate360(); motors.rotate360();
// Short rotation then check // Short rotation then check
delay(100); delay(100);
motors.stop(); motors.stop();
// Poll for ball after rotation // Poll for ball after rotation
Wire.requestFrom(0x10 / 2, 2); Wire.requestFrom(0x10 / 2, 2);
if (Wire.available() >= 2) { if (Wire.available() >= 2)
{
int sensorNum = Wire.read(); int sensorNum = Wire.read();
int strength = Wire.read(); int strength = Wire.read();
if (sensorNum >= 1 && sensorNum <= 12) { if (sensorNum >= 1 && sensorNum <= 12)
{
// Ball found! Update tracking info // Ball found! Update tracking info
lastBallSensor = sensorNum; lastBallSensor = sensorNum;
lastBallStrength = strength; lastBallStrength = strength;
lastBallDetectionTime = millis(); lastBallDetectionTime = millis();
ballLost = false; ballLost = false;
Serial.print("Ball found at sensor "); Serial.print("Ball found at sensor ");
Serial.print(sensorNum); Serial.print(sensorNum);
Serial.print(" with strength "); Serial.print(" with strength ");
Serial.println(strength); Serial.println(strength);
} }
} }
// Small delay before next search increment // Small delay before next search increment
delay(100); delay(100);
} }
@ -367,7 +387,9 @@ void loop()
robotActive = false; robotActive = false;
motors.stop(); motors.stop();
Serial.println("Robot stopped! Send 'start' to resume"); Serial.println("Robot stopped! Send 'start' to resume");
} else if (command.equalsIgnoreCase("test")) { }
else if (command.equalsIgnoreCase("test"))
{
motors.moveForward(100); motors.moveForward(100);
delay(1000); delay(1000);
motors.moveBackward(100); motors.moveBackward(100);
@ -380,7 +402,7 @@ void loop()
delay(1000); delay(1000);
motors.rotateToAngle(-90); motors.rotateToAngle(-90);
delay(1000); delay(1000);
motors.stop(); motors.stop();
} }
else if (command.equalsIgnoreCase("start") && !robotActive) else if (command.equalsIgnoreCase("start") && !robotActive)
{ {
@ -410,7 +432,7 @@ void loop()
} }
long RangeInCentimeters; long RangeInCentimeters;
RangeInCentimeters = uSensor1.MeasureInCentimeters(); // two measurements should keep an interval RangeInCentimeters = uSensor1.MeasureInCentimeters(); // two measurements should keep an interval
Serial.print(RangeInCentimeters);//0~400cm Serial.print(RangeInCentimeters); // 0~400cm
Serial.println(" cm"); Serial.println(" cm");
// Ball tracking or searching // Ball tracking or searching
@ -431,4 +453,10 @@ void loop()
// Small delay to stabilize readings // Small delay to stabilize readings
delay(50); delay(50);
} }
// Very bad way to stop but the only way to stop the robot
void stop()
{
while (1);
}