Mostrando postagens com marcador ir. Mostrar todas as postagens
Mostrando postagens com marcador ir. Mostrar todas as postagens

terça-feira, 23 de julho de 2013

Problema solucionado: leitura de sensores IR e ultrassom para robôs de sumô

Quando iniciamos a preparação para a OBR de 2013 notamos um problema toda vez que acionávamos os sensores de infravermelho digital junto com o sensor de ultrassom: o robô simplesmente ignorava a leitura de linha e travava o movimento. Para tanto usamos a versão 2.0 do Simulino (santo simulino) e criamos um ambiente de teste, onde os 2 ldr´s da simulação funcionam como sensores IR digitais e o sensor de ultrassom como ele mesmo. Em vez de usarmos os motores, usamos led´s para facilitar a visualização do que está acontecendo, sendo que, o robô deveria reagir conforme fluxograma abaixo:
Para tanto seguimos a seguinte programação:
int emissor=10;
int receptor=9;
long cm1,duracao;

int sensor_d = 6; //conectar ao pino digital 
int sensor_e = 7; //conectar ao pino digital

int diff1;
int diff2;

void setup(){
  pinMode (emissor, OUTPUT);
  pinMode (receptor, INPUT);
  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
  sonar();

Serial.print (linha_d);
Serial.print (", ");
Serial.print (linha_e);
Serial.print (", ");
Serial.println (cm1);

  //se a leitura das linhas corresponder a branco, executa esta função
  if (linha_d<800 || linha_e<800){
    if (cm1<30){
  digitalWrite (13, HIGH); //acende o led no pino 13
  digitalWrite (12, LOW); //desliga o led pino 0
    }
    if (cm1>30){
    digitalWrite (13, LOW); //desliga o led no pino 13
    digitalWrite (12, HIGH); //liga o led pino 0
    }
  }
  if (linha_d>=800||linha_e>=800){
    digitalWrite (13, HIGH); //acende o led no pino 13
    digitalWrite (12, LOW); //desliga o led pino 0
    delay (10);
    digitalWrite (13, LOW); //desliga o led no pino 13
    digitalWrite (12, HIGH); //liga o led pino 0
    delay (10);
  }

}

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

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

int direita(){
pinMode( sensor_d, INPUT );
int leitura_d=digitalRead(sensor_d);
if (leitura_d==HIGH){
  diff1=700;
}
else{
  diff1=900;
}
 return diff1;
}

int esquerda(){
  pinMode( sensor_e, INPUT );
  int leitura_e=digitalRead(sensor_e);
  if (leitura_e==HIGH){
  diff2=700;
}
else{
  diff2=900;
}
  return diff2;
}

Após rodar esta programação, o robô simulou o mesmo erro que observamos nos nossos treinos, onde o robô passa direto pela linha independente de encontrar a linha preta ou não (900 no virtual terminal), acendendo a luz amarela direta. 


Para corrigir alteramos os seguintes trechos:
...
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
 ...
Retirando a leitura do sonar e colocando-a de forma a agilizar a leitura dos sensores, fazendo com que a leitura do ultrassom só seja feita se o robô está sobre a linha branca, conforme abaixo:
 ...
  //se a leitura das linhas corresponder a branco, executa esta função
  if (linha_d<800 || linha_e<800){
  sonar();
...   
Além disso, na função sonar mudamos o valor do tempo em HIGH de 2 microssegundos para 10 microssegundos evitando erros de leitura:
...
int sonar(){
   digitalWrite (emissor, LOW);
  delayMicroseconds (2); 
  digitalWrite (emissor, HIGH);
  delayMicroseconds (10); 
  digitalWrite (emissor, LOW);
  duracao=pulseIn(receptor,HIGH);
  cm1=microsecondstocentimeters(duracao);
}
...

O resultado final pode ser visto no vídeo abaixo,com a pequena alteração de colocar um led vermelho para identificar quando está sobre a a linha preta, um led amarelo para representar sobre a linha branca sem nenhum objeto à frente e, o led verde representando sobre a linha branca com objeto a menos de 30 cm:


Ainda assim, você pode notar que os led´s piscam alternadamente, mostrando que há interferência, causada pela leitura dos sensores. Isso pode provocar movimentos involuntários do robô interferindo no planejamento inicial. Para eliminar o problema criamos uma função que interpreta o sinal dos sensores:
...
//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;
}
...
Essa  função retorna o valor de 100 para branco e 300 para preto, eliminando o defeito anterior. Se baseia no princípio de Máquina de Estados Finitos que pode ser assim definido:
" é um modelo matemático usado para representar programas de computadores ou circuitos lógicos. O conceito é concebido como uma máquina abstrata que deve estar em um de seus finitos estados. A máquina está em apenas um estado por vez, este estado é chamado de estado atual. Um estado armazena informações sobre o passado, isto é, ele reflete as mudanças desde a entrada num estado, no início do sistema, até o momento presente. Uma transição indica uma mudança de estado e é descrita por uma condição que precisa ser realizada para que a transição ocorra. Uma ação é a descrição de uma atividade que deve ser realizada num determinado momento."

Desta forma, conforme o vídeo abaixo, o problema foi finalmente corrigido:

quarta-feira, 13 de fevereiro de 2013

Primeiro TCRT 5000 - sensor de linha

