AULA CARRO 2WD 03 Circuito com Shield e Sensor de Linha
Como montar um Robô Seguidor de Linha com Arduino Motor Shield
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.
- 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ô

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:

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) :
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
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
|
//Programa : Motor shield com sensor TCRT5000 //Adaptacoes : MakerHero // //Baseado no programa original de Michael McRoberts #include <AFMotor.h> AF_DCMotor motor_esq(1); //Seleciona o motor 1 AF_DCMotor motor_dir(4); //Seleciona o motor 4 int SENSOR1, SENSOR2, SENSOR3; //deslocamentos de calibracao int leftOffset = 0, rightOffset = 0, centre = 0; //pinos para a velocidade e direcao do motor int speed1 = 3, speed2 = 11, direction1 = 12, direction2 = 13; //velocidade inicial e deslocamento de rotacao int startSpeed = 70, rotate = 30; //limiar do sensor int threshold = 5; //velocidades iniciais dos motores esquerdo e direito int left = startSpeed, right = startSpeed; //Rotina de calibracao do sensor void calibrate() { for ( int x=0; x<10; x++) //Executa 10 vezes para obter uma media { delay(100); SENSOR1 = analogRead(0); SENSOR2 = analogRead(1); SENSOR3 = analogRead(2); leftOffset = leftOffset + SENSOR1; centre = centre + SENSOR2; rightOffset = rightOffset + SENSOR3; delay(100); } //obtem a media para cada sensor leftOffset = leftOffset /10; rightOffset = rightOffset /10; centre = centre / 10; //calcula os deslocamentos para os sensores esquerdo e direito leftOffset = centre - leftOffset; rightOffset = centre - rightOffset; } void setup() { calibrate(); delay(3000); } void loop() { //utiliza a mesma velocidade em ambos os motores left = startSpeed; right = startSpeed; //le os sensores e adiciona os deslocamentos SENSOR1 = analogRead(0) + leftOffset; SENSOR2 = analogRead(1); SENSOR3 = analogRead(2) + rightOffset; //Se SENSOR1 for maior do que o sensor do centro + limiar, // vire para a direita if (SENSOR1 > SENSOR2+threshold) { left = startSpeed + rotate; right = startSpeed - rotate; } //Se SENSOR3 for maior do que o sensor do centro + limiar, // vire para a esquerda if (SENSOR3 > (SENSOR2+threshold)) { left = startSpeed - rotate; right = startSpeed + rotate; } //Envia os valores de velocidade para os motores motor_esq.setSpeed(left); motor_esq.run(FORWARD); motor_dir.setSpeed(right); motor_dir.run(FORWARD); } |
Conforme o motor e chassi que for utilizar, você deve ajustar os parâmetros de velocidade (startSpeed) e deslocamento de rotação (rotate), evitando que os motores girem muito rápido ou muito devagar.