CONCURSO LEVE SEU ROBO PARA A CAMPUS PARTY

 

Coordenador da Equipe: Francisco Roberto N. Lima

Fone:

 

Projeto HEXAPOD

 

INTRODUÇÃO

 

Hexapod, ou seis pés, refere-se a um robô de caminhada de seis patas. Construído a partir de estudos da natureza, baseado nos artrópodes, incluindo os insetos.

Na verdade o projeto Hexapod é a criação de um robô inspirado por essas criaturas sobre uma plataforma robótica, é um trabalho experimental, mas relativamente complexo. A proposta é uma visão de um projeto genérico de robótica móvel e de baixo custo comparando-se com os robôs móveis existentes no mercado.

Os modelos mais sofisticados são capazes de se mover em terrenos variados e controlados a distância, podem realizar coisas do tipo: recolher matérias suspeitos como bombas, materiais radioativos, mapear um terreno utilizando um transmissor de GPS, filmar em tempo real, etc. Podem ser equipados com sensores podendo detectar obstáculos e mudar de direção ou realizar uma ação programada.

Fabricado em maior parte com material reciclado, o mecanismo se baseou no Critério de GRASHOF onde foi utilizado o movimento de Manivela Balancin, Triplo em um mesmo eixo, para conseguir o movimento das pernas. Com apenas um motor é possível o movimento de três pernas ao mesmo tempo.

O protótipo utiliza apenas dois motores de corrente contínua que é responsável pelo Movimento. Com ele é possível deslocar-se em várias direções e todo o sistema é controlando por controle remoto infravermelho ou celular.

Foram adicionados ainda ao projeto 02 servos motores e um laser acoplado nos mesmos para simular o controle de um canhão que também pode ser Controlado pelo controle remoto ou celular.

Foi utilizada a plataforma Arduino e todo o sistema é alimentado com tensão de 12 volts.

 

MATERIAIS UTILIZADOS

Madeira:

01 x  BASE DE MADEIRA      120mm x 240mm x 120mm.

Alumínio:

Foi usado um perfil de alumínio de 6m de comprimento x 13mm de largura x 3mm de altura,  cortado com as seguintes medidas:

            06 x Pernas de 120mm;

            04 x Hastes de conexão com as  quatro pernas externas de 150mm;

            02 x Hastes de conexão com as duas pernas centrais de 90mm;

            01 x Haste em U de 160mm de comprimento x 20mm de altura para o eixo dianteiro;

            01 x Haste em U de 150mm de comprimento x 20mm de altura para o eixo traseiro;

            01 x Haste em U de 150mm de comprimento x 80mm de altura para o eixo central;

            01 x Haste em L para fixação de Laser de 50mm x 50mm.

Rodas:

            02 x Rodas de NYLON de 50mm de diâmetro x 4mm.

Materiais diversos:

            Parafusos (36), Porcas (70), Arruelas (48), Fios (10m), Fita isolante e Fitas

            fixadoras.

Placas Controladoras:

            01 x Arduino Mega 2560.

            01 x Placa Drive ponte H.

Fonte de alimentação:

            01 x Fonte de alimentação estabilizada de 12 volts com 5A.

Regulador de tensão:

            01 x Regulador LM7805 (Regulador de tensão de 5 volts).

Servo motores:

            02 x Servos motores digitais MG995 – 15 kg Torque, engrenagens de metal.

Motores:

            02 x Motores de 12 volts de corrente contínua com redução planetária – até 80

            RPM.

Iluminador Laser:

            01 x Laser Point de 3,7 volts por 4.200mA cor verde de 1.000mW x 532nm, alcance  de 8km, bateria recarregável.

Relé:

            01 x Relé – Utilizado pra ligar e desligar o Laser

 

 

CÓDIGO FONTE

 

 

#include                      // Biblioteca universal para Controles Remotos

#include                         // Biblioteca universal para Servo Motores

Servo myservo_horizontal;                 // Definicao do nome do Servo 01

