CCCPaste

Line Follower rev_01

/********* Pleasedontcode.com **********

	Pleasedontcode thanks you for automatic code generation! Enjoy your code!

	- Terms and Conditions:
	You have a non-exclusive, revocable, worldwide, royalty-free license
	for personal and commercial use. Attribution is optional; modifications
	are allowed, but you're responsible for code maintenance. We're not
	liable for any loss or damage. For full terms,
	please visit pleasedontcode.com/termsandconditions.

	- Project: Line Follower
	- Source Code NOT compiled for: Arduino Nano
	- Source Code created on: 2025-10-13 15:47:35

********* Pleasedontcode.com **********/

/****** SYSTEM REQUIREMENTS *****/
/****** SYSTEM REQUIREMENT 1 *****/
	/* All black stop */
/****** END SYSTEM REQUIREMENTS *****/


/* START CODE */

/****** DEFINITION OF LIBRARIES *****/

/****** FUNCTION PROTOTYPES *****/
void setup(void);
void loop(void);
int readLine();
void moveForward(int leftSpeed, int rightSpeed);
bool allSensorsBlack(void);

/****** GLOBAL VARIABLES AND PIN DEFINITIONS *****/
// Sensor pins: RLS08 sensors mapped to Nano pins (including A0A2 as analog inputs)
int sensorPins[8] = {2, 3, 4, 7, 8, A0, A1, A2}; 
int sensorValues[8];

// TB6612FNG motor driver pins mapped to Nano
#define PWMA 5   // Left motor speed (PWM)
#define PWMB 6   // Right motor speed (PWM)
#define AIN1 10
#define AIN2 11
#define BIN1 12
#define BIN2 13
#define STBY 9   // Standby

// === Motor Speed Settings ===
int baseSpeed = 150;  // normal forward speed (0255)

// === PID Variables ===
float Kp = 25;   // proportional gain
float Ki = 0.0;  // integral gain
float Kd = 15;   // derivative gain

int lastError = 0;
float integral = 0;

// ----------------------------------------------------------------------
void setup(void)
{
  Serial.begin(9600);

  // Sensor pins
  for (int i = 0; i < 8; i++) {
    pinMode(sensorPins[i], INPUT);
  }

  // Motor driver pins
  pinMode(PWMA, OUTPUT);
  pinMode(PWMB, OUTPUT);
  pinMode(AIN1, OUTPUT);
  pinMode(AIN2, OUTPUT);
  pinMode(BIN1, OUTPUT);
  pinMode(BIN2, OUTPUT);
  pinMode(STBY, OUTPUT);

  digitalWrite(STBY, HIGH); // Enable motor driver

  Serial.println("PID Line Follower Ready...");
}

// ----------------------------------------------------------------------
void loop(void)
{
  // All black stop condition: if all sensor inputs read LOW (0), stop the robot
  if (allSensorsBlack()) {
    moveForward(0, 0);
    Serial.println("All black stop triggered"); // new: indicate stop condition
    delay(10);
    return;
  }

  int position = readLine(); // get error from sensors
  int error = position;

  // === PID Calculation ===
  integral += error;
  int derivative = error - lastError;
  int correction = (Kp * error) + (Ki * integral) + (Kd * derivative);

  int leftSpeed = baseSpeed - correction;
  int rightSpeed = baseSpeed + correction;

  // limit speeds between 0255
  leftSpeed = constrain(leftSpeed, 0, 255);
  rightSpeed = constrain(rightSpeed, 0, 255);

  // move motors
  moveForward(leftSpeed, rightSpeed);

  lastError = error;

  delay(10); // loop delay
}

// ----------------------------------------------------------------------
// === Read Line Function ===
int readLine()
{
  int weightedSum = 0;
  int sum = 0;

  for (int i = 0; i < 8; i++) {
    sensorValues[i] = digitalRead(sensorPins[i]);

    // invert logic if needed (0=black, 1=white  so we flip)
    int value = (sensorValues[i] == 0) ? 1 : 0;

    if (value == 1) {
      weightedSum += (i * 100); // position weight (0700)
      sum += 1;
    }
  }

  if (sum == 0) {
    // no line detected  keep last error
    return lastError;
  }

  int position = weightedSum / sum;   // average position
  int error = position - 350;         // center = 350
  return error;
}

// ----------------------------------------------------------------------
// === Motor Control ===

// Move Forward
void moveForward(int leftSpeed, int rightSpeed)
{
  digitalWrite(AIN1, HIGH);
  digitalWrite(AIN2, LOW);
  digitalWrite(BIN1, HIGH);
  digitalWrite(BIN2, LOW);
  analogWrite(PWMA, leftSpeed);
  analogWrite(PWMB, rightSpeed);
}/* Baseline Code Empty */

// ----------------------------------------------------------------------
// Helper: check if all sensors read black (LOW)
bool allSensorsBlack(void)
{
  for (int i = 0; i < 8; i++) {
    int v = digitalRead(sensorPins[i]);
    if (v != 0) {
      return false; // at least one sensor not on black
    }
  }
  return true; // all sensors are LOW (black)
}

/* END CODE */