Menu

Carrinho utilizando o sensor de ultrassom e um servo motor

Já temos nosso carrinho funcionando e com os (motores conectados).

Já ligamos o (sensor de ultrassom).

Agora, vamos ligar um servo motor, e, depois, colocar o sensor de ultrassom para girar em cima dele.

Ligação do servo:

(pode usar qualquer uma das duas ligações de servo motor, depois ajuste o código, mudando o valor da variável PinoServoMotor – pela ligação elétrica do módulo, os pinos disponíveis são os digitais 9 e o 10).

A visão geral de nossa montagem está assim:

Para ligar o ultrassom na plaquinha podemos usar os jumpers normais ou fazer um cabo;

Para fixar o ultrassom no servomotor usaremos uma peça de acrílico:

O código que usaremos agora é o que segue (sempre que a distância em frente for menor do que o estabelecido na variável limite, que no exemplo é de 15cm, o carrinho vai determinar a distância para os lados esquerdo e direito e vai seguir para o lado em que houver mais espaço de deslocamento – a rapidez do carrinho pode ser ajustada por meio da variável velocidade, com um número entre 0 e 255):

#include <AFMotor.h>
#include <Servo.h>

#define PinoEcho A1
#define PinoTrigger A2

const int PinoServoMotor = 10;

int velocidade = 150;
int limite = 15;
int distancia = 200;

AF_DCMotor mEsq(3);
AF_DCMotor mDir(4);

Servo meuServo;

void seguirReto(){ 
  mEsq.run(FORWARD);
  mDir.run(FORWARD); 
}

void voltarReto(){ 
  mEsq.run(BACKWARD);
  mDir.run(BACKWARD); 
}

void seguirEsquerda(){ 
  mEsq.run(RELEASE); 
  mDir.run(FORWARD); 
}

void seguirDireita(){
  mDir.run(RELEASE); 
  mEsq.run(FORWARD); 
}

void parar(){
  mEsq.run(RELEASE);
  mDir.run(RELEASE); 
}

void setup() 
{
  pinMode(PinoTrigger, OUTPUT); 
  pinMode(PinoEcho, INPUT); 
  mEsq.setSpeed(velocidade);
  mDir.setSpeed(velocidade);
  meuServo.attach(PinoServoMotor); 
}

int calculaDistancia(){
  //primeiramente, desliga a emissão de ultrassom
  digitalWrite(PinoTrigger,LOW);
  //aguarda 0,000003 segundos (3 microssengundos)
  delayMicroseconds(3);
  //coloca em alto o pino trigger, o que faz com que o sensor emita ultrassom
  digitalWrite(PinoTrigger,HIGH);
  //aguarda 0,000010 segundos (10 microssegundos), conforme o datasheet
  delayMicroseconds(10);
  //desliga a emissão de ultrassom
  digitalWrite(PinoTrigger,LOW);
  // aguarda pelo echo; tempoUs corresponde ao tempo em microssegundos que demorou para o sinal voltar
  float tempoUs = pulseIn(PinoEcho, HIGH); // microseconds
  //conforme o datasheet consultado, divide o tempo por 58 para saber a distância em centímetros
  //se dividir por 148 dá a distância em polegadas
  //retorna o resultado da divisão
  return (int)(tempoUs / 58); // assume velocidade do som no ar de 340 m/s = 2.9ms/mm
}

void loop() {

  parar();
  meuServo.write(90); 
  delay(50);
  seguirReto();

  distancia = calculaDistancia();

  if (distancia < limite){
    parar();
    delay(20);
    voltarReto(); 
    delay(250);

    meuServo.write(45);
    int esquerda = calculaDistancia();
    delay(50);
    meuServo.write(135);
    int direita = calculaDistancia();

    if ( esquerda < direita ){
      seguirDireita();
    }
    else {
      seguirEsquerda();
    }
    delay(300);
  }
}

Baixe o código aqui: (  carrinhoUltrassomServoMotor ).

Universidade Federal do Paraná
TI Aplicada – pesquisa e extensão

Av Pref Lothário Meissner, 632
80210-170 | Curitiba |
simao@ufpr.br
(41) 3360-4420
Universidade Federal do Paraná
TI Aplicada – pesquisa e extensão

Av Pref Lothário Meissner, 632
80210-170 | Curitiba |
simao@ufpr.br
(41) 3360-4420

UFPR nas Redes Sociais


UFPR nas Redes Sociais