Projeto: Controlando o Tamiya sem fio com Garabee, utilizando o Joystick Shield

Olá Garagistas! No projeto de hoje, iremos mostrar como fazer uma aplicação para controlar um Tamyia, utilizando um Pololu Motor Driver, módulos Garabee e Arduinos.

 

 

Materiais Utilizados:

2x Arduino

1x Chassi Esteira Tamiya

1x Pololu Motor Driver

2x Módulo Garabee

1x Joystick Shield

1x Protoboard

1x ProtoShield

2x Bateria (9V)

2x Pilha

Fita Dupla Face com Esponja

Alguns Jumpers

 

 

1. Funcionamento

1.1)Controle

Imagem 1 - Controle

O Módulo de Controle pode ser separado em 3 camadas:

Imagem 2 - Camadas do Módulo de Controle

Camada Inferior (Tratamento) - Na camada inferior temos um Arduino para fazer o tratamento do Joystick Shield e enviar o comando para o Garabee, e grudado a ele por meio de uma fita dupla face um suporte com Bateria 9V para a alimentação do módulo de controle.

Imagem 3 - Visão Superior da Camada de Tratamento(Arduino)

Imagem 4 - Visão Inferior da Camada de Tratamento(Arduino)

Camada Central (Transmissão) - Na camada central temos um ProtoShield onde foram feitas as ligações necessárias para o Garabee (DIN, DOUT, REDE, VCC e GND).

Imagem 5 - Visão Superior da Camada de Transmissão

Camada Superior (Controle) - Na camada superior temos o Joystick Shield, onde utilizamos o botão analógico dele para fazer o controle direcional do carrinho (Frente, Trás, Esquerda e Direita).

Imagem 6 - Visão Superior da Camada de Controle

1.2)Tanque Tamiya

Imagem 7 - Tanque Tamiya montado

O módulo do Tanque Tamiya, podemos dividir em 3 partes:

Chassi - O Chassi da esteira Tamiya é o que leva todo o tanque, a esteira dele está ligada diretamente aos motores conectado ao chassi, acima dos motores estão uma Bateria 9V(Alimentação do Arduino) e 2 Pilhas AA dentro do suporte(Alimentação do Driver dos Motores), acima das alimentações do tanque tem uma protoboard, onde nele foram feitas as ligações eletrônicas do circuito do tanque (Garabee / Driver dos Motores / Arduino) mais à frente dos motores está o Arduino

Imagem 8 - Chassi Tamiya

Transmissão - A transmissão do controle é recebida pelo Garabee que está ligado ao Arduino com a ajuda de uma Protoboard, dele utilizamos 4 pinos para tratamento mais 2 pinos para alimentação (DI3, DI6, DI7, REDE, VCC e GND). A tabela abaixo mostra como é tratado o código(binário) recebido pelos pinos DI3, DI6 e DI7 que estão ligados respectivamente ao pinos digitais D0, D1 e D2 do Arduino para que o mesmo receba o código e faça o acionamento dos motores.

Imagem 9 - Meio de transmissão do Módulo do Tanque

Tabela 1 - Códigos que o Garabee envia, alterando o estado dos pinos

Acionamento - O acionamento dos motores é feito pelo código(binário) que o Arduino recebe pelas portas digitais D0, D1 e D2 enviado pelo Garabee, faz o tratamento do dado recebido e em seguida faz o acionamento dos motores por meio do Driver de Motores.

Imagem 10 - Controle e acionamento dos motores

Tabela 2 - Código que o Arduino recebe do Garabee e como faz tratamento do driver dos motores

2. Configurações Garabee

OBS: Se você não possui conhecimento de como fazer as configurações do Garabee, acesse: Tutorial: Como utilizar o GaraBee com Arduino - Parte 2 e leia o tópico Topologia "1.Ponto-a-Ponto".

2.1)Garabee - Controle

+++ <Enter> - Para entrar em modo de comando.

ATDA 1 <Enter> - Configura o Endereço de Destino (endereço do módulo controla o relé).

ATSA 2 <Enter> - Configura endereço deste módulo.

ATCH 20 <Enter> - Configura canal de operação para 20.

ATID 1 <Enter> - Configura o Endereço da Rede.

ATDOI 0 <Enter> - Configura todos os pinos do módulo para iniciarem em nível lógico 0.

ATBD 0 <Enter> - Configura Baud rate para 2400bps.

ATWR <Enter> - Salva as informações passadas para o módulo.

ATCN <Enter> - Sair do Modo de Comando.

 

2.2)Garabee - Tanque Tamiya

 

+++ <Enter>  - Para entrar em modo de comando.

ATDA 2 <Enter> - Configura o Endereço de Destino (endereço do módulo que enviará comandos).

ATSA 1 <Enter> - Configura endereço deste módulo.

ATCH 20 <Enter> - Configura canal de operação para 20.

