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

*/