Olá Garagistas! Neste tutorial vamos mostrar como você pode fazer um carrinho seguidor de linha que desvia de obstáculos utilizando Zumo Chassis (Montado), Arduino, Dual Motor Shield, Emissores e Receptores Infravermelhos.
Material Utilizado:
1. Funcionamento
1.1) Pista
Na imagem abaixo, à esquerda esta a pista utilizada neste tutorial, feita de fita isolante em uma cartolina branca, e à direita a pista Luigi Raceway do jogo Mario Kart 64 na qual a nossa foi inspirada:
Figura 1 - Circuito inspirado na pista Luigi Raceway do jogo Mario Kart 64
1.2) Dual Motor Shield
Imagem 1 - Dual Motor Shield
O Dual Motor Shield é um Shield para Arduino muito prático, e com a biblioteca desenvolvida pelo Laboratório de Garagem sua utilização fica bem mais simples, pois com apenas um comando você define o sentido e velocidade de até 2 motores DC. Muito prático, é uma excelente solução para quem quer controlar plataformas robóticas como o Zumo.
1.3) Biblioteca DualMotor.h
A biblioteca desenvolvida para o Shield é composta por poucas funções:
DualMotor dualmotor; //Instância a DualMotor
dualmotor.M1move(velocidade, sentido); //Aciona o motor 1, velocidade (0 a 255) e sentido (0 - Horário ou 1 - Anti-horário)
dualmotor.M2move(velocidade, sentido); //Aciona o motor 2, velocidade (0 a 255) e sentido (0 - Horário ou 1 - Anti-horário)
dualmotor.M1parar(); //Para o motor 1
dualmotor.M2parar(); //Para o motor 2
A biblioteca pode ser baixada clicando aqui. Basta você extrair a pasta e copia-la para dentro da pasta libraries do Arduino.
1.4) Emissor e Receptor Infravermelho
Figura 2 - Emissor e Receptor Infravermelho
Com um emissor e um receptor infravermelho é simples detectar a linha preta. O emissor emite a luz infravermelha e quando essa luz for refletida, o receptor irá receber a luz e através do Arduino é possível detectar essa recepção. Em nossa demostração utilizamos uma cartolina branca e fita isolante, quando for refletida e recebida pelo receptor, nos indica que abaixo do nosso receptor tem uma superfície que reflete a luz, no nosso caso essa superfície será a cartolina branca. Quando o sensor estiver acima da fita insolante, por ela ser preta, não refletirá luz, então com isso podemos afirmar que está sendo detectando a linha preta. Ao detectar se o carrinho esta saindo da linha, acionamos os motores de forma a nunca permitir que saia da linha.
Com essa montagem de emissor + receptor, estamos trabalhando com uma lógica binária, ou reflete luz, ou não reflete, ou seja, ou o sensor está acima da cartolina branca, ou o sensor está acima da linha preta.
Na figura abaixo você pode ver o resumo da lógica utilizada para controlar o Zumo:
Figura 3 - Lógica utilizada para controlar o Zumo
Os micromotores foram controlados pelo Dual Motor Shield, e esse Shield permite que controlemos cada um dos motores individualmente.
OBS: Foi pensado em uma maneira de parar o carrinho caso nenhum dos dois sensores receba a luz. Nesta situação o carrinho trava tentando recuar, isto também auxilia para que você possa proteger a sua pista com um fita isolante mais larga e impedir que o carrinho caia da mesa, ou superfície que ele estiver andando.
1.5) Sensor de Proximidade
Imagem 2 - Sensor de proximidade de curto alcance
Foi utilizado o sensor de proximidade de curta distância para detectar o objeto, e quando o mesmo estiver próximo, o Arduino irá executar uma rotina padrão de desvio do objeto, a trajetória de desvio pode ser vista na imagem abaixo:
Figura 4 - Trajetória de desvio do obstáculo
2. Montagem
2.1) Monte o circuito da figura abaixo, utilizando solda. Onde estão indicados os pontos GND, Entrada Digital e +5V, utilize jumpers para fazer as conexões com o Arduino:
Figura 5 - Montagem para o sensor de linha
2.2) Após feito a solda, isole o Emissor do Receptor, utilizando fita isolante, conforme a imagem abaixo. Essa isolação impede que a luz seja recebida pelos "lados" do receptor, com isso a luz somente será recebida quando for refletida em algum objeto ou superfície que reflita luz:
Imagem 3 - Isolação do receptor infravermelho
2.3) Utilizando dupla face, cole um em cada lado do sensor de proximidade, conforme as imagens abaixo:
Imagem 4 - Posicionando os sensores de linha ao lado do sensor de proximidade
2.4) Conecte o Dual Motor Shield e faça as ligações dos sensores conforme a figura abaixo:
Figura 6 - Montagem dos sensores de linha e de proximidade com o Arduino
2.5) Faça as ligações dos motores e das pilhas com o Dual Motor Shield, conforme a imagem abaixo:
Imagem 5 - Ligações dos motores e das pilhas com o Dual Motor Shield
2.6) E por fim, a montagem estará completa:
Imagem 6 - Montagem completa do carrinho seguidor de linha que desvia de obstáculos
3. Sketch
#include <DualMotor.h> //Inclui a biblioteca DualMotor.h
#define SENSOR_PROXIMIDADE A0 //SENSOR_PROXIMIDADE como A0
#define SENSOR_ESQ A2 //Define SENSOR_ESQ como A2
#define SENSOR_DIR A3 //Define SENSOR_DIR como A3
DualMotor dualmotor; //Instância a DualMotor
void setup()
{
pinMode(SENSOR_ESQ, INPUT_PULLUP); //Configura o pino A2 como entrada e com...
//...resistor de pull-up ativo
pinMode(SENSOR_DIR, INPUT_PULLUP); //Configura o pino A3 como entrada e com...
//...resistor de pull-up ativo
delay(2000); //Aguarda 2 segundos para iniciar o programa
}
void loop()
{
if(analogRead(SENSOR_PROXIMIDADE) > 430) //Se a leitura do sensor de proximidade for mais que 430
{
//Move para a Esquerda por 600 milissegundos
dualmotor.M1move(255,0);
dualmotor.M2move(255,1);
delay(600);
//Move para Frente por 900 milissegundos
dualmotor.M1move(255,1);
dualmotor.M2move(255,1);
delay(900);
//Move para a Direita por 400 milissegundos
dualmotor.M1move(255,1);
dualmotor.M2move(255,0);
delay(400);
//Move para Frente por 1 segundo
dualmotor.M1move(255,1);
dualmotor.M2move(255,1);
delay(1000);
//Move para a Direita por 600 milissegundos
dualmotor.M1move(255,1);
dualmotor.M2move(255,0);
delay(600);
//Move para a Frente por 550 milissegundos
dualmotor.M1move(255,1);
dualmotor.M2move(255,1);
delay(550);
//Move para a Esquerda por 250 milissegundos
dualmotor.M1move(255,0);
dualmotor.M2move(255,1);
delay(250);
}
else if(digitalRead(SENSOR_ESQ) && digitalRead(SENSOR_DIR)) //Senão se nenhuma luz for refletida para os sensores
{
//Move para Trás com velocidade reduzida e aguarda 100 milissegundos
dualmotor.M1move(100,0);
dualmotor.M2move(100,0);
delay(100);
}
else if(digitalRead(SENSOR_ESQ)) //Senão se o sensor da Esquerda detectar a linha preta
{
//Move para Esquerda
dualmotor.M1move(255,0);
dualmotor.M2move(255,1);
}
else if(digitalRead(SENSOR_DIR)) //Senão se o sensor da Direita detectar a linha preta
{
//Move para a Direita
dualmotor.M1move(255,1);
dualmotor.M2move(255,0);
}
else //Senão
{
//Move para Frente
dualmotor.M1move(255,1);
dualmotor.M2move(255,1);
}
}
Então é isso Garagistas! Esperamos que tenham gostado deste tutorial!
C ya! =D
Referências:
http://labdegaragem.com/profiles/blogs/tutorial-seguidor-de-linha-com-plataforma-zumo
http://labdegaragem.com/profiles/blogs/tutorial-como-utilizar-o-dual-motor-shield
Comentar
Olá. Seria possível adaptar uma garra ou quem sabe até mesmo um braço robótico sobre um carrinho destes para por exemplo o transporte de alguma peça?
Olá seria a mesma coisa com os sensores ópticos reflexivos, como o TCRT5000 ??
ola, gostaria de ajuda, fiz todo o procedimento da montagem e programação mas o carro nao anda ele apenas se move um pouco e depois para.
o que devo fazer ?
o programa do tutorial não compila devido a biblioteca DualMotor.h
Tem como explicar aonde os motores estão sendo ligados?
Boa tarde, gostaria de saber se a shield usada pode só controlar os sensores, sem o carro precisar do sensor de presença, tem como mandar a programação?
opa boa tarde qual as polaridades dos leds?
Olá pessoal, vamos lá:
Felipe Casseb: O Dual Motor Shield utiliza os pinos D5, D6, D7 e D8, todos os outros ficam livres para uso geral.
Nathan Leão: Não temos informações sobre essa placa romeo V2, muito provavelmente você não conseguirá utilizar exatamente a mesma programação.
Douglas Roberto: Você pode acrescentar mais sensores como o de ultrassom ou até outros sensor de proximidade, nas laterais por exemplo, contudo você deverá aplicar isso na programação também.
João Paulo: Não fizemos cálculos, apenas fizemos uma rotina padrão para que ele detectasse o objeto e fizesse uma rota que garantisse o total desvio do mesmo.
Abraços a todos.
Olá , ótimo trabalho feito.
Estou tentando fazer esse projeto e gostaria de saber como você fez os cálculos para saber os tempos de desvio dos obstáculos.
Desde já agradeço. Abraços.
Bem-vindo a
Laboratorio de Garagem (arduino, eletrônica, robotica, hacking)
© 2024 Criado por Marcelo Rodrigues. Ativado por
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)