Servo myservo_vertical;                   // Definicao do nome do Servo 02

 

int VCC_PIN = 9;                          // Definição dos pinos do Sensor Infravermelho

int GND_PIN = 10;                        

int RECV_PIN = 11;                       

 

float armazenavalor;                   // Variavel que armazena o valor da frequência enviada pelo Controle Remoto

int posicao_01;                           // Variável para armazenar o valor da posição inicial do Servo motor 01

int posicao_02;                           // Variável para armazenar o valor da posição inicial do Servo motor 02

int velocidade;                           // Variável para armazenar a Velocidade inicial dos Motores Corrente Contínua

int vel_canhao;                           // Variável para armazenar a Velocidade dos Servos Motores

 

IRrecv irrecv(RECV_PIN);                  // Define o pino 11 como recebedor da frequência do Controle Remoto

decode_results results;                   // Rotina da biblioteca responsável pelo cálculo do valor da frequência recebida

 

void setup()                              // Bloco com as definições gerais

{                                        

  Serial.begin(9600);                     // Inicialização de porta de comunicação para uso de Serial Monitor

  myservo_horizontal.attach(6);          

  myservo_vertical.attach(8);            

  pinMode(VCC_PIN,OUTPUT);               

  pinMode(GND_PIN,OUTPUT);               

  digitalWrite(GND_PIN,LOW);             

  digitalWrite(VCC_PIN,HIGH);            

  pinMode(2,OUTPUT);                     

  pinMode(3,OUTPUT);                     

  pinMode(4,OUTPUT);                     

  pinMode(5,OUTPUT);                     

  digitalWrite(2,LOW);                   

  digitalWrite(3,LOW);                   

  digitalWrite(4,LOW);                   

  digitalWrite(5,LOW);                   

  pinMode(13,OUTPUT);                    

  digitalWrite(13,LOW);                  

  posicao_01 = 90;                        

  posicao_02 = 90;                       

  velocidade = 150;                      

  vel_canhao = 1;                        

  myservo_horizontal.write(posicao_01);     

  myservo_vertical.write(posicao_02);       

  irrecv.enableIRIn();                    // Inicialização do sensor receptor

}                                        

 

 

 

void loop()                               // Bloco do laço de repetição do programa