ATID 1 <Enter> - Configura o Endereço da Rede.

ATDOI 0 <Enter> - Configura todos os pinos do módulo para iniciarem em nível lógico 0.

ATCT3 0 <Enter> - Configura I/O 3 como Saída Local para o código do Garabee.

ATCT6 0 <Enter> - Configura I/O 6 como Saída Local para o código do Garabee.

ATCT7 0 <Enter> - Configura I/O 7 como Saída Local para o código do Garabee.

ATBD 0 <Enter> - Configura Baud rate para 2400bps.

ATWR <Enter> - Salva as informações passadas para o módulo.

ATCN <Enter> - Comando para Sair do Modo de Comando.

 

 

3. O Sketch do Módulo de Controle

 

//OBS1: Foi utilizado a biblioteca "SoftwareSerial.h" para utilizar os pinos 8 e 9 do arduino como pinos de RX e

//TX respectivamente, para enviar os comandos para o Garabee.

//OBS2: O "X" no código significa que a condição é irrelevante, ou seja, tanto faz o nível lógico (0 ou 1).

 

#include <SoftwareSerial.h> //Adiciona a biblioteca para utilizar outros pinos como RX e TX
SoftwareSerial mySerial(8, 9); //Configura os pinos 8 e 9 como RX e TX respectivamente

//Variáveis para receberem os valores dos potênciometros do Botão Analógico
int vertical;
int horizontal;
//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

void setup()
{
    mySerial.begin(2400);
    mySerial.println("+++");
    delay(500);
    mySerial.println("ATWRO 8");
    delay(500);
}

void loop()
{
        horizontal = analogRead(A0); //Lê posição do potênciometro da horizontal do Botão Analógico
        vertical = analogRead(A1); //Lê posição do potênciometro da vertical do Botão Analógico
        delay(5);

        //Condição "Trás" (Analógico para Trás)
if(vertical < 400 && horizontal > 500 && horizontal < 600)
        {
            mySerial.println("ATWRO 0"); //Envia código "000"
            while(vertical < 400)
            {
            vertical = analogRead(A1);
            }
        }

       //Condição "Esquerda" (Analógico para Esquerda)
        else if(horizontal < 400 && vertical > 500 && vertical < 600)
        {
            mySerial.println("ATWRO 128"); //Envia Código "001"
            while(horizontal < 400)
            {
                horizontal = analogRead(A0);
            }
        }
  //Condição "Direita" (Analógico para Direita)
        else if(horizontal > 600 && vertical > 500 && vertical < 600)
        {
            mySerial.println("ATWRO 64"); //Envia Código "010"
            while(horizontal > 600)
            {
            horizontal = analogRead(A0);
            }
        }

      //Condição "Frente" (Analógico para Frente)
else if(vertical > 600 && horizontal > 500 && horizontal < 600)
        {
            mySerial.println("ATWRO 192"); //Envia Código "011"
            while(vertical > 600)
            {
            vertical = analogRead(A1);
            }
        }

        //Condição "Parado" (Analógico no Centro)
        else if(horizontal > 500 && horizontal < 600 && vertical > 500 && vertical < 600)
        {
mySerial.println("ATWRO 8"); //Envia Código "1XX"
            while(horizontal > 500 && horizontal < 600 && vertical > 500 && vertical < 600)
            {
            horizontal = analogRead(A0);
            vertical = analogRead(A1);
             }
        }
}

 

 

4. O Sketch do Módulo do Tanque

//OBS: O X no código significa que a condição é irrelevante, ou seja, tanto faz ele estar em nível lógico 0 ou 1.

//+++++++++++++++Variáveis Para Driver da Pololu+++++++++++++++
int STBY = 11; //Variável para parada dos Motores
//Variáveis para controle do Motor A
int PWMA = 9; //Variável para Controle de Velocidade
int AIN1 = 4; //Direção (Consulte Tabela no Tutorial do LdG)
int AIN2 = 5; //Direcão (Consulte Tabela no Tutorial do LdG)
//Variáveis para controle do Motor B
int PWMB = 10; //Variável para Controle de Velocidade
int BIN1 = 6; //Variável para Direção (Consulte Tabela no Tutorial do LdG)
int BIN2 = 7; //Variável para Direção (Consulte Tabela no Tutorial do LdG)
//--------------------------------------------------------------------------------------------------

 

//Variáveis para receber codificação do Garabee
int pin0=0; //Variável Para Leitra do Pino Digital 0
int pin1=0; //Variável Para Leitra do Pino Digital 1
int pin2=0; //Variável Para Leitra do Pino Digital 2
//-------------------------------------------------------------------


