Controle de Motores com a Vespa
Introdução
Você recebeu a sua Vespa e quer saber como usá-la? Não se preocupe, estamos aqui para ajudá-lo nestes primeiros passos e para mostrar como usar as funções básicas da biblioteca desenvolvida para ela.
Neste tutorial você verá como fazer o acionamento de motores DC pela Vespa, o comportamento de cada função de controle dos motores da biblioteca da Vespa e como isso pode ser aplicado na prática.
Lista de Materiais
Lista completa de produtos
comprarVespa
Suporte para 2 Baterias Li-Ion 18650
Cabo USB Micro B 80cm
Atenção: os motores DC 3-6V com Caixa de Redução e Eixo Duplo, quando comprados separadamente como na lista acima, não são enviados com fios soldados, portanto será necessário fazer a solda dos terminais dos motores usando cabos elétricos, como este (independente da cor).
Observação: as baterias 18650 recomendadas e listadas acima são recarregáveis, mas devem ser carregadas utilizando um carregador adequado (como este, por exemplo).
Circuito
Para controlar motores DC com a Vespa, basta conectar os fios soldados aos terminais dos motores aos bornes removíveis, conforme mostrado no esquema elétrico abaixo. Os fios do suporte de baterias 18650 também devem ser conectados ao borne removível da placa, o mais próximo do conector micro USB. Porém, neste caso, atente-se à polaridade.
Para conectar os fios nos bornes da Vespa, é necessário desparafusar os contatos e então "prensar" a parte exposta dos fios, parafusando novamente o contato, conforme mostrado no vídeo abaixo.
Primeiro Controle
Neste primeiro projeto, apenas mostraremos como acionar os motores para frente e para trás.
Código
Para o controle dos motores DC, usaremos a biblioteca da Vespa, portanto, para instalá-la, siga os passos do tutorial Primeiros Passos com a Vespa.
Como mencionado antes, neste primeiro contato apenas mostraremos como acionar os motores para frente e para trás. Para isso, carregue o código a seguir na sua Vespa.
Entendendo o Código
O código acima se inicia com a inclusão da biblioteca "RoboCore_Vespa", e em seguida é criado o objeto motores
como uma instância VespaMotors
da biblioteca, que nos permitirá o controle dos motores conectados à Vespa. Para finalizar as declarações globais do código, declaramos uma variável para armazenar a velocidade máxima de acionamento dos motores (VELOCIDADE_MAXIMA
) e uma variável para armazenar o intervalo de espera entre as mudanças de estado do controle dos motores (TEMPO_PAUSA
).
Neste momento, vale frisar que as velocidades máxima e mínima para o controle de motores DC da Vespa são 100 e 0, respectivamente.
Já nas configurações do código (função void setup()
), não é necessário executar nenhum comando.
A repetição do código (função void loop()
) é iniciada com a função forward()
da biblioteca, que é chamada através do comando motores.forward(VELOCIDADE_MAXIMA)
no código. Ela é responsável por acionar ambos os motores no sentido anti-horário com a velocidade solicitada entre parênteses (no caso deste exemplo, é a velocidade máxima). Após o acionamento dos motores, os motores são mantidos girando durante o tempo armazenado na variável TEMPO_PAUSA
, e em seguida os motores são parados graças à função stop()
, que é chamada através do comando motores.stop()
. Com os motores parados, é aguardado novamente o tempo armazenado na variável TEMPO_PAUSA
antes da execução de outra função de controle.
Neste ponto, vale lembrar a relação entre os sentidos de rotação dos motores com as suas polaridades no circuito. A função forward()
aciona os dois motores da mesma maneira pensando em mover o robô para frente, ou seja, eles giram no mesmo sentido. Entretanto, isso só é possível porque as ligações dos motores estão invertidas nos bornes, já que os motores ficam espelhados no chassi do robô. Caso um dos motores esteja com a conexão incorreta, ele girará no sentido oposto ao esperado e o robô ficará girando ao invés de andar para frente. Inclusive, se isso ocorrer nos seus testes, inverta a conexão do motor que está girando no sentido oposto nos bornes da Vespa.
Após o acionamento no sentido anti-horário (para frente) dos motores, eles são acionados para trás, no sentido horário, pela função backward()
, que é chamada no código pelo comando motores.backward(VELOCIDADE_MAXIMA)
. Assim como na função forward()
, a função backward()
também depende de um número entre 0 e 100 para ser chamada. Em seguida, da mesma forma que feito com o acionamento de movimentação frontal, é aguardado o tempo salvo na variável TEMPO_PAUSA
para parar os motores e para uma nova repetição do laço.
O Que Deve Acontecer
Após carregar o código para a placa com os motores e as baterias conectadas, ligue a placa pela chave liga-desliga e observe que os motores serão acionados em conjunto para frente e para trás. Lembrando que a polaridade dos motores é importante, portanto, se for necessário, inverta a conexão de um dos motores para que eles operem como o esperado.
Atenção: não deixe as baterias descarregarem abaixo de 6,8 V. As baterias de lítio precisam sempre estar com pelo menos 3,4 V por célula para funcionarem corretamente.
Demonstração Completa
No projeto anterior, apenas acionamos os motores para frente (sentido anti-horário) e para trás (sentido horário) utilizando algumas funções da biblioteca da Vespa. Entretanto, essas são apenas duas das funções que a biblioteca disponibiliza, e no projeto a seguir todas as demais serão mostradas e explicadas.
Código
Como um primeiro controle simples dos motores, faremos apenas com que eles girem no sentido horário e anti-horário, e então fazer com que os motores girem em sentidos opostos, para simular possíveis movimentações de um robô. Para executar esta demonstração, carregue o código a seguir para a sua Vespa.
Entendendo o Código
Este código se inicia exatamente igual ao código do projeto anterior, com a inclusão da biblioteca "RoboCore_Vespa" e com a criação do objeto motores
como uma instância VespaMotors
da biblioteca.
Em seguida, para encerrar as declarações globais do código, temos a declaração das variáveis VELOCIDADE_MAXIMA
, VELOCIDADE_CURVA
, TEMPO_PAUSA
e TEMPO_ACELERACAO
, que armazenam o valor de velocidade máxima para o acionamento dos motores, a velocidade em que um dos motores assumirá para uma curva, o tempo de pausa que haverá entre as atualizações de estado dos motores e o tempo para atraso de aceleração e desaceleração para o controle individual dos motores, respectivamente.
Já na configuração do código (função void setup()
), apenas inicializamos o monitor serial, para que seja possível monitorar a execução do código.
No início da repetição do código (função void loop()
), temos as funções de controle conjunto dos motores, ou seja, as funções que permitem que os motores sejam acionados ao mesmo tempo. As primeiras delas são as funções forward()
e backward()
, como mostrado anteriormente. Esses acionamentos mantêm os motores girando durante o tempo salvo na variável TEMPO_PAUSA
, e então mantidos parados durante este mesmo intervalo após a execução da função stop()
.
A próxima função utilizada pelo código é a função turn()
da biblioteca, que deve ser chamada com dois parâmetros (valores). O primeiro deles é o valor da velocidade para o motor da esquerda e o segundo é a velocidade para o motor da direita. Em outras palavras, a função deve ser chamada através do comando motores.turn(VELOCIDADE_ESQUERDA, VELOCIDADE_DIREITA)
, onde ambos os valores podem ser números de 0 a 100. Esta função também permite o uso de valores negativos, o que faz com que os motores sejam acionados para a movimentação traseira (horário), já que o valor positivo, por padrão, aciona os motores para frente (anti-horário). No código acima são mostradas quatro possibilidades de uso para girar um robô, que são: a curva para a esquerda indo para frente; a curva para a direita indo para frente; a curva para a esquerda indo para trás; e a curva para a direita indo para trás. Lembrando que é possível fazer diversas combinações de velocidades para movimentações diversas de um robô.
Após as execuções da função turn()
de maneiras distintas, encerramos a demonstração de funções de controle conjunto da biblioteca da Vespa e agora veremos as funções de controle individual dos motores. Para controlar a velocidade de cada motor separadamente, é possível utilizar as funções setSpeedLeft()
e setSpeedRight()
para o motor da esquerda e da direita, respectivamente. Essas funções dependem apenas do parâmetro de velocidade desejada para serem chamadas entre parênteses para poderem acionar os motores, e novamente é possível utilizar um valor entre 0 e 100, sendo também possível um valor negativo para que o giro seja invertido.
No código acima, o uso destas funções é feito através de rampas de aceleração e desaceleração, que podem ser muito úteis para diminuir picos de consumo de corrente de motores DC e até para que o robô parta mais suavemente.
Após a demonstração das funções, aguarda-se o dobro do tempo armazenado na variável TEMPO_PAUSA
antes da repetição do código.
O Que Deve Acontecer
Após carregar o código para a Vespa, ligue-a pela chave liga-desliga (posição "ON") e observe o resultado. Será possível observar que os motores executarão a sequência de demonstração programada, como no GIF abaixo. A Vespa permite a alimentação externa e USB conjunta, portanto também é possível monitorar a execução do código pelo monitor serial (em 115200 bps).
Atenção: não deixe as baterias descarregarem abaixo de 6,8 V. As baterias de lítio precisam sempre estar com pelo menos 3,4 V por célula para funcionarem corretamente.
Indo Além
Este código é apenas uma demonstração do acionamento dos motores DC pela Vespa com as funções da sua biblioteca, porém é possível utilizar esta funcionalidade da placa para o controle de robôs, inclusive através de um controle remoto por Wi-Fi ou Bluetooth. Um exemplo desses está no tutorial Controle Web de Robô com a Vespa.
Além disso, também temos diversos outros tutoriais demonstrando todas as funcionalidades da Vespa.
Conclusão
Neste tutorial vimos as funções de controle de motores DC da biblioteca da Vespa, os seus comportamentos esperados e como elas podem ser utilizadas para a movimentação de robôs.
Solução de Problemas
Um ou os dois motores estão girando no sentido oposto ao esperado
Se, na execução da função forward()
, um dos motores, ou os dois, estiver girando no sentido horário ao invés do anti-horário, é sinal que ele está com a polaridade invertida, portanto apenas desconecte e conecte os fios deste motor na ordem invertida.
LED vermelho aceso
Se a Vespa acender um LED vermelho e não executar o código ao ligar a placa, verifique a conexão do suporte de baterias, pois é sinal que ele foi conectado com a polaridade invertida.