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
#include
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 = #
*/
Ou