Projeto: Acionando Servo motor com sensor de Ultrasom e Arduino

Neste post vamos mostrar um projeto simples e fácil acionando um Servomotor com sensor de ultrasom e Arduino.  Quanto maior a distância, maior será o ângulo do servomotor. O sensor de ultrasom utilizado neste projeto é o Maxbotix LV-EZ1 da loja LdG e o servomotor da Loja LdG.

Primeiramente, vamos ligar o servomotor. O servomotor tem 3 fios: um vermelho (VCC), um preto (GND) e um branco, amarelo ou marrom (Comando). Ligue o fio vermelho no 5V do Arduino, o preto no GND do Arduino e o branco no pino digital 9 do Arduino. 

Agora, conecte o pino PW do sensor ultrasom no pino digital 7, o pino 5V do sensor no 5V do Arduino e o GND do sensor no GND do Arduino.

Depois de feito as ligações, copie e cole a seguinte programação:

#include <Servo.h>

const int SensorPin = 7;

long value=0;
int pos;
int x;
Servo myservo;

void setup() {
myservo.attach(9);
Serial.begin(9600);
}
void loop() {
pinMode(SensorPin, INPUT);
value=pulseIn(SensorPin, HIGH)*2.54/147; //2.54 cm/inch /147uS per inch
if(value<200) //Threshold
{
x=map(value,10,70,0,179);
myservo.write(x);
if(Serial.available())
{
Serial.println(x);
}
}
delay(100);
}

A função PulseIn obtém o número de pulsos em uS. A variável value é o valor obtido pelo PulseIn e multiplicado por 2.54/147 (2.54 é a medida em cm para cada polegada e 147 é o tempo em microssegundos por polegada). Se o valor da variável value for menor que o "threshold" (neste caso 200 (cm)), o Arduino converte a variável em graus pela função map e depois manda o valor para o servomotor. E este vai para o ângulo em graus convertido.

E é isso! Esperamos que tenha gostado! Caso tenha dúvidas, poste aqui neste blog! Se tiver sugestões de tutoriais, clique aqui! Para ver nossos tutoriais e projetos desenvolvidos pela equipe LdG e por outros garagistas, clique aqui e aqui, respectivamente! Até a próxima!

Referências:

http://www.labdegaragem.org/loja/index.php/34-sensores/sensor-de-di...

http://www.labdegaragem.org/loja/index.php/servo-motor-pequeno.html

http://labdegaragem.com/profiles/blogs/tutorial-arduino-com-servomotor

http://www.labdegaragem.org/loja/index.php/34-sensores/sensor-de-di...

http://labdegaragem.com/profiles/blogs/tutorial-de-como-utilizar-ul...

Exibições: 22293

Comentar

Você precisa ser um membro de Laboratorio de Garagem (arduino, eletrônica, robotica, hacking) para adicionar comentários!

Entrar em Laboratorio de Garagem (arduino, eletrônica, robotica, hacking)

Comentário de Isabela Borges em 13 outubro 2016 às 20:25

Boa noite, quero abrir( 90graus) e fechar (0graus) uma cancela utilizando servo motor arduino uno e sensor magnético. Poderiam me ajudar com a IDE? att

Comentário de Maurílio Carneiro Coura em 13 maio 2014 às 1:29

Ola, boa noite. Estou "desenvolvendo" um robozinho, a partir de um comprado já pronto e com um programa-base agindo em 2 motores DC, 1 servo-motor, 1 ultrassom. Só que ele assim costuma se agarrar lateralmente em paredes, etc. Preciso incluir uma rotina para ler 2 sensores-chaves (micro-swiches) tipo bigode-de-gato, para que o robô saia desse "encosto".
Produzí e tentei várias rotinas (uma já veio com o kit do robô, mas usando apenas uma chave), sem sucesso: Ou funcionam os motores+ultrassom, ou as chaves. Testei colocar a minha rotina em vários pontos do sketch. Atualmente dividi essa rotina para ver se funcionavam os dois sensores (2 chaves e o ultrassom). Não deu certo.
Abaixo cópia do sketch mais atual. Este tem 4 páginas em A4, sem espaços entre linhas. Vou copiar aqui é o sketch mesmo, tirado da IDE, ok?

