Agora que já possuÃmos os (motores conectados), vamos ligar um sensor de ultrassom no nosso carrinho:

A conexão do sensor infra vermelho de controle remoto pode permanecer.
O código que usaremos é:
#include <AFMotor.h>
#define PinoEcho A1
#define PinoTrigger A2
int velocidade = 150;
int limite = 15;
int distancia = 200;
AF_DCMotor mEsq(3);
AF_DCMotor mDir(4);
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);
}
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();
delay(50);
seguirReto();
distancia = calculaDistancia();
if (distancia < limite){
parar();
delay(20);
voltarReto();
delay(250);
seguirDireita();
//seguirEsquerda(); // a decisão é nossa de para que lado o carrinho vai
delay(250);
}
}
Baixe o código ( carrinhoUltrassom ).