// Line Following Robot with Two LDR Sensors & Tow Stepper Motors (Algorithm 3.4)
// Separate Functions for Each Action
const int LEFT_SENSOR_PIN = A0;
const int RIGHT_SENSOR_PIN = A1;
const int LEFT_MOTOR_STEP_PIN = 2;
const int LEFT_MOTOR_DIR_PIN = 3;
const int RIGHT_MOTOR_STEP_PIN = 4;
const int RIGHT_MOTOR_DIR_PIN = 5;
const int BLACK_THRESHOLD = 300; // Adjust if needed
const int STEP_DELAY_US =800;
void setup() {
pinMode(LEFT_SENSOR_PIN, INPUT);
pinMode(RIGHT_SENSOR_PIN, INPUT);
pinMode(LEFT_MOTOR_STEP_PIN, OUTPUT);
pinMode(LEFT_MOTOR_DIR_PIN, OUTPUT);
pinMode(RIGHT_MOTOR_STEP_PIN, OUTPUT);
pinMode(RIGHT_MOTOR_DIR_PIN, OUTPUT);
// Forward direction
digitalWrite(LEFT_MOTOR_DIR_PIN, LOW);
digitalWrite(RIGHT_MOTOR_DIR_PIN, LOW);
}
void loop() {
// مو عارف هون احط اصغر ولا اكبر لانه قرأت السنسور منخفظة ولا مرتفعة للاسود
bool leftOnBlack = analogRead(LEFT_SENSOR_PIN) > BLACK_THRESHOLD;
bool rightOnBlack = analogRead(RIGHT_SENSOR_PIN) > BLACK_THRESHOLD;
if (leftOnBlack && rightOnBlack) {
moveForward();
}
else if (!leftOnBlack && !rightOnBlack) {
stopMoving();
}
else if (leftOnBlack && !rightOnBlack) {
turnLeft();
}
else if (!leftOnBlack && rightOnBlack) {
turnRight();
}
}
// Case 1: Both sensors on black (Forward)
void moveForward() {
digitalWrite(LEFT_MOTOR_DIR_PIN, LOW);
digitalWrite(RIGHT_MOTOR_DIR_PIN, LOW);
stepBothMotors(2, 2); // full power
}
// Case 2: Both sensors on white (Stop)
void stopMoving() {
// no steps = stop
delay(10);
}
// Case 3: Left on black, right on white (Turn Left)
void turnLeft() {
digitalWrite(LEFT_MOTOR_DIR_PIN, LOW);
digitalWrite(RIGHT_MOTOR_DIR_PIN, LOW);
stepBothMotors(0, 1); // left stop, right 50
}
// Case 4: Right on black, left on white (Turn Right)
void turnRight() {
digitalWrite(LEFT_MOTOR_DIR_PIN, LOW); // forward
digitalWrite(RIGHT_MOTOR_DIR_PIN, LOW); // forward
stepBothMotors(1, 0); // right stop(0), left half(50)
}
// Step Function
void stepBothMotors(int leftPower, int rightPower) {
int maxSteps = max(leftPower, rightPower);
for (int i = 0; i < maxSteps; i++) {
if (i < leftPower) {
digitalWrite(LEFT_MOTOR_STEP_PIN, HIGH);
delayMicroseconds(STEP_DELAY_US);
digitalWrite(LEFT_MOTOR_STEP_PIN, LOW);
delayMicroseconds(STEP_DELAY_US);
}
if (i < rightPower) {
digitalWrite(RIGHT_MOTOR_STEP_PIN, HIGH);
delayMicroseconds(STEP_DELAY_US);
digitalWrite(RIGHT_MOTOR_STEP_PIN, LOW);
delayMicroseconds(STEP_DELAY_US);
}
}
}