//--------------- Programa JABUTINO sketch 20140510 -----------
#include
#include

//Instancia o objeto referente aos motores DC
AF_DCMotor motorEsquerdo(1); //Motor esquerdo na conexão "M1"
AF_DCMotor motorDireito(2); //Motor direito na conexão "M2"

//Definições de velocidade em PWM de 0 a 255
const char VEL_MAX = 255;
const char VEL_MIN = 0;
const char VEL_MED = 200;

//Pinos para controle do Ultrassom HC-SR04
//usar as portas analógicas A0 e A1 como digitais
const int pinoTrigger = 14; // A0 = 14
const int pinoEcho = 15; // A1 = 15

//Servo Motor
Servo meuServo;
const int pinoServo = 10; //o pino 10 é o pino de sinal da conexão "SERVO_2"

//Define as posições de calibragem do servo
//Valores para conseguir um melhor alinhamento do servo, cada motor responde de forma diferente.
//Os valores devem variar de 0 a 180 graus, ajuste de acordo com seu motor na tentativa e erro.

const int OLHA_ESQ = 180;
const int OLHA_DIR = 0;
const int OLHA_FRT = 90;

// Pino em que o BUZZER está conectado:
const int pinoBuzzer = 9;

// PINOS que vão conectar as 2 CHAVES (sensores de colisão):
const int ChaveE = 18;
const int ChaveD = 19;

//Método obrigatório
//Realiza as definições dos pinos e faz a inicialização da biblioteca de servo.

void setup(void)
{
// Inicializa os motores com velocidade máxima
motorEsquerdo.setSpeed(VEL_MAX);
motorDireito.setSpeed(VEL_MAX);

//atribui os pinos do ultrassom
pinMode(pinoTrigger, OUTPUT);
pinMode(pinoEcho, INPUT);

Serial.begin(9600); /* função provisória, para controle da rotina das chaves.*/
/* define os pinos como entrada ligando um resistor pullup a eles */
pinMode(ChaveE, INPUT_PULLUP); // MUITO IMPORTANTE
pinMode(ChaveD, INPUT_PULLUP);

//inicia o Servo
meuServo.attach(pinoServo);
//Coloca o servo virado para posicao frontal
meuServo.write(OLHA_FRT);

} // fim do setup
//================================================
//Corpo principal do programa, repete infinitamente
void loop()
{
// Inicia andando para frente
andarpFrente(VEL_MAX);

// Faz a leitura dos sensores de CHAVES = colisão:
int lerChaveE = digitalRead(ChaveE);
int lerChaveD = digitalRead(ChaveD);

//Enquanto não encontrar um obstáculo a menos de 10cm
while(medeDistancia() > 10)
{
delay(100); //Faz uma leitura da distancia a cada 0,1 segundo
}

{ //imprime o valor chave Esq:
if (lerChaveE == HIGH)
{ Serial.println("Esquerda");

tone(pinoBuzzer, 840); //envia um sinal de 740Hz para o pino 9
delay(100); //aguarda 0,1 segundo
noTone(pinoBuzzer); //interrompe o som no pino 9
girarpDireita(VEL_MED);
delay(500); //aguarda 1 segundo
}
else
// if (lerChaveD != lidoAntD)
{ // imprime o valor da chave Direita:
if (lerChaveD == HIGH)
{ Serial.println("Direita");

tone(pinoBuzzer, 840); //envia um sinal de 840Hz para o pino 9
delay(100); //aguarda 0,1 segundo
noTone(pinoBuzzer); //interrompe o som no pino 9
girarpEsquerda(VEL_MED);
delay(500); //aguarda 0,5 segundo
}
}
//Se encontrou um obstáculo recua por 1 segundo e pára
andarpTras(VEL_MED);
delay(1000);
pararMotores();

//Verifica qual lado tem maior distância até um obstáculo
int esquerda = 0, direita = 0;

meuServo.write(OLHA_ESQ); //vira o servo para a esquerda
delay(500); //aguarda o servo completar o movimento
esquerda = medeDistancia(); //mede a distância na esquerda
meuServo.write(OLHA_DIR); //vira o servo para a direita
delay(500); //aguarda o servo completar o movimento

direita = medeDistancia(); //mede a distância na direita
meuServo.write(OLHA_FRT); //olha pra frente novamente
delay(500); //aguarda o servo completar o movimento

if(esquerda > direita) /*se a distancia do obstáculo na esquerda for maior que na direita
vira para esquerda */
{
girarpEsquerda(VEL_MAX);
}
else /* se a distância do obstáculo na direita for maior ou igual que na esquerda
vira para a direita */
{
girarpDireita(VEL_MAX);
}
//Aguarda alguns instantes para o robô virar
delay(500); // modifique esse tempo se desejar que ele vire por mais ou menos tempo // Fim da rotina de obstáculos // Inicio da rotina das CHAVES / colisão: // ==> tirado daqui e dividido, para tentar o funcionamento.

// armazena o valor lido para monitorar as próximas mudanças:
// lidoAntE = lerChaveE;
// lidoAntD = lerChaveD;

// aguarda minimamente para eliminar ruidos:
delay(5);
int lerChaveE = LOW; // Garante que a chave Esq estará em LOW.
int lerChaveD = LOW; // Garante que a chave Dir estará em LOW.
}
// final da rotina das CHAVES

} // Fim do LOOP

