Kit Iniciante Robótica - 8. Robô Seguidor de Linha




O Kit Iniciante para Robótica acompanha um par de Sensores de Refletância QRE Analógicos para detecção da linha. Esses sensores trabalham emitindo um feixe de luz infravermelha (IR) em direção a superfície abaixo do robô e medindo o quanto de luz é refletida. No sensor, você notará que existem dois pequenos retângulos. Um deles é o emissor IR e o outro é o detector.


Os sensores de linha funcionam melhor quando estão perto da superfície abaixo do robô. O sensor deve estar cerca de 3mm acima do solo. Essa é uma ótima distância para que o emissor IR ilumine a superfície e realize a leitura da luz refletida. Mas fique tranquilo, se você seguiu o passo-a-passo de montagem corretamente, os sensores estarão bem posicionados.
Nota: Os olhos humanos não são sensíveis a luz infravermelha, portanto, a menos que você seja um super-herói, você não conseguirá enxergar a luz emitida pelos sensores. Mas se você utilizar uma câmera CCD, como a de seu smartphone, você poderá ver pequenos pontos de luz saindo de seus sensores.



Enxergando a Linha


Nesse exemplo iremos simplesmente ler e imprimir os valores de nossos Sensores de Linha. É interessante que você teste os sensores sobre diversos cenários para possa entender o comportamento deles.
Carregue esse código de exemplo para a placa Julieta. Para isso, vá em: Arquivo->Exemplos->RoboCore Falcon Robot Library->Exp4_1_LineFollowing ou copie e cole o código de exemplo abaixo.


Após carregar o código para seu robô, abra o Monitor Serial para visualizar a leitura de seus sensores. Você deve observar uma janela assim:


Se você realizou as ligações corretas, na primeira coluna você terá os valores lidas pelo sensor esquerdo e na segunda coluna os valores lidos pelo sensor direito.


Exercício: Entendendo o comportamento dos Sensores


Os sensores infravermelhos operam em um alcance bem curto. Eles são ótimos quando estão entre 3mm e 5mm da superfície. Teste isso com o seu próprio robô. Conforme a figura abaixo, pegue uma folha de papel em branco e cole um pedaço da Fita Isolante que acompanha o Kit.


Com o robô conectado ao seu computador, realize os seguintes testes:
  • Coloque o seu robô sobre sua mesa. Quais sãos os valores lidos pelos dois sensores?
  • Posicione-o sobre a folha com fita. Quais os valores lidos sobre a fita? E sobre a superfície branca?
  • Com o robô ainda sobre a mesa, apague as luzes do ambiente ou cubra ele com um cobertor ou algo do gênero. O que acontece com os valores lidos? O que você acha que está causando isso?
  • Mova o robô lentamente para a borda da mesa. Observe as leituras enquanto os sensores se aproximam da borda da mesa. Quais são os valores dos sensores quando eles estão fora da mesa?
Agora você pode utilizar esses valores para programar seu robô para fazer coisas como ficar sobre a mesa ou seguir uma linha!


Entendendo o código


Para configurar uma conexão entre o robô e seu computador, é necessário utilizar o Objeto Serial no Arduino. No setup(), o comando Serial.begin(9600); inicializa a Serial do Arduino e determina a velocidade com que os dados são trasmitidos e recebidos entre o robô e o computador. O valor de 9600 define o baud rate, ou seja, o número de bits por segundo. Essa é uma boa velocidade para a maiora das aplicações, mas outras velocidades são suportadas pelo Arduino, como: 300, 1200, 2400, 4800, 9600, 14400, 19200, 28800, 38400, 57600, and 115200.


Para enviar dados do robô para seu computador, você pode utilizar basicamente dois comandos: Serial.print(""); e Serial.println("");. O primeiro comando, Serial.print(""); simplesmente imprime o texto entre aspas ("") ou algum dado (em forma de número ou variável) para o barramento Serial - isso é mostrado no Monitor Serial. O segundo comando, Serial.println(""); é o mesmo, mas adiciona um caractere de retorno de carro e de nova linha, movendo o cursor para o início da próxima linha.


