Notícias & Blog

Como construir um Robô Seguidor de Linha com Arduino
Por Setembro 19, 2018 0 Comentário

Como construir um Robô Seguidor de Linha com Arduino

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.

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

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 só precisa adicionar o Arduino, 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 se adapta perfeitamente num Arduino Uno.

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.

//Programa : Motor shield com sensor TCRT5000

//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);

}

Deixe o seu comentário