O que é:

Um robô autônomo baseado em arduino que realiza comandos a partir da leitura de um sensor ultrassônico de distância. Ao verificar a distância, o robô muda sua direção (dependendo da leitura do ultrassônico).


Finalidade:

Produzir um robô que realize movimentos autônomos, sem depender de comandos analógicos. Independente da situação e do espaço, o robô poderia encontrar uma saída e escapar de obstáculos. Um robô como este pode dar base para futuras produções de projetos de grande porte, como veículos autônomos.


Orçamento:

Placa Arduino UNO: R$ 50,00

Sensor Ultrassônico: R$ 16,00

2 Baterias: R$ 30,00

2 motores DC: R$ 30,00

1 motor Micro Servo: R$ 15,00

1 Cantoneira com furo: R$ 6,00

Kit Chassi 2 rodas + rodinha: R$ 56,00

Motor Shield (Driver de Ponte H): R$ 22,00

2 Adaptadores de Bateria: R$ 5,00

Total: R$ 219,00


Etapas de produção:

Fase de Prototipagem: A primeira fase do projeto, na qual os componentes serão testados separadamente e os circuitos serão planejados e idealizados, consistirá na elaboração de um protótipo para testes iniciais e, consequentemente, o aprimoramento do projeto original, de forma a torná-lo mais eficiente e minimizar a quantidade de erros e bugs. Nós compramos um Kit Chassi 2 rodas pronto e adequado para o nosso projeto, mas fica à sua escolha fazer uma base ou comprá-la. Idealizamos onde cada peça iria ficar, o Servo Motor à frente suportando o Sensor Ultrassônico, a rodinha que vem no Kit Chassi 2 rodas abaixo do Chassi na parte frontal, o Motor Shield conectado diretamente à Arduino UNO na traseira do Chassi e as baterias no centro do robô, encontrando-se uma acima e uma abaixo do Chassi. Na parte dos testes iniciais separados, testamos primeiro o Servo Motor para saber se este componente estava funcionando corretamente e percebemos que não estava realizando os comandos do modo que queríamos, nossa ideia era que o Servo aplicasse uma rotação de 180°. Depois, testamos o Sensor Ultrassônico + Servo Motor para saber se em conjunto, eles estavam funcionando corretamente. Percebemos que a leitura do Ultrassônico estava correta, porém o Servo não estava girando nas condições que queríamos. Percebemos então, que o Servo Motor ultrapassava o limite de 180° em sua rotação, o que prejudicou bastante a Fase de Programação. Decidimos trocar o Servo por um que finalmente, atendesse às condições e o conjunto funcionou corretamente, quando foi testado separadamente do projeto final. Após estes testes, realizamos o teste dos motores DC que em alguns momentos seus comandos encontravam-se invertidos, sendo resolvido na Fase de Programação. Quando compramos os Motores DC, tivemos que comprar em lojas diferentes e cometemos o erro de comprar motores com velocidades diferentes, mas corrigimos este problema na mesma fase citada anteriormente, diminuindo a velocidade do motor que encontrava-se mais rápido, havia um risco de aumentar a velocidade do motor mais lento e acabar queimando o motor, portanto optamos por diminuir a velocidade do motor mais rápido. Testamos também as baterias, na qual uma delas encontrava-se com problemas em sua carga, por isso tivemos problemas na Fase de Testes Finais, pois a energia fornecida por uma das baterias não era suficiente para os motores DC funcionarem como o esperado.

Fase de Montagem: Utilizamos uma placa de acrílico pré-montada para ser o chassi do robô. Nela, utilizando-se de porcas e parafusos, uma placa Arduino foi acoplada ao chassi, assim como, o Servo Motor, a partir dos orifícios obtidos a partir do corte a laser da placa de acrílico. Então, fizemos a partir de uma placa de madeira de espessura qualquer e de uma furadeira, um suporte para o Sensor Ultrassônico. Posteriormente, ligamos o suporte do sensor à hélice de 6 pontos acoplada ao Servo, utilizando uma cantoneira de furos com dois parafusos para que o Sensor Ultrassônico fique bem preso ao Servo. Já para os motores, utilizamos duas placas pequenas de acrílico já preparadas e capazes de serem acopladas a placa pré-montada de acrílico maior, para que o motor DC fosse encaixado e pudesse ser facilmente posto em conjunto com a roda devido aos furos desta placa. Também colocamos o Motor Shield (driver de ponte H) acoplado ao arduino de modo que ele ficasse acima e soldamos com o metal estanho os fios do sensor ultrassônico com os pinos do arduino que não estavam sendo usados pelo próprio Motor Shield para controlar os motores DC e o Servo, usando, para isso, jumpers macho-fêmea, visto que devíamos conectar o jumper aos pinos do Sensor algo que era somente possível com um jumper fêmea. Por último, usamos uma chave de fenda para poder conectar os fios do motor ao Motor Shield, também conectando o Servo e prendemos as duas baterias necessárias para alimentar o Arduino e o Motor Shield com braçadeiras, ligando-as a eles por meio de um adaptador de bateria para Arduino e outro adaptador porém sem plug para alimentar o driver de ponte H. Assim, Luke Pathwalker teve seu hardware pronto e bastava receber o código pronto para que, teoricamente, começasse a funcionar conforme o planejado.


Fase de Programação: Para a confecção do código utilizamos a IDE gratuita do arduino. As bibliotecas utilizadas foram a Servo.h (controle do servo, nativa do arduino), Ultrasonic.h by Erick Simões (controle do sensor ultrassônico, necessita ser baixada) e AFMotor.h V1 (facilita o controle do Motor Shield, necessita ser baixada):