Imprimindo Caracteres Especiais

Existem alguns caracteres especiais que você pode imprimir. Abaixo você confere alguns que são utilizados em C e C++:

CódigoDescrição
\tCaractere TAB
\"Aspas Duplas
\'Aspas Simples
\nCRLF - nova linha

Biblioteca FalconRobot

O FalconRobotLineSensor é um objeto criado para facilitar a interação com os sensores de linha que acompanham o Kit. No robô, os sensores de linha foram conectados aos pinos A2 e A3 da Julieta. Por esse motivo, nas linhas abaixo foi criado um objeto cuidar da leitura de cada sensor.


A classe FalconRobotLineSensor possui vários métodos, mas para esse projeto em específico o principal é o xxxx.read();. Este método retorna um valor entre 0 e 1023 baseado na tensão de entrada do sensor. Lembre-se que o xxxx representa o nome do ojeto(nesse caso, lineSensor1 ou lineSensor2).



Solução de Problemas


Nada está sendo impresso no Monitor Serial!

  • Verifique se o baud rate foi configurado corretamente em seu monitor serial. Existe um menu no canto inferior direito, ele deve estar configurado para o baud rate de 9600.

O valor do meu sensor não muda!

  • Verifique se os sensores foram corretamente conectados em sua placa Julieta.
  • Tente trocar um sensor com outro.


Agora que você já entendeu como funcionam os sensores de reflectância infravermelhos, chegou a hora de aprender como fazer o seu robô "andar na linha"!

gif_seguidordelinha.gif

Uma curiosidade: você sabia que existem várias competições de robôs seguidores de linha em todas as partes do mundo, inclusive no campeonato mundial de robótica que a RoboCore organiza todos os anos? É isso mesmo, os conceitos base que você aprenderá aqui poderão ser utilizados para quem sabe construir um robô de competição!


Seguindo a Linha


O algoritmo para manter o robô sobre o percurso é bastante simples. Note que o objetivo principal é manter sempre os dois sensores sobre a linha, pois dessa maneira o robô estará centralizado no caminho que deve percorrer. Portanto, a lógica básica que deve ser implementada é:
  1. Se os dois sensores estejam sobre a linha, ande para frente(motor esquerdo e direito com a mesma velocidade).
  2. Se o sensor esquerdo estiver sobre a linha e o sensor direito estiver fora da linha, vire para esquerda(motor esquerdo um pouco mais lento e o motor direito um pouco mais rápido).
  3. Se o sensor direito estiver sobre a linha e o sensor esquerdo estiver fora da linha, vire para direita(motor direito um pouco mais lento e o motor esquerdo um pouco mais rápido).


Note que também existe uma quarta hipótese onde os dois sensores estão fora da linha (4), porém neste tutorial serão consideradas apenas as três primeiras situações, deixando a seu critério escolher o que fazer quando esse último caso ocorrer.

Carregue esse código de exemplo para a sua Plataforma Falcon. Para isso, vá em: Arquivo->Exemplos->RoboCore Falcon Robot Library->Exp4_2_LineFollowing ou copie e cole o código de exemplo abaixo.


Após carregar o código para seu robô, posicione-o sobre a folha branca com fita que você fez no último capítulo. Tente replicar as hipóteses citadas acima e verifique se o robô responde conforme a lógica necessária para seguir a linha. Ou seja, coloque o robô com os dois sensores em cima da linha e veja se os dois motores giram no mesmo sentido, fazendo o robô ir para frente. Faça o mesmo para os casos em que apenas um sensor está sobre a linha e veja se o robô vira para o lado correto.


Exercício: Construindo uma pista


A parte mais legal em construir um robô que segue linha é oberservá-lo percorrendo um percurso sozinho. Portanto nada mais justo que você construa um pequeno circuito para seu robô.


