Estou fazendo um projeto integrador que consiste em um robô que desvia de obstáculos. ele possui apenas um sensor. que é o ultrassónico para detectar obstáculos. porém me deparei com um problema que não consigo encontrar a resposta. eu não consigo de forma nenhuma reduzir a velocidade dos motores das rodas. fazendo com que o robô constantemente bata em obstáculos de novo e de novo. antes de desviar deles. por exemplo : ele bate na parede para então detecta a parede e dar ré e tomando um rumo diferente. Esse é meu código :
#include <Servo.h>
#define TRIG_PIN 9 // Pino de gatilho do sensor ultrassônico
#define ECHO_PIN 10 // Pino de eco do sensor ultrassônico
#define SERVO_PIN 11 // Pino para o servo motor
#define MOTOR1_PIN1 2 // Conecte o fio do motor 1 ao pino 2 do Arduino
#define MOTOR1_PIN2 3 // Conecte o fio do motor 1 ao pino 3 do Arduino
#define MOTOR2_PIN1 4 // Conecte o fio do motor 2 ao pino 4 do Arduino
#define MOTOR2_PIN2 5 // Conecte o fio do motor 2 ao pino 5 do Arduino
#define LED_PIN 13 // Pino do LED
Servo servoMotor;
int servoPosition = 90; // Posição inicial do servo (meio)
long duration;
int distance;
int motorPin1 = 2; // Pino para controlar o motor 1
int motorPin2 = 3; // Pino para controlar o motor 1
int motorPin3 = 4; // Pino para controlar o motor 2
int motorPin4 = 5; // Pino para controlar o motor 2
void setup() {
pinMode(TRIG_PIN, OUTPUT);
pinMode(ECHO_PIN, INPUT);
pinMode(LED_PIN, OUTPUT); // Configurar o pino do LED como saída
servoMotor.attach(SERVO_PIN);
servoMotor.write(servoPosition);
pinMode(motorPin1, OUTPUT);
pinMode(motorPin2, OUTPUT);
pinMode(motorPin3, OUTPUT);
pinMode(motorPin4, OUTPUT);
delay(500);
}
void loop() {
// Fazer uma leitura do sensor ultrassônico
digitalWrite(TRIG_PIN, LOW);
delayMicroseconds(2);
digitalWrite(TRIG_PIN, HIGH);
delayMicroseconds(10);
digitalWrite(TRIG_PIN, LOW);
duration = pulseIn(ECHO_PIN, HIGH);
distance = duration / 58.2; // Converter a duração em centímetros
// Verificar se há um obstáculo à frente (por exemplo, a uma distância inferior a 20 cm)
if (distance < 20) {
// Obstáculo detectado
digitalWrite(LED_PIN, HIGH); // Acender o LED
// Parar os motores 1 e 2
digitalWrite(motorPin1, LOW);
digitalWrite(motorPin2, LOW);
digitalWrite(motorPin3, LOW);
digitalWrite(motorPin4, LOW);
// Girar o servo para evitar o obstáculo
servoMotor.write(45); // Girar o servo para a esquerda
delay(1000); // Aguardar um segundo para o servo girar
// Continuar a verificar a distância após girar o servo
digitalWrite(TRIG_PIN, LOW);
delayMicroseconds(2);
digitalWrite(TRIG_PIN, HIGH);
delayMicroseconds(10);
digitalWrite(TRIG_PIN, LOW);
duration = pulseIn(ECHO_PIN, HIGH);
distance = duration / 58.2; // Converter a duração em centímetros
// Se ainda houver um obstáculo à frente após girar o servo
if (distance < 20) {
// Gire o servo para a direita para tentar encontrar um caminho
servoMotor.write(135); // Girar o servo para a direita
delay(1000); // Aguardar um segundo para o servo girar
// Retornar o servo à posição inicial
servoMotor.write(90); // Posição inicial (meio)
delay(1000); // Aguardar um segundo para o servo girar
// Escolher uma ação após a tentativa de desvio
// Ação 1: Curvar para a esquerda (roda direita para frente, roda esquerda para trás)
digitalWrite(motorPin1, HIGH);
digitalWrite(motorPin2, LOW);
digitalWrite(motorPin3, LOW);
digitalWrite(motorPin4, HIGH);
delay(1000); // Tempo de curva
// Ação 2: Curvar para a direita (roda esquerda para frente, roda direita para trás)
digitalWrite(motorPin1, LOW);
digitalWrite(motorPin2, HIGH);
digitalWrite(motorPin3, HIGH);
digitalWrite(motorPin4, LOW);
delay(1000); // Tempo de curva
// Ação 3: Ir para trás (ambas as rodas para trás)
digitalWrite(motorPin1, LOW);
digitalWrite(motorPin2, HIGH);
digitalWrite(motorPin3, LOW);
digitalWrite(motorPin4, HIGH);
delay(1000); // Tempo de marcha à ré
}
} else {
// Nenhum obstáculo à frente, continue em frente
// Desligar o LED
digitalWrite(LED_PIN, LOW);
// Retornar o servo à posição inicial
servoMotor.write(90);
// Mover os motores 1 e 2 para frente
digitalWrite(motorPin1, HIGH);
digitalWrite(motorPin2, LOW);
digitalWrite(motorPin3, HIGH);
digitalWrite(motorPin4, LOW);
}
}
estou aberto a sugestões