quarta-feira, 18 de setembro de 2013

Robô Seguidor de Linha com Arduino + Adafruit Motor Shield + QRE1113 Analógico

Palavras-chave: Robô, Seguidor de Linha, Arduino, Magician, L298N, L298, L293D, Adafruit, Motor Shield, QRE1113 Analógico, QRE-1113.

Nota: todos os  links para sites e ferramentas encontram-se no final do post. Os softwares utilizados foram instalados no Slackware64 v.13-37.

Com intuito de ter aquele momento pai e filho, ensinar e aprender um pouquinho de eletrônica digital, resolvi montar um pequeno carrinho robótico seguidor de linha.

MATERIAIS

Mecânica:

- 1 Kit do Chassi Magician DG007.

Eletrônica e Controle:

- 1 Arduino Uno R2;
- 2 Sensores de Linha (refletância) QRE1113 - Analógico;
- 1 Adafruit motor shield - Driver Ponte H.

* Caso queira montar uma ponte H, será apresentado um circuito com base no L298N. Abaixo estão os componentes necessários:

- 1 Barra de terminal macho;

- 1 Born de 3 vias;
- 2 Borns de 2 vias;
- 1 L298N;
- 1 Dissipador para L298N;
- 8 Diodos 1N5819-B;
- 1 Placa de circuito impresso para protótipo (protoboard);
- Fios AWG 26.  

Diversos:

- Estanho;
- Ferro de solda;
- Alicate;
- Protoboard de 170 pontos para o carrinho;
- 1 barra/barramento de pinos macho;
- 1 Suporte para 6 pilhas AA;
- Fios AWG 26.

PARTE MECÂNICA 

Para evitar problemas com montagens e até mesmo pelo ótimo custo-benefício, optei por adquirir um kit de Chassi Magician (DG007). Ele vem desmontado e basicamente é só encaixar e apertar alguns parafusos.

As Figuras 1 e 2 mostram as partes do manual de montagem. Já a Figura 3, o chassi montado.
Fig. 1 - Montagem chassi - parte 01.
Fig. 2 - Montagem chassi - parte 02.
Fig. 3 - Chassi Magician DG007.

PARTE ELETRÔNICA

O driver (ponte H) utilizado para controlar o sentido e reversão dos motores é o Adafruit motor shield. As características do shield podem ser observadas abaixo:

- Controla 4 motores CC (bi-direcional e seleção individual de velocidades com resolução de 8 bits - 0,5% de resolução), 2 motores de passo (unipolar ou bipolar - bobina única, dupla ou interlaçados) ou 2 servo motores (5Vcc) ;
- Trabalha com motores de 4,5Vcc à 25Vcc;
- 4 pontes H de 0,6A por ponte (1,2A de pico) com proteção térmica e diodos contra retroalimentação;
- Resistores de pull-down (motores desativados durante a entrada de alimentação);
- Botão de reset para arduino.

Pinagem:

- Pinos analógicos: A0 ... A5: livres e podem operar como pinos digital [1];
- I2C: SDA = A4 e SCL = A5;
- Pinos digital usados: 3, 4, 5, 6, 7, 8, 9, 10, 11 e 12;
- Pinos 9 e 10 usados somente para servo motor;
- Pinos 0 (RX) e 1 (TX) estão em uso;
- Pinos 2 e 13 não estão em uso;
- SPI não é possível.
  
Um detalhe importante é que o jumper deve ser desativado quando se utiliza alimentação externa (born EXT_PWR)!

A Figura 4 mostra o motor shield. Já a Figura 5 mostra a pinagem do L298N e a Figura 6 um circuito sugestão para montagem do driver de motor (ponte H) baseado no L298N. Cabe avisar que o driver foi desenvolvido inicialmente para ser usado neste projeto, mas com a aquisição do shield ele não foi testado.

Fig. 4 - Adafruit motor shield.
Como visto anteriormente, este shield utiliza diversas I/Os do Arduino. Desta forma, para facilitar a montagem, solde barramentos de terminal nas regiões indicadas em amarelo (digital 2, A0-A5, gnd e 5V).
Fig. 5 - Pinagem do L298N.
Fig. 6 - Driver ponte H com L298N.
MONTAGEM

Solde 3 pinos do barramento no sensor QRE-1113A, Figura 7. A identificação dos pinos está atrás da placa.
Fig. 7 - Sensor QRE-1113 Analógico.
Sengundo informações do fabricante [2], recomenda-se que o sensor fique 3mm de distância da superfície.

Prenda o Arduino e os sensores no chassi com os espaçadores e parafusos que acompanham o kit. Será necessário fazer uma pequena adaptação para que o sensor fique na distância correta. Utilizei um tubo de caneta.

Faça o download da biblioteca AFMotor [3]. Descompacte o arquivo no diretório /opt/arduino/libraries. O caminho para o diretório pode mudar dependendo do sistema operacional utilizado e/ou organização das pastas. A biblioteca Wire [4] já faz parte da IDE do Arduino.

Copie o código abaixo integralmente e faça o upload para o Arduino.
/*------------------------------------------------------------------
 * ROBO SEGUIDOR DE LINHA
 *
 * Arduino Uno R2, Adafruit Motor Shield e QRE-1113 Analogico
 *
 * Cleber Moretti
 * www.binarycodec.blogspot.com
 * Data: 05/09/2013
 * v.1.0
------------------------------------------------------------------*/
#include <Wire.h>
#include <AFMotor.h>