Estas são as fotos do primeiro TCRT 5000 fabricado pela equipe Pequenos Cientistas da EE Elza Facca Martins Bonilha. Foi usado uma fonte 5V e um led, acionado pela saída sinal do sensor, conforme esquema abaixo:

A partir deste esquema, usando uma placa PCI, uma caneta para retroprojetor e um kit de corrosão, foi feita a placa do circuito, conforme as fotos abaixo:



 O fio verde se conecta ao positivo de um led comum (branco) e o negativo, a fonte que alimenta o sensor. Quando o fio está sob uma linha preta ou não há reflexão o led não acende mas, sob um fundo branco ou um objeto de qualquer cor, o led acende variando a intensidade conforme a cor e a distância do objeto, conforme vídeo abaixo:

Parabéns Marcelo por sua primeira placa!

A próxima etapa será o desenvolvimento da versão digital para arduino do TCRT 5000 e a produção da placa por método térmico.

Segue o link para a impressão da imagem da placa pci:
https://skydrive.live.com/redir?resid=AC8ECA0DCFBBC517!376&authkey=!AF0GsSNQBfY_IKE

Depois, o próximo projeto, envolve um sensor de IR - TCRT5000 com amplificação por BC548 (NPN), conforme este esquema:

Segue o link para a impressão da imagem da placa pci:
https://skydrive.live.com/redir?resid=AC8ECA0DCFBBC517!376&authkey=!AF0GsSNQBfY_IKE


segunda-feira, 16 de julho de 2012

TITAN 2.0 Versão 2013

06/03/2013
Testes do TITAN 2.0 funcionando usando o l293c e adição dos diodos para proteção contra sobrecarga - notamos que durante os testes o Arduino e o l293 aquecia:
Vídeo do teste do TITAN

Adição dos diodos


26/02/2013
TESTE DE MOTORES DO TITAN: usando o l293c conseguimos testar os motores do TITAN conforme vídeo abaixo. A ideia é colar as rodas no eixo e montar um borne para suporte das rodas.




17/02/2013 - Placa de circuito impresso com 3 l298n
Esta placa de circuito foi projetada para 3 motores de passo usando o L298n e um regulador de voltagem (5V), o que elimina o uso do Arduino como fonte de alimentação, evitando o acidente causado pelo Prof. Alan, conforme esquema abaixo:

Link para baixar os pdf´s para impressão:
https://skydrive.live.com/redir?resid=AC8ECA0DCFBBC517!398&authkey=!AAqm8K3wx1qMa8Q

13/02/2013 - Testes de atualização
Bom vamos as más notícias: conseguimos configurar o l293c para executar o passo mas os motores não funcionaram. Tudo nos leva a crer em 2 hipóteses:
1- Problemas com os eixos: o eixo pressiona a engrenagem e, como não temos ferramentas apropriadas, como por exemplo uma furadeira de bancada, paquímetros e outros, o que complica a criação de engrenagens. Os eixos ficaram com ângulos em relação a engrenagem do motor o que comprometeu o projeto.
2- Os motores não tem força suficiente e os dentes da engrenagem não se encaixam corretamente. Um dos problemas de se usar reciclagem de materiais são as adaptações que nem sempre funcionam como esperado e, com a falta de equipamentos corretos para furar (nem broca de metal temos), fica difícil.

Por enquanto o TITAN 2.0 vai para a geladeira...


02/2013 - Atualização de projeto - TITAN 2.0

Depois dos problemas usando servo-motores reciclados e termos problemas com os bornes que se quebram com razoável facilidade, parafusos que não conseguimos encontrar para montar o eixo, engrenagens de plástico que se quebram e não há peças de reposição e outros pequenos problemas de tração (achamos que o projeto não tinha torque suficiente) o projeto voltou a ser feito com motores de passo. Para os testes iniciais usaremos o l293c, que não possui a potência do l298n mas é mais fácil de configurar. Nosso atual problema é fixar a roda no eixo de metal, testamos neste fim de semana o araldite para ver se dá certo. Na semana que vem, dia 15/02, testaremos ligar as rodas e ver se deu certo e analisar o torque do projeto.
Fotos do novo projeto abaixo:








------------------------------------------------------------------------------------------------------------





Projeto TITAN 1
Estamos trabalhando com motores de passo bipolares e sensores de IR, pois não temos verbas para comprar sensores de ultrassom. A conformação inicial de sensores seria 4 sensores de linha embaixo para detectar linha preta, ligadas na porta analógica do arduino, e sensores de distância instalados dos 4 lados do robô, para identificar proximidade, com range de 10 cm - se um objeto se aproximar a 10 cm pela lateral ativa a defesa (giro de 90° e segue em frente em direção ao objeto, caso negativo, outro giro de 90° e segue em frente - ainda não discutimos a ação evasiva, pois não sabemos a velocidade do motor. Usaremos o L298 pela sua capacidade de correntes de até 4 ampéres. Isso quer dizer que, se quisermos alterar os motores será possível. Serão 3 l298n (15 pinos), acionados pelas portas PWM do arduino (8 entradas) e uma porta trigger, que irá acionar um circuito baseado no 555 e no l297 que irá acionar o 3 motor, que controla uma garra robótica. Esperamos apoio mas, por enquanto, ninguém manifestou sobre o assunto.