sexta-feira, 31 de maio de 2013

Artemis

01/08/2014

Seguidor de Linha:
1°) Sensores próximos e na linha do eixo de tração
  Em cinco testes o robô cumpriu o percurso em três - 60% de aproveitamento

2°) Sensores posicionados pouco á frente da linha de tração e nas extremidades do chassi
  Em doze repetições o robô realizou nove vezes o circuito - 75% de aproveitamento

Teste de sensor de Ultrassom
  o sensor de ultrassom está funcionando com leitura máxima de 57 cm

Teste de garra 
  A garra está funcionando , embora não foi testada junto com o robô.
14/06/2014 - Ártemis treinando na arena da OBR2014



23/08/2013 - Resultado do Torneio Juvenil de Robótica
Usando nosso programa base de sumô de robôs, conforme sketch abaixo, o robô Artemis conseguiu uma medalha de prata no sumô, nossa primeira medalha no Ensino Fundamental (parabéns Suzane/Celena/Eduardo):
Arenas de sumô (branca) e cabo de guerra (marrom)
Fotos da equipe com os robôs premiados

 As medalhas em detalhe
Programa
int emissor=7;
int receptor=6;
long cm1,duracao;

int sensor_d = 8; //conectar ao pino digital 
int sensor_e = 9; //conectar ao pino digital

int diff1;
int diff2;
int estado;

void setup(){
  pinMode (emissor, OUTPUT);
  pinMode (receptor, INPUT);
  pinMode (2, OUTPUT);
  pinMode (3, OUTPUT);
  pinMode (4, OUTPUT);
  pinMode (5, OUTPUT);
  pinMode (13, OUTPUT);
  pinMode (12, OUTPUT);  
Serial.begin (9600);
}
void loop(){
  //leitura dos sensores de IR
  int linha_d = direita(); //armazena o valor de leitura na viarável linha_d
  int linha_e = esquerda();//armazena o valor de leitura na variável linha_e

Serial.print (linha_d);
Serial.print (", ");
Serial.print (linha_e);
Serial.print (", ");
Serial.println (cm1);
//função que transforma a leitura dos sensores em uma variável, eliminando erros:
if (linha_d<800||linha_e<800){
  estado = 100;
}
if (linha_d>=800||linha_e>=800){
  estado = 300;
}
//se a leitura das linhas corresponder a branco, executa esta função
  if (estado==100){
   Serial.println ("Sobre a linha branca");
   digitalWrite (13, HIGH);
   
     //executa  a leitura de ultrassom
  sonar();
    if (cm1<30){
    Serial.println ("Atacar alvo");
  //comandos de ataque
  digitalWrite (2, HIGH);
  digitalWrite (3, LOW);
  digitalWrite (4, HIGH);
  digitalWrite (5, LOW);
  
    } //fim do if de atacar alvo
    if (cm1>30){
    Serial.println ("Procurando oponente");
 //comandos para localizar o oponente
  digitalWrite (2, HIGH);
  digitalWrite (3, LOW);
  digitalWrite (4, LOW);
  digitalWrite (5, HIGH);
  delay (500);
  digitalWrite (2, HIGH);
  digitalWrite (3, LOW);
  digitalWrite (4, HIGH);
  digitalWrite (5, LOW);
  delay (400);  
   }//fim do if procurando oponente
  }//fim do if sobre linha branca
//se estiver sobre linha preta executa esta função
  if (estado==300){
    Serial.println ("Linha preta retornar");
//comandos quando estiver sobre a linha preta
  digitalWrite (2, LOW);
  digitalWrite (3, HIGH);
  digitalWrite (4, LOW);
  digitalWrite (5, HIGH);
  digitalWrite (13, LOW);
  delay(800);
  digitalWrite (2, LOW);
  digitalWrite (3, HIGH);
  digitalWrite (4, HIGH);
  digitalWrite (5, LOW);
  delay(500);
    }//fim do if linha preta
  }//fim do loop


int sonar(){
  digitalWrite (emissor, LOW);
  delayMicroseconds (2); 
  digitalWrite (emissor, HIGH);
  delayMicroseconds (10); 
  digitalWrite (emissor, LOW);
  duracao=pulseIn(receptor,HIGH);
  cm1=microsecondstocentimeters(duracao);
}

long microsecondstocentimeters(long microseconds){
  return microseconds/29/2;
}

