Boa noite a todos

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

Refaça seu tópico colocando o seu codigo dentro das tags, conforme recomendado pelo forum.
Para fazer isto click em " < code > " na barra de ferramentas.

Qual arduino voce está usando.

Para facilitar nossa ajuda, post também um esquemático do seu projeto.

o esquematico pode ser uma foto ?

Foto pode ajudar um pouco, mas o ideal seria um esquemático.

Descreva qual o seu proposito da linha 82 até a linha 102.
Como escolher uma ação?

codifiquei para que ele tomasse uma direção aleatória para desviar do obstáculo a sua frente. o sensor ultrassónico é montado encima de um servo motor que faz um momento radial para detectar obstáculos. eu tentei programar os movimentos certos mas fui mal sucedido e optei por deixar o movimento aleatório pois é o que funciona. quanto ao Arduino. estou utilizando um uno com uma ponte H vermelha para o controle das rodas.

Em vez de ligares e desligares os motores não podes meter PWM para controlares a velocidade dos mesmos?

como eu poderia fazer isso ?

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.