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 ).