int direita(){
  //Retorna o valor do sensor 
  pinMode( sensor_d, OUTPUT );
  digitalWrite(sensor_d , HIGH );
  delayMicroseconds(10);
  pinMode( sensor_d, INPUT );

  long tempo1 = micros();

  //o tempo medido  HIGH, que acaba 3 segundos depois e retorna um valor de 0 (branco) a 3000 (preto)
  while (digitalRead(sensor_d) == HIGH && micros() - tempo1 < 3000);
  int diff1 = micros() - tempo1;

  return diff1;
}

int esquerda(){
  //Retorna o valor do sensor 
  pinMode( sensor_e, OUTPUT );
  digitalWrite(sensor_e , HIGH );
  delayMicroseconds(10);
  pinMode( sensor_e, INPUT );

  long tempo2 = micros();

  //o tempo medido  HIGH, que acaba 3 segundos depois e retorna um valor de 0 (branco) a 3000 (preto)
  while (digitalRead(sensor_e) == HIGH && micros() - tempo2 < 3000);
  int diff2 = micros() - tempo2;

  return diff2;
}

Logo depois iniciamos o preparo do ano que vem, aprimorando o programa de sumô nos erros cometidos:
- ausência de proteção na dianteira e traseira do robô o que deixou 2 pontos de ataque. Na primeira luta o robô ficou preso no canto e foi empurrado até cair e na terceira luta fomos derrotados pela rampa preta vindo pela frente, que fez com que o robô recuasse sozinho.
- Trocamos as 8 pilhas de 1,2V/2A (9,6V) que tem baixa capacidade de descarga por uma bateria 7V/2A de Ni-MH, que além de menos poluentes, apresentaram um rendimento melhor.
Vídeo do cabo de guerra: Artemis vs Inacio

O planejamento agora envolve o uso do PWM no Artemis para aumentar o torque, dando mais potência para o robô, tornando-o mais eficiente no combate. Aliás, um ótimo resultado foi no cabo de guerra em equipe, onde o Artemis sozinho carregou 2 legos, segurando-os. Não teve força para arrastá-los mas também não foi arrastado, sendo derrotado porque o parceiro que caiu no fosso.   

28/06/2013 - Instalação do suporte de baterias e pilhas
Fotos da instalação do suporte de baterias e pilhas no robô. Estamos quase prontos, falta só providenciar uma sensor de ultrassom...





14/06/2013 - Teste de Combate
O robô Artemis recebu seu programa de combate e foi testado. Este programa é o módulo básico de combate do robô.
No primeiro teste o robô reconhece a linha e foi programado para virar:

Este teste falhou pois o robô saía da área de luta o que, no sumô, causaria a queda para fora da arena.
Para o segundo teste, inserimos um comando para que o robô, quando encontrasse a linha, retornasse e depois virasse, o que resolveu o problema, conforme o vídeo abaixo.

Na primeira tentativa, por conta da pista improvisada ele passou reto mas, com mais um pouco de fita adesiva no local, para evitar ondulações, o robô se comportou como esperado. A mesa suja causou interferência no processo mas não compromoteu o teste.

