Controle de Motores com a Rocky
Introdução
A mais nova placa da RoboCore, a BlackBoard Rocky, é perfeita para projetos que precisam do controle independente de três motores DC, como os robôs de combate da categoria Cupim, que dependem de dois motores para a locomoção e um motor para a arma.
Neste tutorial veremos como gravar códigos na Rocky e como controlar os motores, em um primeiro projeto mostrando como utilizar dois dos motores para locomoção, e em um segundo projeto como acionar os três motores individualmente.
Lista de Materiais
Para este tutorial você precisará dos seguintes itens:
Lista completa de produtos
comprarBlackBoard Rocky
Conversor USB x UART
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).
Biblioteca
Para controlar a Rocky de maneira simples, desenvolvemos uma biblioteca que pode ser instalada diretamente pelo "Gerenciador de Bibliotecas" da Arduino IDE. Para instalá-la, basta digitar "Rocky" na barra de pesquisa do gerenciador, e então pressionar o botão "Instalar" da opção "RoboCore - Rocky". Após alguns instantes a biblioteca estará instalada e pronta para ser usada com a placa, como mostrado na imagem abaixo.
Se preferir, você pode baixar o arquivo compactado em nosso repositório no GitHub e instalar a biblioteca manualmente.
Gravação do Primeiro Código
Antes de vermos o controle dos motores da placa, vamos ver como carregar um código na Rocky, e nada melhor do que começar com o famoso Blink, que inclusive é um dos exemplos da biblioteca da Rocky.
Conexão USB-UART
Antes de conectar o conversor USB-UART no seu computador e na Rocky, altere o jumper seletor de tensão de 5V (padrão) para 3,3V, e então conecte-o à Rocky. Neste momento, atente-se à polaridade do módulo e da placa. O pino de GND do conversor deve estar conectado no pino de GND da placa (o pino mais próximo do botão BOOT), como mostrado na imagem abaixo.
Após a conexão do conversor à placa, conecte o conversor ao seu computador utilizando o cabo USB Micro.
Atenção: para que o conversor USB-UART seja reconhecido no seu computador, pode ser necessária a instalação do driver USB seguindo os passos deste tutorial.
Configuração da IDE
Com o conversor USB-UART conectado à Rocky e ao seu computador, configure a Arduino IDE para que ela programe a porta COM correspondente ao conversor no seu computador, e o modelo de placa "ESP32 Dev Module", como na imagem abaixo.
Código
Como mencionado anteriormente, a própria biblioteca da Rocky já possui um exemplo "Blink" preparado para acionar o LED interno da placa a cada um segundo. Para acessá-lo, basta abrir o exemplo disponível da biblioteca, como na imagem abaixo.
Se preferir você pode copiar o código abaixo:
O Que Deve Acontecer
Com o código aberto e a sua IDE configurada, pressione o botão para carregar o código para a placa. Você verá que os LEDs RX e TX do conversor irão piscar durante a gravação e, assim que ela estiver concluída, o LED L da placa piscará de 1 em 1 segundo, como no GIF abaixo.
Você deve ter notado e se perguntado sobre o segundo exemplo "Blink_Rocky" da biblioteca da placa. Ele é uma alternativa que executa a mesma função do exemplo visto acima, porém utilizando um objeto para facilitar o piscar do LED da placa em códigos mais complexos e que não podem ter interrupções de execução de código (causadas pela função delay()
). Abra-o para ver como ele é estruturado, se tiver curiosidade.
Acionando Motores para Locomoção
A biblioteca da Rocky possui uma série de funções que acionam em conjunto dois motores, para facilitar a locomoção dos robôs, e veremos estas funções neste projeto.
Circuito
Para o acionamento de dois motores da Rocky para locomoção, monte o circuito a seguir.
Atenção: como a BlackBoard Rocky está sendo alimentada pelas baterias neste circuito, o conversor USB-UART não pode alimentar a placa também, senão poderá haver um dano permanente na placa ou no conversor. Para evitar isso, remova o jumper seletor de tensão do conversor, e guarde-o.
Código
Com circuito montado, carregue o código a seguir na sua BlackBoard Rocky. Lembrando novamente que o jumper seletor de tensão do conversor USB-UART deve estar desconectado do mesmo.
Entendendo o Código
O código se inicia com a inclusão da biblioteca da Rocky que instalamos anteriormente, e a criação do objeto motores
como instância de RockyMotors
da biblioteca. Com este objeto conseguiremos controlar os motores como desejamos.
Como todas as configurações necessárias para o controle dos motores pela placa são feitas internamente pela biblioteca, não é necessário realizar nada na configuração do código (função void setup()
).
Já na repetição do código, temos as funções para acionamento dos motores pela placa. A primeira delas é o comando motores.forward()
, que aciona os motores A e B com a velocidade máxima (o valor pode ser entre 0 e 100 %), para que o robô ande para frente. Após manter os motores girando durante 1 segundo, os motores são parados através do comando motores.stop()
. Em seguida, através do comando motores.turn(90,30)
fazemos com que o robô gire para a direita, acionando o motor da esquerda com uma velocidade maior que o da direita graças à função turn(velocidade_esquerda, velocidade_direita)
. Após manter o robô girando durante 1 segundo e pará-los novamente, o robô é girado para a direita invertendo o acionamento da função turn()
anterior, gerando o comando motores.turn(30,90)
. Em seguida, acionamos os motores para que o robô se mova para trás usando o comando motores.backward(100)
. Por fim, giramos o robô novamente o robô para ambos os lados, porém agora girando os motores para trás, usando números negativos nas funções turn()
.
O Que Deve Acontecer
Assim que o código for gravado corretamente para a placa, os motores A e B serão acionados seguindo a sequência de movimentos mencionados anteriormente, como no GIF abaixo:
Acionamento Independente dos Três Motores
Para aproveitar ao máximo o potencial da Rocky, precisamos aproveitar os três drivers de motores da placa, e veremos como controlá-los individualmente neste projeto.
Circuito
Para o acionamento dos três motores da Rocky monte o circuito a seguir.
Atenção: como a BlackBoard Rocky está sendo alimentada pelas baterias neste circuito, o conversor USB-UART não pode alimentar a placa também, senão poderá haver um dano permanente na placa ou no conversor. Para evitar isso, remova o jumper seletor de tensão do conversor, e guarde-o.
Código
Com circuito montado, carregue o código a seguir na sua BlackBoard Rocky. Lembrando novamente que o jumper seletor de tensão do conversor USB-UART deve estar desconectado do mesmo.
Entendendo o Código
O código deste projeto se inicia da mesma forma que o código do projeto anterior, onde incluímos a biblioteca da placa e criamos o objeto motores
para o controle dos motores da placa.
Já na repetição do código, temos o laço for(int i = 0; i < 101; i++)
que incrementa a variável interna i
de 0 até 100. Então, a cada repetição deste laço, acionamos o motor A com o valor da variável interna através do comando motores.setSpeedA(i)
. Ao sair do laço, o motor se mantém girando em velocidade máxima durante meio segundo, e então ele é parado. Após o acionamento do motor A, temos o acionamento do motor B, que é feito da mesma forma, porém variando a variável interna entre 0 e -100 para que ele gire no sentido oposto do motor A. Por fim, o motor C é acionado da mesma forma que o motor A.
O Que Deve Acontecer
Com o código gravado, os três motores da Rocky serão adicionados gradativamente em sequência, como no GIF abaixo.
Indo Além
Outra funcionalidade importante da placa é que ela possui monitoramento de tensão da bateria, o que é fundamental para evitar que as suas baterias descarreguem além do mínimo permitido, quando são perdidas. Você pode entender melhor como essa funcionalidade funciona através do exemplo "SupplyVoltage" da biblioteca da placa.
Conclusão
Neste tutorial vimos os primeiros passos de uso da Rocky, e como controlar os seus três motores de forma independente.
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.