Como parte do plano de estudos do Projeto Robuca feito no Colégio de Aplicação da UFPE, foi proposto ao grupo que pensasse em um projeto de robô para ser construído, depois de algum tempo decidindo sobre ele, chegamos ao que será descrito agora:
O projeto é de um Robô Atirador de Discos, que nomeamos de Jeremias, por esta razão o nome R.A.D Jeremias. O robô deve andar (comandado por um controle remoto) e atirar, quando for apertado o botão para isto no controle, além disso ele também tem um laser para que se possa ver para onde o disco irá e LEDs para iluminar o ambiente.
Os requisitos para isso são:
- Motor, para fazer o robô funcionar;
- Lançador de discos, para dar impulso aos mesmos;
- Discos, para serem lançados;
- LEDs, para iluminar o ambiente;
- Arduino, para fornecer as informações necessárias para que o robô siga corretamente os comandos que o controle remoto realizar;
- Laser, para mostrar a mira;
- Rodas, para fazer o robô andar;
- Comunicação com o controle remoto, que pode ser por meio de Bluetooth ou infravermelho (a decidir);
- Controle remoto, para controlar o robô
- Cobertura externa, para dar melhor aparência e proteger o robô.
Começamos fazendo um protótipo do mesmo em papel, seguem as imagens:
Medidas do robô (Escala 100:1)
O furo em forma de círculo que podemos ver em sua parte superior é para reposição dos discos e o que se encontra na parte frontal é para o lançamento dos mesmos.
19/03/2013
Neste encontro, começamos a usinagem das peças para o nosso robô, fizemos a estrutura superior e inferior do robô, não tendo muitas dificuldades nesse aspecto. Já em relação a teste do receptor infravermelho, tivemos problemas na biblioteca do infravermelho, não sendo possível testá-lo. Quanto ao atirador de discos, depois de alguns ajustes, ele funcionou com êxito. Nesse encontro também discutimos um pouco sobre as peças necessárias para o robô e quais as melhores opções.
26/03/2013
Nesse encontro, terminamos a usinagem das peças, e estamos a lixa-las. Tivemos alguns problemas na comunicação via infravermelho, pois o receptor não estava captando os sinais mandados. Estamos também a conectar o laser ao arduino.
02/03/2013
Neste encontro, terminamos de lixar as peças e fizemos os devidos furos para colocar as cantoneiras para juntar as quinas. Por falta de parafusos e roscas não conseguimos juntar tudo ainda.
05/04/2013
Neste encontro, terminamos de montar o corpo externo do nosso R.A.D. Jeremias! Inclusive com atirador de discos colocado dentro dele e preso seguramente no teto. Conseguimos fazer os furos necessários para prendê-lo no teto só na segunda tentativa. Já fizemos também o fluxograma do nosso robô.
Foto de como está:
Os parafusos que estão mostrados projetados para fora serão trocados por parafusos menores, para melhorar a aparência.
09/04/2013
Neste encontro, fizemos uma abertura na parte superior do corpo externo do robô, para que o motor pudesse girar e consequentemente funcionar. Fizemos outra abertura na parte superior para que o suporte dos discos fosse encaixado, depois testamos o atirador, ele atirou alguns discos, mas houveram algumas complicações, que pretendemos resolver no próximo encontro.
Fotos do Jeremias no seu estado atual:
Interior
A parte externa inteira
10/04/2013
Neste encontro, começamos a colocar os servos para a tração traseira do robô e as rodas, além de corrigir os problemas que haviamos encontrado no encontro passado.
Novo fluxograma, completo:
15/05/2013
Depois de um pequeno recesso, voltamos às aulas.
Neste encontro, colocamos as rodas no robô, as testamos e elas funcionaram, pretendemos colocar o robô no chão no próximo encontro.
Além disso, programamos o infravermelho para que quando apertarmos, por exemplo, o botão "1" no controle, apareça na tela o número "1". Nosso único problema com isso, foi que estava havendo uma quantidade limitada de números que podiam aparecer na tela.
Nota do futuro (07/06/2013): O problema era que alguns botões não estavam configurados, então, quando se apertava eles, a função que servia pra resumir o infravermelho e receber o próximo sinal não era executado, isso foi resolvido com uma simples linha de código que resumia se o botão não fosse identificado.
22/05/2013
Hoje testamos o robô no chão fazendo ele andar, então regulamos as rodas para que o robô seguisse em linha reta, feito isso, programamos o robô para quando apretarmos os botôes "para frente " e "para trás" no controle, o robô correspondesse.
Segue o código da programação do controle, nós usamos a biblioteca IRremote para o controle, e a biblioteca do servo, já inclusa na IDE do Arduino::
- /*
- * IRremote: IRrecvDemo - demonstrates receiving IR codes with IRrecv
- * An IR detector/demodulator must be connected to the input RECV_PIN.
- * Version 0.1 July, 2009
- * Copyright 2009 Ken Shirriff
- * http://arcfn.com
- */
- /* --Bibliotecas-- */
- #include
#include int contador1=0; int contador2=0; /* --Infravermelho-- */ int RECV_PIN = 11; IRrecv irrecv(RECV_PIN); decode_results results; /* --Servos-- */ Servo s1; Servo s2; Servo s3; Servo s4; /* --Motores-- */ int motor1 = 6; int motor2 = 7; void setup() { Serial.begin(9600); irrecv.enableIRIn(); // Start the receiver s1.attach(9); // Ligar os servos aos seus respectivos pinos s2.attach(10); s3.attach(8); s4.attach(12); pinMode(motor1, OUTPUT); pinMode(motor2, OUTPUT); } void loop() { if (irrecv.decode(&results)) { if (results.value==3249195318){ //Botão 1 no controle Serial.println("Esquerda"); s1.write(0); s2.write(90); s3.write(0); s4.write(90); irrecv.resume(); // Receive the next value } else if (results.value==3249162678) { //Botão 2 no controle Serial.println("Frente"); s1.write(0); s2.write(310); s3.write(0); s4.write(100); irrecv.resume(); // Receive the next value } else if (results.value==3249207558) { //Botão 3 no controle Serial.println("Direita"); s1.write(70); s2.write(310); s3.write(70); s4.write(310); irrecv.resume(); // Receive the next value } else if (results.value==3249174918) { //Botão 4 no controle Serial.println("Ré, esquerda"); s1.write(310); s2.write(70); s3.write(310); s4.write(70); irrecv.resume(); // Receive the next value } else if (results.value==3249164718) { //Botão 5 no controle Serial.println("Ré"); s1.write(310); s2.write(0); s3.write(310); s4.write(60); irrecv.resume(); // Receive the next value } else if (results.value==3249205518) { //Botão 6 no controle Serial.println("Ré, direita"); s1.write(90); s2.write(0); s3.write(90); s4.write(0); irrecv.resume(); // Receive the next value } else if (results.value==3249168798) { //Botão 7 no controle Serial.println("Girar esquerda"); s1.write(0); s2.write(70); s3.write(0); s4.write(70); irrecv.resume(); // Receive the next value } else if (results.value==3249148398) { //Botão 8 no controle, por enquanto sem uso Serial.println("8"); irrecv.resume(); // Receive the next value } else if (results.value==3249199398) { //Botão 9 no controle Serial.println("Girar direita"); s1.write(70); s2.write(0); s3.write(70); s4.write(0); irrecv.resume(); // Receive the next value } else if (results.value==3249187158) { //Botão "help" no controle Serial.println("Parado"); s1.write(79); s2.write(83); s3.write(81); s4.write(80); irrecv.resume(); // Receive the next value } else if (results.value==3249201438) { Serial.println("Ligar Motor1"); digitalWrite(motor1, HIGH); irrecv.resume(); } else if (results.value==3249181038) { Serial.println("Desligar Motor1"); digitalWrite(motor1, LOW); irrecv.resume(); } else if (results.value==3249183078) { //Botão "volume menor" no controle Serial.println("Ligar Motor2"); digitalWrite(motor2, HIGH); irrecv.resume(); } else if (results.value==3249150438) { //Botão "volume maior" no controle Serial.println("Desligar Motor2"); digitalWrite(motor2, LOW); irrecv.resume(); } else irrecv.resume(); } }
29/05/2013
Neste encontro, programamos o atirador, escolhemos os Leds para sinalizar o recebimento de um sinal infravermelho quando o motor do atirador estiver funcionando e quando o robô estiver ligado. Tivemos algumas dificuldades na programação, mas, no final, descobrimos que o erro era que o pin que havíamos colocado estava com problemas...
Lição do dia: sempre cheque se todos os pinos estão funcionando
05/06/2013
Neste encontro, nosso objetivo foi fazer o atirador de discos funcionar. Após passar a aula toda tentando consertar, descobrimos que o problema estava no código; pois quando escrevemos o código para o atirador, esquecemos de definir os pinos do motor como output.
Lição do dia: sempre cheque se você definiu todos os pinos do modo correto.
12/06/2013
Neste encontro, fizemos os cálculos de resistência, e colocamos os resistores. Depois disso, fizemos alguns testes com o robô, e percebemos um cheiro de queimado, então vimos que alguns resistores tinham queimado. Após a troca dos resistores queimados, e o conserto de algumas falhas nos cálculos, testamos o robô de novo, e desta vez tudo ocorreu de maneira correta.
19/06/2013
Nesse dia, não tivemos aula por causa dos jogos na Copa das Confederações.
28/06/2013
Nesse dia, fizemos os furos na parte externa do robô para alojar os três Leds de status, o botão de ligar/desligar e o receptor infravermelho. Também mapeamos os circuitos do robô para que ele ficasse mais organizado, e começamos a organizá-los para se adequarem a uma placa de ilha. Para descobrirmos a distância de um lado ao outro do Arduino na placa de ilha, tivemos que contar quantos buracos tinham de distância.
10/07/2013
Hoje, pintamos o robô inteiro, e planejamos terminar seu circuito próxima aula.
Fotos a seguir:
Antes
Depois da pintura, antes da montagem
Montado e pintado
Outro ângulo
Circuito interno
Ou