07/06/2013 Teste de programação
Hoje testamos uma programação básica para o robô usando um simulador feito em protoboard e o TCRT 5000 como sensor IR de linha. A ideia foi usar 2 led´s acendendo representando os motores, ou seja, quando o robô estiver sobre a linha preta deve virar (acende um led) e depois, quando está sobre a linha branca os dois motores devem estar no mesmo sentido (acende os dois led´s ).
De início, no código, não desligamos os 2 pinos que fariam o reverso do motor (primeira parte do vídeo) o que deixava os led´s acesos constantemente, representando que o motor não inverteria o sentido.
/*Progamação de robô de sumô para o torneio juvenil de robotica*/
int sensor;
void setup(){
pinMode(5, OUTPUT);//MOTOR DIREITO PARA FRENTE
pinMode(6, OUTPUT);//MOTOR DIREITO PARA TRAZ
pinMode(8, OUTPUT);//MOTOR ESQUERDO PARA FRENTE
pinMode(7, OUTPUT);//MOTOR ESQUERDO PARA TRAZ
pinMode(A0, INPUT);//SENSOR
}
void loop(){
  sensor=analogRead(A0);
  if (sensor<500){
    digitalWrite(5, HIGH);
    digitalWrite(7, HIGH);
    delay(500);
  }
  else{
    digitalWrite(5,HIGH);
    digitalWrite(8,HIGH);
  }
}
Na segunda tentativa usamos o LOW para desligar os pinos digitais que não estavam ativos e o resultado foi melhor.
/*Progamação de robô de sumô para o torneio juvenil de robotica*/
int sensor;
void setup(){
pinMode(5, OUTPUT);//MOTOR DIREITO PARA FRENTE
pinMode(6, OUTPUT);//MOTOR DIREITO PARA TRAZ
pinMode(8, OUTPUT);//MOTOR ESQUERDO PARA FRENTE
pinMode(7, OUTPUT);//MOTOR ESQUERDO PARA TRAZ
pinMode(A0, INPUT);//SENSOR
}
void loop(){
  sensor=analogRead(A0);
  if (sensor<500){
     digitalWrite(6, LOW);
    digitalWrite(8, LOW);
    digitalWrite(5, HIGH);
    digitalWrite(7, HIGH);
    delay(500);
  }
  else{
     digitalWrite(6,LOW);
    digitalWrite(7, LOW);
    digitalWrite(5,HIGH);
    digitalWrite(8,HIGH);
  }
}
Vídeo dos testes

Para o próximo teste usaremos um delay após o comando dos motores para frente, como forma de otimizar o sistema de ataque do robô.
Este programa será a primeira estratégia de ataque.

03/06/2013
Informações técnicas sobre o Artemis:
Dimensões: 17x26x6,5 cm
Cérebro: Arduino Uno Rev.3
Alimentação: Bateria LiPo 11V/1A ou 6V/2A (motores)  e 9V/350mA (Arduino)
Sensores: IR - QR1113 (2) e Ultrassom - HC-SR04
Controle de motores: L293d
Motores: 4 servo-motores Gardner adaptados para rotação contínua
Consumo Previsto: 400 mAh dos motores e 100 mAh do Arduino e sensores

Fotos do Projeto:
Estrutura do projeto




Adicionando o Arduino, protoboard, sensor de ultrassom e l293d





Vídeos dos testes:
Condições: fonte de alimentação 9V/500mA, teste de sumô com localização de objeto e emissão de som (buzzer) mais agudo conforme a distância do objeto. Por uma questão de estratégia ainda não vamos divulgar a programação do Arduino mas, após o Torneio Juvenil de Robótica 2013, divulgaremos a programação.
Vídeos de teste do robô: teste de motores


Vídeo de teste sobre uma superfície

Vídeo de teste de luta: o alvo é um pedaço de fonte ATX de computador
Ajustes necessários:
-Fixação do Arduino
-Fixação da Protoboard
-Instalação das baterias
-Instalação dos sensores de IR
- Ajuste de servo-motores e rodas, corte dos parafusos e melhorias na estrutura
-Instalação dos led´s de alerta
- Nova programação completa

31/05/2013
Sua origem está na estrutura do projeto Orion que teve seu tamanho reduzido para 17x20. Mantém a base de 4 servo-motores com alimentação por pilhas AA 1,2V recarregáveis (6V/2000mAh) e o uso de um Arduino UNO alimentado por baterias de 9V/350mA.
Segundo o Wikipédia (http://pt.wikipedia.org/wiki/%C3%81rtemis):
"Na GréciaÁrtemis ou Artemisa (em gregoΆρτεμις1 ) era uma deusa ligada inicialmente à vida selvagem e à caça. Durante os períodos Arcaico e Clássico, era considerada filha de Zeus e de Letoirmã gêmea de Apolo ; mais tarde, associou-se também à luz da lua e à magia. Em RomaDiana tomava o lugar de Ártemis, frequentemente confundida com Selene ou Hécate, também deusas lunares."

2 comentários:

  1. Vocês possuem o diagrama? Estou fazendo o tcc do técnico em mecatronica e gostaria de ver as ligações. Obrigado desde já pelo post

    ResponderExcluir
    Respostas
    1. Olá Natan tudo bem? Que tipo de diagrama você precisa? Da eletrônica do Artemis? Como ligamos o l293d o sensor de ultrassom? Tem uns erros nesse projeto que precisamos avisar... Me passe seu e-mail que eu mando o artigo que tem os detalhes do projeto

      Excluir