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

Kit Chassi robo 2 rodas

Chassi 2 Rodas Robô

Chassi 4 Rodas Robótica Robo Arduino
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:

Funcionamento sensores robô seguidor de linha
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 : Detalhe barra de pinos

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.