{     

 

char n = Serial.read();

// A liga e desliga laser

// B para frente

// C esquerda

// D direita

// E sobe laser

// F desce laser

// G laser esquerda

// H laser direita

////////////////////////////////////////////////

if(n == 'A')

{

     Serial.print("LIGA LASER ");

     digitalWrite(13,HIGH);

}

 

if(n == 'a')

{

     Serial.print("DESLIGA LASER ");

     digitalWrite(13,LOW);

///////////////////////////////////////////////////

   

    if(n == 'B')

    {

     Serial.print("PARA TRAS ");

     analogWrite(2,velocidade);               

     digitalWrite(3,HIGH);

     digitalWrite(4,HIGH);               

     analogWrite(5,velocidade-20);

    }

 

    if(n == 'b')

    {

     Serial.print("PAROU ");

     digitalWrite(2,LOW);                   

     digitalWrite(3,LOW);                   

     digitalWrite(4,LOW);                   

     digitalWrite(5,LOW);

     posicao_01 = 90;

     posicao_02 = 90;

     myservo_vertical.write(posicao_01);

     myservo_horizontal.write(posicao_02);

     digitalWrite(13,LOW);

    }

//////////////////////////////////////////////////////

    if(n == 'D')

    {

     Serial.print("PARA DIREITA ");

     analogWrite(2,velocidade);               

     digitalWrite(3,HIGH);

     analogWrite(4,velocidade);               

     digitalWrite(5,HIGH); 

    }

 

    if(n == 'd')

    {

     Serial.print("PAROU ");

     digitalWrite(2,LOW);                   

     digitalWrite(3,LOW);                   

     digitalWrite(4,LOW);                   

     digitalWrite(5,LOW);

     posicao_01 = 90;

     posicao_02 = 90;

     myservo_vertical.write(posicao_01);

     myservo_horizontal.write(posicao_02);

     digitalWrite(13,LOW);

    }

////////////////////////////////////////////////

    if(n == 'C')

    {

     Serial.print("PARA ESQUERDA ");

     digitalWrite(2,HIGH);                

     analogWrite(3,velocidade+11);

     digitalWrite(4,HIGH);               

     analogWrite(5,velocidade);

    }

 

    if(n == 'c')

    {

     Serial.print("PAROU ");

     digitalWrite(2,LOW);                   

     digitalWrite(3,LOW);                   

     digitalWrite(4,LOW);                   

     digitalWrite(5,LOW);

     posicao_01 = 90;

     posicao_02 = 90;

     myservo_vertical.write(posicao_01);

     myservo_horizontal.write(posicao_02);

     digitalWrite(13,LOW);

    }

///////////////////////////////////////////////////

    if(n == 'H')

    {

      if (posicao_01 > 180)

        {

          posicao_01 = 180;

        }

      else

        {

          posicao_01 = posicao_01 + vel_canhao;

          myservo_horizontal.write(posicao_01);

 

        } 

    }

 

    if(n == 'h')

    {

//

    }

//////////////////////////////////////////////////

       if(n == 'G')

    {

      if (posicao_01 < 0)

        {

          posicao_01 = 0;

        }

      else

        {

          posicao_01 = posicao_01 - vel_canhao;

          myservo_horizontal.write(posicao_01);

               

        } 

    }

 

    if(n == 'g')

    {

//

    }

////////////////////////////////////////////////////////

    if(n == 'E')

    {

      if (posicao_02 > 180)

        {

          posicao_02 = 180;

        }

      else

        {

          posicao_02 = posicao_02 + vel_canhao;

          myservo_vertical.write(posicao_02);                       

        }

    }

 

    if(n == 'e')

    {

//

    }

 

///////////////////////////////////////////////////////////////

       if(n == 'F')

    {

      if (posicao_02 < 0)

        {

          posicao_02 = 0;

        }

      else

        {

          posicao_02 = posicao_02 - vel_canhao;

          myservo_vertical.write(posicao_02);                       

        } 

    }

 

    if(n == 'f')

    {

//

    }

/////////////////////////////////////////////////////////

 

  if (irrecv.decode(&results))            // Verifica se está recebendo algum sinal do sensor receptor

  {                                      

    Serial.println(results.value, HEX);   // Mostra na tela Serial Monitor a frequência recebida

    armazenavalor = (results.value);     

             

       

    if (armazenavalor == 0xFFA857)        // Verifica se a tecla "Seta para traz" foi pressionada 

    {

     Serial.print("PARA FRENTE ");       

     digitalWrite(2,HIGH);                // Liga o motor corrente continua 01

     analogWrite(3,velocidade);           // Define a velocidade do motor corrente continua 01

     analogWrite(4,velocidade);           // Define a velocidade do motor corrente continua 02    

     digitalWrite(5,HIGH);                // Liga o motor corrente continua 02

    } 

    

    if (armazenavalor == 0xFF629D)        // Verifica se a tecla "Seta para frente" foi pressionada 

    {

     Serial.print("PARA TRAS ");

     analogWrite(2,velocidade);               

     digitalWrite(3,HIGH);

     digitalWrite(4,HIGH);               

     analogWrite(5,velocidade-20);     

    }

   

    if (armazenavalor == 0xFF22DD)        // Verifica se a tecla "Seta para DIREITA" foi pressionada 

    {

     Serial.print("PARA DIREITA ");

     analogWrite(2,velocidade);               

     digitalWrite(3,HIGH);

     analogWrite(4,velocidade);               

     digitalWrite(5,HIGH);     

    }

 

    if (armazenavalor == 0xFFC23D)        // Verifica se a tecla "Seta para ESQUERDA" foi pressionada 

    {

     Serial.print("PARA ESQUERDA ");

     digitalWrite(2,HIGH);               

     analogWrite(3,velocidade+11);

     digitalWrite(4,HIGH);               

     analogWrite(5,velocidade);     

    }   

     

    if (armazenavalor == 0xFF02FD)        // Verifica se a tecla para parar "OK" foi pressionada 

    {

     Serial.print("PAROU ");

     digitalWrite(2,LOW);                   

     digitalWrite(3,LOW);                   

     digitalWrite(4,LOW);                   

     digitalWrite(5,LOW);

     posicao_01 = 90;

     posicao_02 = 90;

     myservo_vertical.write(posicao_01);

     myservo_horizontal.write(posicao_02);

     digitalWrite(13,LOW);

    } 

     if (armazenavalor == 0xFF6897)        // Verifica se a tecla 1 foi pressionada - VELOCIDADE LENTA 

    {

     velocidade=150;

     vel_canhao=1;

    } 

     if (armazenavalor == 0xFF9867)        // Verifica se a tecla 2 foi pressionada - VELOCIDADE MEDIA 

    {

     velocidade=100;

     vel_canhao=2;    

    }   

     if (armazenavalor == 0xFFB04F)        // Verifica se a tecla 3 foi pressionada - VELOCIDADE ALTA 

    {

     velocidade=50;

     vel_canhao=3;    

    }

 

     if (armazenavalor == 0xFF10EF)        // canhao HORIZONTAL DIREITA 

    {

      if (posicao_01 > 180)

        {

          posicao_01 = 180;

        }

      else

        {

          posicao_01 = posicao_01 + vel_canhao;

          myservo_horizontal.write(posicao_01);

 

        }                     

    }

 

     if (armazenavalor == 0xFF5AA5)        // canhao HORIZONTAL ESQUERDA 

    {

      if (posicao_01 < 0)

        {

          posicao_01 = 0;

        }

      else

        {

          posicao_01 = posicao_01 - vel_canhao;

          myservo_horizontal.write(posicao_01);

               

        }                        

    }

  

     if (armazenavalor == 0xFF18E7)        // canhao VERTICAL SOBE 

    {

      if (posicao_02 > 180)

        {

          posicao_02 = 180;

        }

      else

        {

          posicao_02 = posicao_02 + vel_canhao;

          myservo_vertical.write(posicao_02);                        

        }                     

    }

 

     if (armazenavalor == 0xFF4AB5)        // canhao VERTICAL DESCE 

    {

      if (posicao_02 < 0)

        {

          posicao_02 = 0;

        }

      else

        {

          posicao_02 = posicao_02 - vel_canhao;

          myservo_vertical.write(posicao_02);                       

        }                        

    } 

 

 

     if (armazenavalor == 0xFF42BD)        // LIGA LASER 

    {

     Serial.print("LIGA LASER ");

     digitalWrite(13,HIGH);   

    }   

 

     if (armazenavalor == 0xFF52AD)        // DESLIGA LASER 

    {

     Serial.print("DESLIGA LASER ");

     digitalWrite(13,LOW);  

    }   

   

   

     irrecv.resume();                     // Segura a informação até receber o próximo valor do controle remoto

  }                                       // Fim do bloco da condição e armazenamento de valor de frequência

}                                        

 

 

/* Teclas do controle remoto

            FF629D = /\

FF22DD = <- FF02FD = ok FFC23D = ->

            FFA857 = \/

FF6897 = 1  FF9867 = 2  FFB04F = 3

FF30CF = 4  FF18E7 = 5  FF7A85 = 6

FF10EF = 7  FF38C7 = 8  FF5AA5 = 9

FF42BD = *  FF4AB5 = 0  FF52AD = #

*/



Atividades recentes

  • Rodrigo Medeiros

    Robô clas­si­fi­cado para a fase final hoje, dia 26, às 16:45 na área de Work­shop I da CPRecife3.

    • Sábado, 26.07.2014 13:16