/********* 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 */