Mag-6 Rover 6WD
Eu sempre fiquei admirado com os veículos para todo tipo de terreno e até montei o Pix3l Explorer baseado na plataforma EV3 com a capacidade de receber informações via rádio controle. Ele desempenhava bem a função mas era muito lento e ao mesmo tempo adquirir sensores e motores da Lego Mindstorms aqui no país é caríssimo.
Pesquisando um pouco, eu vi que poderia fazer um veículo utilizando o Arduino como controlador e aí surgiu a idéia de um veículo com tração nas 6 rodas, ou 6WD (Six Wheel Drive). Depois de reunir os componentes tive de optar como montar o chassis e decidi pelos tijolos da Lego que são bem mais versáteis e divertidos.
As primeiras versões foram problemáticas em virtude da transmissão, porque os dentes pulavam ao receber maior esforço. Utilizei uma peça especial (em preto na foto) que tinha as distâncias corretas para a coroa e pinhão em cada roda.
Depois disso tive de reformular o eixo cardã para aceitar uma caixa de transmissão para transferir melhor a força no eixo. Nos primeiros testes estava acoplando o motor direto no eixo, mas era muita força direto a ele. Assim com a caixa de transmissão (3 engrenagens na foto) melhor projetada e firmemente fixada tudo deu certo.
Foi um grande alívio ver o chassis montado com a tração nas 6 rodas. Já tinha visto veículos funcionarem em videos na internet, mas fiquei muito feliz quando consegui ver minha criação se deslocando pelo chão da casa.
Para energizar o conjunto, decidi utilizar bateria de Li-Po que é suficiente para tudo. Aos menos experientes fica aqui a dica de manusear estas baterias com cuidado e também atenção especial na carga e descarga. O lítio é um componente muito volátil e requer carregadores especiais com a função Li-Po que hoje em dia é muito comum. Na descarga deve-se ter atenção especial para não passar dos 3V por célula, sob pena de danificar a bateria. Vou colocar um alarme para proteger a mesma na próxima versão de hardware. A bateria 3S (11,1V) de 1500mA ficou localizada no fundo do veículo para baixar bem o centro de gravidade.
Depois da base do chassis estar pronta foi a vez de fixar os motores no local. Na verdade não havia local para isso, mas pensando um pouco encontrei a posição ideia entre os 2 eixos traseiros. Um ponto chave na montagem foi adicionar dois suportes quadrados de madeira, com 3mm de espessura, fixados na caixa de redução com 2 parafusos de 3mm de diâmetro. Este artifício foi necessário para evitar que os motores girarem em seu próprio eixo durante o funcionamento.
Após a fixação dos motores e da bateria foi a vez da chave geral, da placa Arduino e Shields. A chave é importante para evitar a necessidade de ligar e desligar o conector da bateria todas as vezes. Os mais acostumados com estes conectores de baterias de Li-Po sabem que não é nada fácil. A chave também só pode ser utilizada neste projeto devido ao baixo consumo dos motores.
As placas ficaram acomodadas na parte traseira do Mag-6 com direito a travas para não saírem do lugar em movimento. Temos 3 “andares” de placas, sendo na ordem: Arduino Mega, Super Motor Driver da Pololu e Protofull para XBee. Vale explicar aqui que o uso de uma Arduino Mega no lugar de uma outra placa mais simples, deve-se aos próximos passos do projeto que envolvem o deslocamento autônomo e uso de GPS. Assim um processador com maior capacidade e com mais portas será vital para ligar um display de LCD e mais sensores.
Para facilitar a comunicação serial entre o computador via USB (quando ligado) e o módulo XBee, optei por utilizar a porta Serial 1 para o segundo. Desta forma as comunicações seriais podem se comunicar sem conflitos ou necessidades de mudança de jumpers no shield. Os fios verde e azul ligam o XBee a Serial 1 nos pinos 18 e 19.
Na foto acima podemos ver como ficou o Mag-6 nesta primeira fase. Vale destacar que ainda teremos muito trabalho pela frente para que ele possa andar de forma autônoma e segura por ai, mas este é o passo inicial para que possamos testar a plataforma e ver se a mesma responde rápido e de forma confiável aos comandos. Para os primeiros testes fiz o video abaixo
Aguardem que estarei postando as evoluções do projeto conforme as novas fases forem se concretizando. Até a próxima!
Para os que curtiram o funcionamento do Mag-6 segue abaixo o código utilizado neste primeiro teste
/*
*******************************************************
Programa de movimentacao do MAG6 transmissao de comandos
Via XBee do Game Pad (ainda em testes)
Primeiros testes – versao apenas digital para joysticks
Autor Magneto – Setembro 2015
*******************************************************
*/
// Carregando biblioteca do Pololu Dual VNH15019
// Atencao que durante a copia do site os caracteres “<” e “>” podem mudar de codigo
// assim redigite eles para evitar erros de compilacao
#include <DualVNH5019MotorShield.h>
DualVNH5019MotorShield md;
// Inicialiando as variaveis de direcao e deslocamento
int Left = 0;
int Right = 0;
int Foward = 0;
int Back = 0;
// Inicializando as variaveis do Driver de motor Pololu que trabalha com PWM de -400 a 400
// as variaveis S0 a S5 sao para controlar a energia dos motores usados de 5V
int S0 = 0;
int S1 = 80;
int S2 = 90;
int S3 = 100;
int S4 = 125;
int S5 = 150;
// M1 e M2 sao as variaveis do comando de cada ponte
int M1 = 0;
int M2 = 0;
// Variaveis para a entrada do dado da serial e uma memoria para facilitar o deslocamento continuo
int memoryByte; // Guarda a ultima informacao sobre deslocamento para frente e tras
int incomingByte;
void setup()
{
md.init();
Serial.begin(9600);
Serial1.begin(9600); // como utilizei um Arduino Mega preferi usar esta serial para deixar a outra livre para comunicacao com computador
}
void loop()
{
// see if there’s incoming serial data:
if (Serial1.available() > 0) {
// read the oldest byte in the serial buffer:
incomingByte = Serial1.read();
// Stop
if(incomingByte == 0) {
goStop();
}
// Turn around
else if(incomingByte == 70) {
memoryByte = incomingByte;
}
// Turn Left Foward
else if(incomingByte == 76 && memoryByte == 77) {
goLeftF();
}
// Turn Left Reverse
else if(incomingByte == 76 && memoryByte == 78) {
goLeftR();
}
// Turn Right Foward
else if(incomingByte == 75 && memoryByte == 77) {
goRightF();
}
// Turn Right Reverse
else if(incomingByte == 75 && memoryByte == 78) {
goRightR();
}
// Turn Around Left
else if(incomingByte == 76 && memoryByte == 70) {
turnLeft();
}
// Turn Around Right
else if(incomingByte == 75 && memoryByte == 70) {
turnRight();
}
// Move Foward
else if(incomingByte == 77) {
memoryByte = incomingByte;
goFoward();
}
// Move Reverse
else if(incomingByte == 78) {
memoryByte = incomingByte;
goReverse();
}
// Stop
else if(incomingByte == 65) {
M1 = S0;
M2 = S0;
}
// Stop
else if(incomingByte == 67) {
M1 = S0;
M2 = S0;
}
}
// Informacao para Debug
//Serial.println(incomingByte);
//md.setM1Speed(M1);
//md.setM2Speed(M2);
stopIfFault();
}
void stopIfFault()
{
if (md.getM1Fault())
{
Serial.println(“M1 fault”);
while(1);
}
if (md.getM2Fault())
{
Serial.println(“M2 fault”);
while(1);
}
}
// Rotinas utilizadas pelo Programa
void goStop() {
M1 = S0;
M2 = S0;
md.setM1Speed(M1);
md.setM2Speed(M2);
}
void goFoward() {
M1 = S3;
M2 = S3;
md.setM1Speed(M1);
md.setM2Speed(M2);
}
void goReverse() {
M1 = -S3;
M2 = -S3;
md.setM1Speed(M1);
md.setM2Speed(M2);
}
void goLeftF() {
M1 = S0;
M2 = S4;
md.setM1Speed(M1);
md.setM2Speed(M2);
}
void goLeftR() {
M1 = S0;
M2 = -S4;
md.setM1Speed(M1);
md.setM2Speed(M2);
}
void goRightF() {
M1 = S4;
M2 = S0;
md.setM1Speed(M1);
md.setM2Speed(M2);
}
void goRightR() {
M1 = -S4;
M2 = S0;
md.setM1Speed(M1);
md.setM2Speed(M2);
}
void turnLeft() {
M1 = -S3;
M2 = S3;
md.setM1Speed(M1);
md.setM2Speed(M2);
}
void turnRight() {
M1 = S3;
M2 = -S3;
md.setM1Speed(M1);
md.setM2Speed(M2);
}
/* Disposicao dos botoes e comandos
Botoes frontais
Top Left = A ==> 65
Bottom Left = B ==> 66
Top Right = C ==> 67
Bottom Right = D ==> 68
Joysticks Botoes
Joystick Botao Esquerdo = E ==> 69
Joystick Botao Direito = F ==> 71
Joysticks
Joystick Esquerdo Left = G ==> 71
Joystick Esquerdo Right = H ==> 72
Joystick Esquerdo Up = I ==> 73
Joystick Esquerdo Down = J ==> 74
Joystick Direito Left = K ==> 75
Joystick Direito Right = L ==> 76
Joystick Direito Up = M ==> 77
Joystick Direito Down = N ==> 78
*/