Para isso, basta aplicar a fita isolante que você recebeu junto do Kit sobre uma superfície clara e grande o suficiente para o seu circuito. Lembre-se que é importante que exista uma boa diferença de reflectância entre a fita preta e a superfície onde a pista é construída para que o robô consiga identificar a linha.
É importante que a superfície seja clara, plana e sem grandes ondulações ou vãos. Você pode construir sobre uma mesa, sobre cartolinas ou até em um chão que não tenha grandes depressões. Fique atento também para o espaçamentos entre as linhas, pois se dois trechos da pista estiverem muito perto, as chances de o robô se perder aumentam consideravelmente.

Atenção: se você construir sua pista em uma superfície elevada, como uma mesa, fique muito atento sempre que colocar o robô para seguir, pois eventualmente ele poderá sair do percurso e até mesmo cair da mesa.



A imagem acima mostra um bom exemplo de pista para se construir. É um modelo simples e que provavelmente seu robô não terá problemas em seguir o percurso.


Entendendo o código


Nesse exemplo foram utilizadas duas constantes. A constante LINETHRESHOLD e a constante SPEED. A primeira, LINETHRESHOLD, define qual o limite entre a linha escura e a superfície da pista. Ou seja, se o valor de sensor estiver abaixo do limite, então o sensor está sobre a superfície branca, caso ele esteja acima do limite, então o sensor está sobre a linha. Já a segunda, SPEED, define a velocidade nominal dos motores quando ele deve seguir em frente.
Note que nesse código foi utilizado a expressão #define. Essa palavra permite a criação de constantes sem ocupar a memória de variáveis do seu Arduino.


A parte do código onde a lógica propriamente dita é implementada está nas linhas abaixo. Você pode observar 3 condicionais. Cada uma delas trata dos casos citados no início desse capítulo. O primeiro if cuida da ocasião onde os dois sensores estão sobre a linha, definindo as velocidades dos motores para a velocidade nominal, fazendo com que robô siga em linha reta.
Já o segundo condicional, else if cuida do caso onde apenas o sensor direito está sobre a linha e o robô deve virar à direita. Nesse caso, a velocidade do motor da direita é reduzida e a do motor da esquerda aumentada.
No último if do programa cuida do ultimo caso, onde o robô deve virar para esquerda.


Vale aqui uma explicação sobre a rotina if e else if, ambas utilizadas no código. A palavra IF em inglês significa SE, em português, enquanto que ELSE IF significa SE NÃO, SE... Ou seja, utilizamos as rotinas para expressas o que queremos que seja feito caso uma condição seja atendida, e o que queremos que aconteça caso essa mesma condição não seja atendida. Isso fica mais fácil de entender se colocarmos da forma que pensamos. Vejamos:


Note que o símbolo && significa que as duas condicionais tem que ser atendidas para uma ação ser executada.

Indo Além


Indo mais rápido

Esse código realmente só funciona quando o robô está se movendo devagar e as vezes ele sairá da linha em curvas acentuadas. O que você pode fazer para que funcione melhor?
Dica: existe uma técnica de controle muito popular chamada PID que é muito utilizadas para as mais diversas aplicações onde se precisa estabilizar um sistema com entradas e saídas, como um robô seguidor de linha, por exemplo. Para saber mais, clique aqui.

Outros experimentos relacionados

Com os conceitos aprendidos nesse capítulo você desenvolver outros experimentos legais. Por exemplo, você seria capaz de modificar o código de tal maneira que, ao colocar o robô dentro de um quadrado, círculo ou qualquer outra forma geométrica fechada, ele se mantenha dentro do espaço delimitado?


Solução de Problemas


O robô vibra muito na hora de seguir!

  • Ajustando os valores de velocidade nominal, o valor limite da linha e os valores que são incrementados e decrementados na hora de virar, você conseguirá fazer com que o robô siga mais suavemente o percurso.

O robô não segue a linha

  • Verifique as conexões dos sensores e dos motores, pois é possível que alguma ligação esteja invertida e o circuito não corresponda com a lógica implementada no código.