Untitled

 avatar
unknown
plain_text
21 days ago
3.0 kB
2
Indexable
#include <QTRSensors.h>

// Configuratie senzori QTR-8
#define NUM_SENSORS 8
#define EMITTER_PIN 2 // Define your emitter pin
QTRSensorsAnalog qtr((unsigned char[]){32, 33, 34, 35, 36, 39, 25, 26}, NUM_SENSORS, EMITTER_PIN);

// Pini control motor cu driver DRV
#define MOTOR_LEFT_PWM 32
#define MOTOR_LEFT_DIR 33
#define MOTOR_RIGHT_PWM 22
#define MOTOR_RIGHT_DIR 23

// Constante PID pentru linie
float Kp_line = 1.2;  
float Ki_line = 0.0;  
float Kd_line = 0.8;  

int baseSpeed = 200; // Viteza de baza a motoarelor
int maxSpeed = 255;  // Viteza maxima a motoarelor

// Variabile pentru functionarea PID (urmarire linie)
float error_line = 0, lastError_line = 0, integral_line = 0, derivative_line = 0;
unsigned int position = 0;

void setup() {
  Serial.begin(115200);

  // Initializare senzori QTR-8
  qtr.setTypeAnalog();
  qtr.setSensorPins((unsigned char[]){32, 33, 34, 35, 36, 39, 25, 26}, NUM_SENSORS);
  qtr.setEmitterPin(EMITTER_PIN);

  // Stare pini motor
  pinMode(MOTOR_LEFT_PWM, OUTPUT);
  pinMode(MOTOR_LEFT_DIR, OUTPUT);
  pinMode(MOTOR_RIGHT_PWM, OUTPUT);
  pinMode(MOTOR_RIGHT_DIR, OUTPUT);

  // Calibrare senzori
  calibrateSensors();
}

void loop() {
  followLine();
}

/////////////////FUNCTIA DE URMARIRE A LINIEI//////////////////////

void followLine() {
  unsigned int sensorValues[NUM_SENSORS];
  position = qtr.readLine(sensorValues);

  error_line = position - 3500; 
  integral_line += error_line;
  derivative_line = error_line - lastError_line;

  int motorSpeedAdjustment = Kp_line * error_line + Ki_line * integral_line + Kd_line * derivative_line;

  int leftMotorSpeed = baseSpeed - motorSpeedAdjustment;
  int rightMotorSpeed = baseSpeed + motorSpeedAdjustment;

  setMotorSpeed(leftMotorSpeed, rightMotorSpeed);
  lastError_line = error_line;
}

/////////////////FUNCTIA DE SETARE A VITEZEI MOTORULUI//////////////////////

void setMotorSpeed(int leftSpeed, int rightSpeed) {
  // Constrangem vitezele in limitele specificate
  leftSpeed = constrain(leftSpeed, -maxSpeed, maxSpeed);
  rightSpeed = constrain(rightSpeed, -maxSpeed, maxSpeed);

  // Setare motor stanga
  if (leftSpeed >= 0) {
    digitalWrite(MOTOR_LEFT_DIR, HIGH);
    analogWrite(MOTOR_LEFT_PWM, leftSpeed);
  } else {
    digitalWrite(MOTOR_LEFT_DIR, LOW);
    analogWrite(MOTOR_LEFT_PWM, -leftSpeed);
  }

  // Setare motor dreapta
  if (rightSpeed >= 0) {
    digitalWrite(MOTOR_RIGHT_DIR, HIGH);
    analogWrite(MOTOR_RIGHT_PWM, rightSpeed);
  } else {
    digitalWrite(MOTOR_RIGHT_DIR, LOW);
    analogWrite(MOTOR_RIGHT_PWM, -rightSpeed);
  }
}

/////////////////RUTINA DE CALIBRARE A SENZORILOR//////////////////////

void calibrateSensors() {
  Serial.println("Calibrating sensors...");
  for (int i = 0; i < 400; i++) { // Calibrare pentru 4 secunde
    qtr.calibrate();
    delay(10);
  }
  Serial.println("Calibration done.");
}
Leave a Comment