#include <Servo.h>    //Bibliotecas Utilizadas

#include <Ultrasonic.h>

#include <AFMotor.h>


const int pinecho = A5; //Pino analógico 5 ligado ao pino echo do ultrassônico.

const int pintrig = 2; //Pino digital 2 ligado ao pino trigger do ultrassônico.

const int pinservo = 10; //Pino PWM 10 usado para controle do Motor Servo



Servo servo; //Cria um objeto servo ligado a classe Servo


Ultrasonic ultra(pintrig, pinecho); /*Cria um objeto ultra ligado a classe Ultrasonic

                                    e recebe como parâmetros os pinos conectados */

AF_DCMotor motor1(3); //Objeto motor 1 da classe AF_DCMotor e recebe o parâmetro de qual o motor conectado

AF_DCMotor motor2(4); //Objeto motor 2 da classe AF_DCMotor e recebe o parâmetro de qual o motor conectado


int dist = 100; //Informa a variável inteira distância como 100


void setup() {

 

servo.attach(pinservo); //Informando o pino conectado ao servo

servo.write(90); //Servo em 90 Graus (centro)

motor1.setSpeed(500); //Velocidade dos motores

motor2.setSpeed(500);


dist = ultra.read(); //Lê a distância várias vezes

delay(100);

dist = ultra.read();

delay(100);

dist = ultra.read();

delay(100);

dist = ultra.read();

delay(100);

}


void loop() {

 int distDireita = 0; //Distância a direita igual a 0

 int distEsq = 0; //Distância a esquerda igual a 0

 delay(50);

 

 if(dist <= 20){      //Se distância for menor que 20 cm

   para();     //Motores param

   delay(500);

   distDireita = olharDireita(); //Olha para a direita e recupera a distância

   delay(250);

   distEsq = olharEsq(); //Olha para a esquerda e recupera a distância


   if(distEsq > distDireita){ //Se a distância da esquerda for maior que a da direita

     vaiEsq(); //Vira para a esquerda

     para(); //Motores param

     }

     

   else if(distDireita >= distEsq) { //Se a distância da direita for maior que a da esquerda

     vaiDireita(); //Vira para a direita

     para(); //Motores param

     }

   }


  else { //Se distância não for menor que 20 cm

   frente(); //Motores em rotação para frente

   

   }

 dist = ultra.read(); //Ler distância

}


void frente(){

 motor1.run(FORWARD); //Ambos os motores vão para frente

 motor2.run(FORWARD);

 }


void para(){

 motor1.run(RELEASE); //Motores param

 motor2.run(RELEASE);

 }


 int olharDireita(){

   servo.write(50); //Servo em 50 graus (direita)

   int x = ultra.read(); //Ler distância x

   delay(500);

   servo.write(90); //Servo em 90 graus (centro)

   return x; //Retorna x

   }


   int olharEsq(){

   servo.write(130); //Servo em 130 graus (direita)

   int y = ultra.read(); //Ler distância y

   delay(500);

   servo.write(90); //Servo em 90 graus (centro)

   return y; //Retorna y

   }


void re(){

 motor1.run(BACKWARD); //Motores vão para trás

 motor2.run(BACKWARD);

 }


void vaiDireita(){

 motor1.run(FORWARD);  // Motor da esquerda vai para frente

 motor2.run(BACKWARD); // Motor da direita vai para trás (Vira a direita)

 delay(1000);          // Espera 1 Segundo

 motor1.run(FORWARD);  // Ambos os motores vão para frente

 motor2.run(FORWARD);  

 }


void vaiEsq(){

 motor1.run(BACKWARD); // Motor da esquerda vai para trás

 motor2.run(FORWARD);  // Motor da direita vai para frente (Vira a esquerda)

 delay(1000);          // Espera 1 Segundo

 motor1.run(FORWARD);  // Ambos os motores vão para frente

 motor2.run(FORWARD);

 }



Fase de Testes Finais: No primeiro teste, foi verificado que um motor estava mais rápido que o outro, como citado na Fase de Prototipagem. Em seguida, Luke foi levado de volta para o campo de testes, e se notou que ele estava indo para esquerda, quando deveria ir para a direita, que é mais um erro que se resolve pela programação. Após a correção das direções, ele foi testado, e estava indo tudo nos conformes. Porém, no dia seguinte Luke foi levado para o “teste final”, mas foi observado que o Servo não recebia mais energia suficiente para girar, o que foi consertado substituindo as baterias defeituosas.




Tempo para produzir o projeto:

Com base na entrega dos materiais e nas etapas de produção do robô, o prazo para a confecção do projeto é de, aproximadamente, 75 dias. Como houve problemas na fase de produção e na entrega dos materiais, a conclusão do projeto adiou-se para 88 dias.


Instruções de Uso


O funcionamento de LUKE é bastante simples e intuitivo. O código do projeto já é pré-carregado para a placa arduino. Logo, apenas é necessário fazer as conexões das baterias no motor shield e no arduino para que o robô funcione:

  •  Coloque os fios da bateria na entrada de energia do motor-shield (Cuidado para não inverter os polos);
  • Conecte a bateria com o adaptador para arduino e insira-a no soquete preto;
  • Ponha o robô em uma superfície relativamente nivelada e seca. 

Projetistas:

João Marcelo Motta
Lucas da Silveira Absalão
Renan Medeiros
Pedro Barros

Agradecimentos a Profª Marta Bibiano



Atividades recentes