Kit Iniciante Robótica - 6. Primeiros Movimentos




Chega de piscar LEDs, chegou a hora de programar sua placa Julieta para colocar o seu robô pra andar! Nesse capítulo você aprenderá como mover os motores com a placa, seja indo para frente, para trás, ou mesmo fazendo curvas. Este tópico é de extrema importância já que seus conceitos serão usados em qualquer projeto de robô móvel. Preste bastante atenção no que for proposto aqui, principalmente se você não tiver experiência com uso de bibliotecas.


Movendo o robô para frente


Para facilitar todo o trabalho, chegou a hora de utilizar a Biblioteca FalconRobot. Para isso, a linha #include "FalconRobot.h" deve ser adicionada ao topo do código. Essa linha possibilitará a criação do objeto FalconRobotMotors que possui as funções para controlar os movimentos do seu robô.


Essa linha cria um objeto chamado motors que perimitirá o controlar os motores esquerdo e direito do robô e assim controlar seu movimento. Veja mais detalhes na seção Entendendo o Código.

Antes de enviar este código de exemplo, tenha certeza que o seu robô está em uma posição segura. O programa começará imediatamente depois que você carregar o código em sua Julieta. Isso pode fazer com que ele caia da sua mesa ou derrube algum objeto. Por esse motivo, coloque o robô em uma posição onde as rodas não toquem a mesa.

Importante: para que o exemplo funcione é necessário que os motores estejam devidamente conectados, a chave dos motores esteja na posição ON e a placa esteja sendo alimentada pelas baterias.


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


Após carregar o código para seu robô você deverá ver os dois motores girando par frente em velocidade máxima por um segundo e depois parando.
Se por acaso você observar que uma das rodas está girando para trás ao invés de ir para frente, basta inverter os fios do motor em questão. Por exemplo, se o motor da esquerda está girando para trás, remova o cabo USB e o conector de bateria do robô e inverta os fios do motor esquerdo em seu conector. Reconecte tudo e pronto!


Se os dois motores estiverem girando para frente, desplugue o cabo USB e coloque o seu robô no chão. Aperte o Botão Reset para resetar manualmente o seu programa e veja o seu robô andando para frente pela primeira vez!


Entendendo o código


Adicionar a linha include "FalconRobot" ao topo do código permite acessar um número de classes, objetos e funções que irão auxiliar você a controlar o seu robô muito facilmente. A biblioteca FalconRobot possui rotinas para criação dos seguintes objetos:
  • FalconRobotMotors - controle dos motores
  • FalconRobotButton - leitura dos botões
  • FalconRobotLineSensor - leitura dos sensores de linha
  • FalconRobotDistanceSensor - leitura do sensor de distância
Nesse capítulo o foco é entender como funciona a classe FalconRobotMotors. Essa classe possui os métodos para controlar os motores. Na programação, métodos são as ações ou perguntas que você faz aos objetos.


Lembre-se que nessa linha um objeto chamado motors é criado utilizando a classe FalconRobotMotors. Ela recebe 4 parâmetros, que são, respectivamente, os pinos EN1, EN2, IN1 e IN2 dos motores. Isso é chamado de "inicialização" de um objeto. Agora, você pode utilizar qualquer método que faça parte dessa classe. Para utilizar (ou "chamar") um método, o comando irá iniciar com motores. seguido do nome do método. Veja alguns exemplos:

Movendo para Frente/Trás

motors.drive(velocidade, direcao) aciona os dois motores. Esse método possui dois parâmetros: a velocidade e a direção (FORWARD ou BACKWARD). A velocidade é um valor em porcentagem, onde 0 significa 0% (Motor parado) e 100 significa 100% (motores em máxima velocidade). A direção pode ser FORWARD (para frente) ou BACKWARD (para trás).


Algumas vezes rodar os motores em máxima velocidade faz as rodas derraparem. Se você enfrentar problemas de tração, tente trabalhar com velocidades mais baixas.

Parando os motores

motors.stop() desliga os motores, fazendo o robô parar. Nesse caso, é o mesmo que definir a velocidade para 0%.


Em alguns momentos você perceberá que, dependendo da velocidade que o robô está, ao mandá-lo parar, ele levará um certo tempo até que pare totalmente, pois mesmo ao desligar os motores, o robô tenderá a se mover um pouco mais por inércia.


Indo Além


Agora que você sabe como controlar o seu robô, veja se você consegue fazê-lo mover para frente por 2 segundos, parar por 1 segundo e dar ré por 2 segundos.


Solução de Problemas


Erro de compilação - 'FalconRobotMotors' does not name a type

Isso indica que a Biblioteca FalconRobot não foi adicionada corretamente ao sketch. Isso pode ser resultado de basicamente duas coisas:
  • #include "FalconRobot.h" - essa linha precisa estar no topo do código e escrita exatamente assim.
  • Você não instalou a Biblioteca corretamente. Volte ao Capítulo Softwares e Drivers e tenha certeza de instalar corretamente a Biblioteca FalconRobot.