//Utiliza o sensor de Ultrassom HC-SR04 para medir a distância em centímetros
int medeDistancia()
{
//Garante que o pino de Trigger está LOW
digitalWrite(pinoTrigger, LOW);
delayMicroseconds(2);
//cria um pulso de 5 microssegundos no Trigger
digitalWrite(pinoTrigger, HIGH);
delayMicroseconds(5);
digitalWrite(pinoTrigger, LOW);

//aguarda o echo
long microssegundos = pulseIn(pinoEcho, HIGH);
// A velocidade do som é 340 m/s ou aproximadamente 29 microssegundos por centimetro.
// O pulso faz uma viagem de ida e volta do sensor até o obstáculo
// assim, para calcular a distancia temos que dividir esse tempo pela metade
// desta forma...
return int(microssegundos / 29 / 2);
} // Fim do CalcularDistancia

// ======== void's dos motores: =============

//Gira as duas rodas para frente
//Como os motores estão virados para lados opostos eles devem
//girar em sentidos opostos para que as rodas girem na mesma direção

void andarpFrente(char velocidade)
{
motorEsquerdo.setSpeed(velocidade);
motorDireito.setSpeed(velocidade);
motorEsquerdo.run(FORWARD);
motorDireito.run(BACKWARD);
}

//Gira as duas rodas para trás
//Como os motores estão virados para lados opostos eles devem
//girar em sentidos opostos para que as rodas girem na mesma direção
void andarpTras(char velocidade)
{
motorEsquerdo.setSpeed(velocidade);
motorDireito.setSpeed(velocidade);
motorEsquerdo.run(BACKWARD);
motorDireito.run(FORWARD);
}

//Gira as duas rodas em sentido inverso, girando no próprio eixo
void girarpEsquerda (char velocidade)
{
motorEsquerdo.setSpeed(velocidade);
motorDireito.setSpeed(velocidade);
motorEsquerdo.run(BACKWARD);
motorDireito.run(BACKWARD);
}

//Gira as duas rodas em sentido inverso, girando no próprio eixo
void girarpDireita(char velocidade)
{
motorEsquerdo.setSpeed(velocidade);
motorDireito.setSpeed(velocidade);
motorEsquerdo.run(FORWARD);
motorDireito.run(FORWARD);
}

//Pára os motores definindo os dois pinos Enable em estado Low
void pararMotores()
{
motorEsquerdo.run(RELEASE);
motorDireito.run(RELEASE);
}

Comentário de Ricardo Santos em 24 janeiro 2014 às 9:05

o código é apenas este ? esta completo ?

tens fotos do teu projeto ?

agradecia que me respondesses por favor

obrigado , Ricardo santos  .  

ricardinho890@live.com.pt

© 2024   Criado por Marcelo Rodrigues.   Ativado por

Badges  |  Relatar um incidente  |  Termos de serviço