Código Arduino – Carrinho Seguidor de Linha

Código atualizado utilizado no projeto. Copie e cole na IDE do Arduino (.ino):


// Motor A
const int ENA = 11; // Pino PWM que controla a velocidade do Motor A
const int IN1 = 10; // Pino de direção 1 do Motor A (define sentido)
const int IN2 = 9;  // Pino de direção 2 do Motor A (define sentido)
#define s 100 // Velocidade base (speed) usada para andar em linha reta
#define t 130 // Velocidade aumentada para curvas (turning speed)

// Motor B
const int ENB = 6;  // Pino PWM que controla a velocidade do Motor B
const int IN3 = 8;  // Pino de direção 1 do Motor B
const int IN4 = 7;  // Pino de direção 2 do Motor B

// IR Sensors
const int IRSensorLeft = 2;   // Sensor infravermelho esquerdo
const int IRSensorRight = 3;  // Sensor infravermelho direito

void setup() {
  // Configura os pinos ligados aos motores como saída
  pinMode(ENA, OUTPUT);
  pinMode(IN1, OUTPUT);
  pinMode(IN2, OUTPUT);
  pinMode(ENB, OUTPUT);
  pinMode(IN3, OUTPUT);
  pinMode(IN4, OUTPUT);

  // Configura os sensores como entrada
  pinMode(IRSensorLeft, INPUT);
  pinMode(IRSensorRight, INPUT);

  // Inicia comunicação serial (útil para testes)
  Serial.begin(9600);
}

void loop() {
  // Leitura dos sensores (LOW = preto, HIGH = branco)
  bool leftSensor = digitalRead(IRSensorLeft);
  bool rightSensor = digitalRead(IRSensorRight);
  
  // Mostra as leituras no monitor serial
  Serial.print("Left Sensor: ");
  Serial.print(leftSensor);
  Serial.print(" | Right Sensor: ");
  Serial.println(rightSensor);

  // Ambos sensores encontram a linha → seguir em frente
  if (leftSensor == LOW && rightSensor == LOW) {
    moveForward();
  }
  // Sensor esquerdo encontra linha → virar direita
  else if (leftSensor == LOW && rightSensor == HIGH) {
    turnRight();
  }
  // Sensor direito encontra linha → virar esquerda
  else if (leftSensor == HIGH && rightSensor == LOW) {
    turnLeft();
  }
  // Nenhum sensor encontra a linha → parar (linha perdida)
  else {
    stopMotors();
  }

  delay(100); // Delay pequeno para estabilizar as leituras
}

void moveForward() {
  // Motor A para frente
  digitalWrite(IN1, HIGH);
  digitalWrite(IN2, LOW);
  analogWrite(ENA, s);

  // Motor B para frente
  digitalWrite(IN3, HIGH);
  digitalWrite(IN4, LOW);
  analogWrite(ENB, s);
}

void turnRight() {
  digitalWrite(IN1, LOW);
  digitalWrite(IN2, HIGH);
  analogWrite(ENA, t);

  digitalWrite(IN3, HIGH);
  digitalWrite(IN4, LOW);
  analogWrite(ENB, t);
}

void turnLeft() {
  digitalWrite(IN1, HIGH);
  digitalWrite(IN2, LOW);
  analogWrite(ENA, t);

  digitalWrite(IN3, LOW);
  digitalWrite(IN4, HIGH);
  analogWrite(ENB, t);
}

void stopMotors() {
  digitalWrite(IN1, LOW);
  digitalWrite(IN2, LOW);
  analogWrite(ENA, 0);

  digitalWrite(IN3, LOW);
  digitalWrite(IN4, LOW);
  analogWrite(ENB, 0);
}