Os motores não estão girando!

  • Verifique se a chave dos motores está na posição ON
  • Tenha certeza que as pilhas estão devidamente encaixadas em seu robô e que o conector está bem conectado à sua placa Julieta.
  • Tenha certeza que conectou os motores corretamente. Observe o Capítulo Eletrônica para maiores detalhes.

O robô se move, mas gira em círculo!

  • Provavelmente uma de suas rodas está girando para trás ao invés de girar para frente. Identifique qual roda é e inverta os fios desse motor, basta trocar o fio vermelho pelo preto.

O robô não anda reto! Ele está fazendo uma curva!

Isso é muito comum para todos os robôs que possuem rodas motoras independentes. Existem muitas razões para isso, construção do próprio motor, pequena diferença no diâmetro das rodas, etc. Veja abaixo algumas coisas que você pode fazer para diminuir essa diferença:
  • Verifique se não tem nada raspando na roda do robô. Observe se a parte interna da roda não está tocando o chassi. Se isso for verdade, tente deixar uma pequena distância entre a roda e o chassi, apenas o suficiente para que eles não se toquem mais.
  • Para seguir em linha reta, é necessário que as duas rodas girem exatamente na mesma velocidade. Entretanto, girando os motores na velocidade máxima, pode ser que as rodas derrapem, perdendo tração. Portanto, tente utilizar uma velocidade menor que 100%.
  • Usar um encoder seria uma maneira de garantir que as duas rodas girem exatamente a mesma distância. Esse conceito não será abordado nessa apostila, mas você pode buscar maiores informações sobre o assunto.


Fazendo Curvas


Nesse experimento você aprenderá como fazer o seu robô realizar curvas ajustando a velocidade do motor esquerdo e direito de maneira independente. Serão apresentados novos métodos da classe FalconRobotMotors que permitirão controlar os motores separadamente.
Mais uma vez, lembre-se de manter o seu robô em uma posição segura para que ele não caia da sua mesa ou derrube algum objeto. Mantenha as rodas do robô longe da mesa ou de qualquer outra superfíce.

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


Após carregado, o sketch fará com que as rodas de seu robô gire um pouco, mude de direção e pare. Remova o cabo USB e coloque o robô no chão. Pressione o botão reset para reiniciar o programa. Observe seu robô se movendo!
Em uma superfície totalmente plana e sem obstáculos, seu robô deve seguir para frente em linha reta, girar cerca de 90ª para a direita e, em seguida, mover-se para frente novamente.
Calma, se o seu robô não estiver girando 90º corretamente, existem duas coisas que você pode fazer para ajustar esse giro:
  • Tente alterar o tempo de rotação modificando o tempo do delay(500). O padrão do exemplo é 500ms, tente aumentar ou diminuir de acordo com o resultado que você tem observado.
  • Você pode também alterar a velocidade com que o robô faz o giro, até uma velocidade que faça com o que o robô gire os 90º desejados.


Entendendo o Código


No último exempo você utilizou o comando motors.drive(velocidade, direcao) para controlar os dois motores de modo a fazer o robô ir para frente ou para trás.
Para controlar os motores individualmente, a classe FalconRobotMotors possui dois métodos utilizados no exemplo:


Similar ao .drive(velocidade, direcao), a velocidade é um valor de 0 a 100. Onde 0 é a velocidade nula, ou seja, motor parado, e 100 é a velocidade máxima. E a direcao, FORWARD = Frente, BACKWARD = Ré.
A Plataforma Robótica Falcon é bastante ágil, por isso é interessante utilizar velocidades menores para virar. No exemplo, a velocidade utilizada foi de 50%.

setup() vs. loop()

Até esse ponto, os códigos foram todos construídos dentro do setup(). Qualquer código que for colocado entre as chaves { e } depois do setup() irá ser executado apenas uma vez. Isso é muito conveniente para testar instruções ou rotinas únicas. Mas, e se você desejar repetir um padrão, como um quadrado por exemplo?
Qualquer código que for colocado no loop() irá ser repetido infinitas vezes enquanto o robô estivar energizado e não for resetado. No código de exemplo foi colocado um código para que o seu robô faça uma figura 8. As duas barras em frente cada linha de código está comentando ele. Remova as barras para ver seu robô fazer uma figura 8.


Você provavelmente terá que ajustar os valores de velocidade e delay para que a figura fique mais próxima do desejado.


Indo Além


Com os conceitos desse exemplo você conseguiria programar seu robô para fazer um quadrado? Agora que você já ajustou a curva de 90º, basta você repetir isso quatro vezes para que seu robô faça um trajeto parecido com uma caixa.

Agora é hora de usar a imaginação, quais outras figuras geométricas ou qualquer tipo de padrão você consegue fazer?


Solucionado Problemas


O robô não consegue andar! Mas você ouve um barulho agudo!

  • Se você consegue sentir que o motor está tentando girar, mas não consegue, tente aumentar a velocidade nominal no código. Se isso não resolver, nem com a velocdade máxima, talvez seja a hora de trocar as pilhas de seu robô.