const int SensorDireito = 0; // Sensor do lado direito - pino A0 - Visto de tras para frente
const int SensorEsquerdo = 1; // Sensor do lado esquerdo - pino A1

AF_DCMotor motor1(1, MOTOR12_1KHZ); // Motor Direito - Born 1 e 1kHz pwm - Visto de tras para frente
AF_DCMotor motor4(4); // Motor Esquerdo - Born 4 e 1kHz pwm - Motores 3 e 4 apenas em 1kHz

#define M1_DEFAULT_SPEED 75
#define M4_DEFAULT_SPEED 75
#define M1_MAX_SPEED 130
#define M4_MAX_SPEED 130

void setup() {
  delay(2000);
}

void loop() {
  int sLadoDireito = analogRead(SensorDireito);
  int sLadoEsquerdo = analogRead(SensorEsquerdo);
 
 if (sLadoDireito >= 300 && sLadoEsquerdo < 300) {
      motor1.run(RELEASE);
      motor4.run(FORWARD);
      motor4.setSpeed(M4_DEFAULT_SPEED);
  }
  else if (sLadoDireito < 300 && sLadoEsquerdo >= 300) {
      motor1.run(FORWARD);
      motor4.run(RELEASE);
      motor1.setSpeed(M1_DEFAULT_SPEED);
  }
  else {
      motor1.run(FORWARD);
      motor4.run(FORWARD);
      motor1.setSpeed(M1_MAX_SPEED);
      motor4.setSpeed(M4_MAX_SPEED);
  }
}
Conecte o motor shield no Arduino e ligue os fios dos motores da seguinte forma (visto de trás para frente): 

- Motor 1 (lado direito) no born M1;
- Motor 2 (lado esquerdo) no born M4.

O fio positivo deve ficar voltado para dentro dos borns, Figura 8.

Ligue os pinos de 5V e Gnd dos sensores nos respectivos pinos do motor shield. 

Os pinos Out devem ser ligados da seguinte forma (visto de trás para frente):

- Sensor do lado direito no A0 do motor shield;
- Sensor do lado esquerdo no A1 do motor shield.
Fig. 8 - Seguidor de linha montado.
TESTE

Respeitando o espaçamento entre os sensores, faça um traçado/pista com fita isolante em uma superfície branca. Não faça curvas fechadas pois dependendo da velocidade ele pode passar reto.

Alimente o Arduino com 9V provenientes de seis pilhas. Não utilize aquelas baterias retangulares.

O vídeo abaixo mostra o robô em funcionamento numa pequena pista de teste feita de cartolina.



MATERIAIS/LINKS RELACIONADOS

9 comentários:

Andrei Porfiro disse...

Parabéns, belo projeto. Gostaria de saber onde você adquiriu o carrinho Magician DG007?

Binary Codec disse...

Obrigado Andrei, ele foi adquirido na loja robocore.net
Abs.

Anônimo disse...

Olá amigo estou utilizando dois motores DC de 5v cada, e comprei esse mesmo shield, esse motores são para um mini carrinho, o problema é que pensei que isso não era um shield e que não iria precisar encaixar no arduino.

Quando eu encaixo ele no arduino e ligo os motores em M1 e M2 certo? Onde eu poderia ligar o sensor ultrassonico?Alguns daqueles furos posso colocar o jumper? Ou terei que soldar em cima, recomenda alguma porta que fique livre com M1 e M2 sendo utilizado?

E sim, eu posso utilizar a voltagem do Arduino certo?

Até mais!

Binary Codec disse...

Olá Anônimo, solde barramentos para Vcc, Gnd, Digital 2 e pinos analógicos. Quanto ao sensor ultrasom, penso que pode ser utilizado os pinos 13 e 2. Outra alternativa é utilizar os pinos analógicos pois eles podem trabalhar como digitais. Veja a referencia 1 nos links relacionados. Boa montagem!

Binary Codec disse...

Não sei qual o modelo de arduino que está utilizando, mas... Não ligue tudo na USB!!

Você pode alimentar o circuito de várias maneiras.

Uma para o arduino e outra para o shield (desligar jumper quando utilizar alimentação externa) separadas. Ou alimentar tudo pelo arduino respeitando os limites recomendados para seu modelo.

Anônimo disse...

no caso para que serve a biblioteca ?

Binary Codec disse...

A wire é utilizada pelo sensor analógico e a adafruit library pelo shield de controle dos motores.

Anônimo disse...

Ola amigo boa noite, meu nome eh carlos. onde voce incluiu o L298N nao o consegui distinguir na foto anexada, o ardafruit foi utilizado junto com o L298N??? vc teria algum esquematico das ligacoes eletricas? gostaria de tentar repetir seu projeto.
krls.silva@hotmail.com

Grato

Binary Codec disse...

Olá Carlos,

O módulo da Adafruit é uma opção muito interessante para ligar diversos tipos de motores, mas ele não foi utilizado junto com o L298. Ainda, este módulo ocupa muitas portas do arduino.

O L298 está indicado no esquema da figura 6. É uma opção para ligar os motores caso não tenha o módulo da Adafruit.

Se este for o caso, recomendo utilizar a versão 2 deste seguidor de linha substituindo o L298 pelo L293D. É muito mais fácil de ligar e também mais barato. Ai, como sugestão recomendo a aquisição de um protoshield para facilitar as ligações.

O esquema de ligação está indicado na figura 4.

A versão 2 está neste link: http://binarycodec.blogspot.com.br/2015/02/robo-seguidor-de-linha-com-arduino-e.html

Qualquer coisa é só dar um toque.

Boa montagem.
Cleber