void setup()
{

    //Pino para fazer a parada dos motores
    pinMode(STBY, OUTPUT);

//Pinos para controle do Motor A
    pinMode(PWMA, OUTPUT);
    pinMode(AIN1, OUTPUT);
    pinMode(AIN2, OUTPUT);

//Pinos para controle do Motor B
    pinMode(PWMB, OUTPUT);
    pinMode(BIN1, OUTPUT);
    pinMode(BIN2, OUTPUT);

//Pinos que recebem a codificação do Garabee
    pinMode(0,INPUT);
    pinMode(1,INPUT);
    pinMode(2,INPUT);
}

 

void loop()
{

    pin0 = digitalRead(0);
    pin1 = digitalRead(1);
    pin2 = digitalRead(2);


    if(pin0 == 1) //Tanque Parado (Código: 1XX)
    {
        digitalWrite(STBY, LOW); //Para os 2 Motores (A e B)
    }
    else if((pin0 == 0) && (pin1 == 0) && (pin2 == 0)) //Tanque Para Trás (Código: 000)
    {
        move(1, 255, 0); //Motor A, Velocidade Total, Direita
        move(2, 255, 1); //Motor B, Velocidade Total, Esquerda
     }
    else if((pin0 == 0) && (pin1 == 0) && (pin2 == 1)) //Tanque Gira Para Esquerda (Código: 001)
    {
        move(1, 255, 1); //Motor A, Velocidade Total, Esquerda
        move(2, 255, 1); //Motor B, Velocidade Total, Esquerda
    }
    else if((pin0 == 0) && (pin1 == 1) && (pin2 == 0)) //Tanque Gira Para Direita (Código: 010)
    {
        move(1, 255, 0); //Motor A, Velocidade Total, Direita
        move(2, 255, 0); //Motor B, Velocidade Total, Direita
    }
    else if((pin0 == 0) && (pin1 == 1) && (pin2 == 1)) //Tanque Para Frente (Código: 011)
    {
        move(1, 255, 1); //Motor A, Velocidade Total, Esquerda
        move(2, 255, 0); //Motor B, Velocidade Total, Direita
    }
}

 

//Função que faz o controle dos motores
//Consulte a tabela do driver de motor da Pololu
void move(int motor, int velocidade, int direcao)
{
    //Motor: 0 - motorB / 1 - motorA
    //Velocidade: 0 - desligado / 255 - velocidade máxima
    //Direção: 0 - horário / 1 - anti-horário
    digitalWrite(STBY, HIGH);
    boolean inPin1 = LOW;
    boolean inPin2 = HIGH;
    if(direcao == 1)
    {
        inPin1 = HIGH;
        inPin2 = LOW;
    }
    if(motor == 1)
    {
        digitalWrite(AIN1, inPin1);
        digitalWrite(AIN2, inPin2);
        analogWrite(PWMA, velocidade);
    }
    else
    {
        digitalWrite(BIN1, inPin1);
        digitalWrite(BIN2, inPin2);
        analogWrite(PWMB, velocidade);
    }
}

 

 

5. Ligações

OBS: É importante que você faça as configurações e uploads dos sketchs antes de fazer as ligações, ou seja, conclua os passos 2, 3 e 4 antes de fazer as ligações.

5.1)Controle: Garabee + ProtoShield

5.2)Tanque Tamiya: Garabee + Arduino

 

5.3)Tanque Tamiya: Motor Driver Pololu + Arduino

Então é isso pessoal, esperamos que tenham gostado deste Projeto!

Até a Próxima! =D

Referências:

http://labdegaragem.com/profiles/blogs/tutorial-como-utilizar-o-joy...

http://labdegaragem.com/profiles/blogs/tutorial-como-utilizar-o-gar...

http://labdegaragem.com/profiles/blogs/tutorial-como-utilizar-o-gar...

http://labdegaragem.com/profiles/blogs/tutorial-driver-para-motores-dc-tb6612fng

Exibições: 14543

Comentar

Você precisa ser um membro de Laboratorio de Garagem (arduino, eletrônica, robotica, hacking) para adicionar comentários!

Entrar em Laboratorio de Garagem (arduino, eletrônica, robotica, hacking)

Comentário de paulo cesar pinto em 6 abril 2014 às 22:44

quanto as ligações dos fios estou meio perdido , ja comprei todos componentes , mas me perdi nas conexões ,tem como me ajudar ,pois não sou muito bom para avaliar as ligações .

Comentário de Alex Jose Silva em 1 junho 2013 às 10:27

Muito bom, qual o orçamento para este projeto ?

Comentário de Laboratório de Garagem em 31 maio 2013 às 11:41

Olá Adilson Sena,

Você pode substituir pelo driver da Sparkfun, ou ainda por qualquer outro controlador de motores, mas não esqueça que para isto você terá que alterar o código que controla os motores.

Comentário de Adilson Sena em 30 maio 2013 às 8:53

Muito bom, parabés pelo projeto, posso substituir o drive  de motor pololu por outro, qual?

© 2024   Criado por Marcelo Rodrigues.   Ativado por

Badges  |  Relatar um incidente  |  Termos de serviço