Como montar um Robô Seguidor de
Linha com Arduino Motor Shield172
Arduino, Robótica 24 de fevereiro de 2014 Adilson Thomsen
Quando publicamos o post Controle motor DC 12V com o Motor Shield Arduino, recebemos
várias mensagens dos leitores, com dúvidas sobre como utilizar as portas que “sobram” no
shield para ligar lâmpadas e sensores. Por isso vamos apresentar um projeto de um Robô
seguidor de linha, por muito conhecido também por robô segue faixa.
Segundo o fabricante deste shield, as portas utilizadas pelos motores são as seguintes :
Controle de motores DC : Pinos 11, 3, 5 e 6
Controle de motores de passo : Pinos 4, 7, 8 e 12
Controle de servo motores : Pinos 9 e 10
Desta forma, as portas que podemos utilizar livremente são as 6 portas analógicas, assim
como as digitais 2 e 13, isso se estivermos falando de um Arduino Uno. Em um Arduino
Mega, por exemplo, todas as demais portas também estarão disponíveis.
Montando um Robô Seguidor de Linha:
Um bom exemplo de utilização deste Arduino motor shield é em aplicações de robótica,
como por exemplo na montagem de um robô seguidor de linha. Para facilitar sua vida
existem Kits de chassi para robôs com 2 ou 4 rodas e é claro que você
encontra na MakerHero tudo o que precisa:
Chassi 2 Rodas Robô
Chassi 4 Rodas Robô
Esses kits já vem com motores, suporte de baterias, acessórios e você só precisa adicionar
o Arduino (ou outra placa de sua preferência), os sensores e o circuito controlador de
motores. Para o caso do Arduino, recomendamos a utilização do Motor Shield citado acima,
já que ele se encaixa perfeitamente em um Arduino Uno economizando espaço na
montagem do robô.
Podemos utilizar como sensor os LDR´s (resistores dependentes de luz), ou
então sensores ópticos reflexivos, como o TCRT5000, que terão a função de “enxergar” a
linha e transmitir essa informação para o Arduino.
Projeto Robô Seguidor de Linha:
Para o nosso “carrinho” segue faixa, vamos utilizar 3 sensores ópticos ligados lado a lado.
Conforme a linha for detectada (ou não), cada sensor enviará ao Arduino as informações
sobre a intensidade do sinal infravermelho refletido, e o programa usará essas informações
para calcular a velocidade de cada motor. A ilustração abaixo mostra, de forma resumida,
como os sensores se comportam:
Imagem : RobotC
Transportando essa idéia para o nosso motor shield, vamos utilizar as portas A0, A1 e A2
para ligação dos sensores. O motor da esquerda será ligado ao conector M1, e o motor da
direita ao conector M4, utilizando a própria alimentação do Arduino (mantenha o jumper
PWR na placa).Demonstramos a ligação dos sensores em uma protoboard, utilizando
resistores de 330 ohms para o led infravermelho (parte superior/azul do sensor), e resistores
de 10 K na parte inferior (receptor) :
A maneira mais conveniente de ligar os sensores ao shield é utilizar uma barra de pinos
(macho ou fêmea) soldada à placa, como na imagem abaixo :
Controle do Robô Seguidor de Linha com
Arduino:
Para acionar o circuito vamos utilizar, com algumas adaptações, o programa criado por
Michael McRoberts e disponível no livro Arduíno Básico. Adicionamos as funções
da biblioteca AFMotor, responsável por comandar o motor shield. A biblioteca AFMotor
pode ser encontrada nesse link. Descompacte a pasta, renomeie para AFMotor, e coloque
essa pasta dentro da pasta LIBRARIES do programa (IDE) do seu Arduino. Não esqueça de
sair e carregar a IDE novamente para que a biblioteca seja reconhecida pelo programa.
1 //Programa : Motor shield com sensor TCRT5000
//Adaptacoes : MakerHero
2
//
3 //Baseado no programa original de Michael McRoberts
4
5 #include <AFMotor.h>
6
7 AF_DCMotor motor_esq(1); //Seleciona o motor 1
8 AF_DCMotor motor_dir(4); //Seleciona o motor 4
9
int SENSOR1, SENSOR2, SENSOR3;
10
11 //deslocamentos de calibracao
12 int leftOffset = 0, rightOffset = 0, centre = 0;
13 //pinos para a velocidade e direcao do motor
14 int speed1 = 3, speed2 = 11, direction1 = 12, direction2 = 13;
15 //velocidade inicial e deslocamento de rotacao
int startSpeed = 70, rotate = 30;
16 //limiar do sensor
17 int threshold = 5;
18 //velocidades iniciais dos motores esquerdo e direito
19 int left = startSpeed, right = startSpeed;
20
21 //Rotina de calibracao do sensor
void calibrate()
22
{
23 for (int x=0; x<10; x++) //Executa 10 vezes para obter uma media
24 {
25 delay(100);
26 SENSOR1 = analogRead(0);
SENSOR2 = analogRead(1);
27 SENSOR3 = analogRead(2);
28 leftOffset = leftOffset + SENSOR1;
29 centre = centre + SENSOR2;
30 rightOffset = rightOffset + SENSOR3;
31 delay(100);
}
32 //obtem a media para cada sensor
33 leftOffset = leftOffset /10;
34 rightOffset = rightOffset /10;
35 centre = centre / 10;
//calcula os deslocamentos para os sensores esquerdo e direito
36 leftOffset = centre - leftOffset;
37 rightOffset = centre - rightOffset;
38 }
39
40 void setup()
41 {
calibrate();
42 delay(3000);
43 }
44
45 void loop()
46 {
47 //utiliza a mesma velocidade em ambos os motores
left = startSpeed;
48 right = startSpeed;
49
50 //le os sensores e adiciona os deslocamentos
51 SENSOR1 = analogRead(0) + leftOffset;
52 SENSOR2 = analogRead(1);
SENSOR3 = analogRead(2) + rightOffset;
53
54 //Se SENSOR1 for maior do que o sensor do centro + limiar,
55 // vire para a direita
56 if (SENSOR1 > SENSOR2+threshold)
57 {
58 left = startSpeed + rotate;
right = startSpeed - rotate;
59 }
60
61 //Se SENSOR3 for maior do que o sensor do centro + limiar,
62 // vire para a esquerda
63 if (SENSOR3 > (SENSOR2+threshold))
{
64
left = startSpeed - rotate;
65 right = startSpeed + rotate;
66 }
67
68 //Envia os valores de velocidade para os motores
69 motor_esq.setSpeed(left);
motor_esq.run(FORWARD);
70 motor_dir.setSpeed(right);
71
72
73
74
75
76
77
motor_dir.run(FORWARD);
78 }
79
80
81
82
83
84
85