IntroRoboticsLab2/autonom/autonom.ino

100 lines
3.2 KiB
C++

#include "Arduino.h"
#include "Wire.h"
#include "MeMCore.h"
MeGyro gyro(PORT_1); // Initialize the gyro sensor on port 1
MeDCMotor _leftMotor(9);
MeDCMotor _rightMotor(10);
// Define constants
const int targetSpeed = 50; // Speed for translation movements
const int wheelDistanceBetweenWheels = 11; // Distance between the wheels in centimeters
const int wheelRadius = 3; // Radius of the wheels in centimeters
// Function to calculate wheel speeds based on translational and rotational speeds
void calculateWheelSpeeds(float v, float theta_dot, float &vL, float &vR) {
vL = v/wheelRadius - (wheelDistanceBetweenWheels*theta_dot)/wheelRadius*2;
vR = v/wheelRadius + (wheelDistanceBetweenWheels*theta_dot)/wheelRadius*2;
}
// Function to perform rotation movement
void rotate(float targetAngle, float v) {
const float KP = 0.5; // Proportional control gain
const float MIN_SPEED = 10; // Minimum rotation speed
float currentAngle;
float error;
float rotationSpeed;
do {
// Get current angle
gyro.update();
currentAngle = gyro.getAngleZ();
Serial.print("Current angle :");
Serial.print(currentAngle);
Serial.print(" Objective :");
Serial.println(targetAngle);
// Calculate error
error = targetAngle - currentAngle;
while (error > 180) error -= 360;
while (error < -180) error += 360;
// Calculate rotation speed using proportional control
rotationSpeed = KP * error;
// Constrain rotation speed to ensure it doesn't exceed the minimum speed
rotationSpeed = constrain(rotationSpeed, -MIN_SPEED, MIN_SPEED);
// Calculate wheel speeds based on rotation speed
float vL, vR;
calculateWheelSpeeds(v, rotationSpeed, vL, vR);
// Apply speeds to motors
_leftMotor.run(-vL);
_rightMotor.run(vR);
} while (abs(error) > 5); // Continue rotation until error is within acceptable threshold
}
// Function to perform translation movement
void translate(float distance) {
// Calculate time required to travel given distance at target speed
float time = distance / targetSpeed;
_leftMotor.run(-targetSpeed);
_rightMotor.run(targetSpeed);
Serial.print("Time calculated for next segment : ");
Serial.println(time*1000);
delay(time * 1000); // Convert time to milliseconds
}
void setup() {
Serial.begin(9600); // Initialize serial communication
gyro.begin(); // Initialize the gyro sensor
_leftMotor.run(0);
_rightMotor.run(0);
}
void loop() {
// Array containing the 2D positions of the 4 corners of the square
float targetPoints[4][2] = {{0, 0}, {10, 0}, {10, 10}, {0, 10}};
for (int i = 0; i < 4; i++) {
float targetX = targetPoints[i][0];
float targetY = targetPoints[i][1];
// Calculate rotation angle towards target point
float currentX = 0; // Assume starting from origin
float currentY = 0; // Assume starting from origin
float targetAngle = atan2(targetY - currentY, targetX - currentX) * 180 / PI;
// Perform rotation towards target point
rotate(targetAngle, targetSpeed);
// Calculate distance to target point
float distance = sqrt(pow(targetX - currentX, 2) + pow(targetY - currentY, 2));
// Perform translation towards target point
translate(distance);
}
}