Mostrando postagens com marcador sensor ultrassom. Mostrar todas as postagens
Mostrando postagens com marcador sensor ultrassom. 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, 26 de junho de 2013

Sistema de radar usando Arduino e Ultrassom

09/09/2013 - Teste do radar
Após os testes teóricos realizamos os testes práticos. O primeiro teste consistiu no sensor de ultrassom fixo e o servo motor marcando a posição. O led verde acende quando o objeto está a menos de 20 cm e a posição do servo aumenta de 10 em 10º sem delay entre os ângulos.
A fonte de alimentação do servo foi ligada separado para evitar interferência (ruído).
No segundo teste instalamos o sensor de ultrassom sobre o servo motor (deu um trabalhão pois o suporte reciclado está com problemas) e continuamos usando o mesmo aumento e a mesma distância. Resultado extremamente positivo, com o led acendendo quando o sonar encontra o objeto.
Próximo teste será no chassi com busca do objeto e ataque.

30/08/2013
Continuando o sistema de desenvolvimento de um radar para nossos robôs usando um servo de posição e um sensor de ultrassom, desenvolvemos um programa baseado nos testes anteriores usando apenas o if como base de decisão.
Primeiro determinamos 2 variáveis que trarão as informações do servo-motor:
...
int posicao;
int m;
...
(m) corresponde a posição que o motor vai ficar (servo.write) e (posicao) a leitura de posição atual do motor. Em segundo lugar determinamos como o servo vai aumentar a posição através do comando:
...
if (m<180){
   m+=10;
   radar.write (m);
   Serial.println ("Procurando alvo");
   delay(10);
  }
...
Ou seja, o servo aumentará de 10 em 10 graus seu ângulo até 170 graus. Por que não 180? Porque o modelo que usamos no simulador do proteus (simulino) vai só até 180. O servo que usamos vai até 225º e portanto poderemos até aumentar estes valores na prática.
Depois inserimos a variável que irá "zerar" o motor se nada for encontrado no radar:
...
 if (m==180){
  radar.write (0);
  Serial.println ("Zerando a posicao");
  m=0;
  delay (500);
  }
Essa foi a mais díficil pois estávamos usando (m==0) e não (m=0) o que fazia com que o motor voltasse mas não zerasse. Opcionalmente pode-se usar:
...
 if (m==180){
  m=0;
  radar.write (m);
  Serial.println ("Zerando a posicao");
  delay (500);
  }
...
Os (delay) utilizados foram apenas para que pudéssemos visualizar na gravação da simulação o que ocorria pois a velocidade de processamento e do (Serial.print) não deixava claro o que estava acontecendo. No programa no final desta atualização removeremos.
Depois inserimos as variáveis de controle baseados na leitura do ultrassom:
...
if (cm1>20){
....// comandos para movimentação e zerar servo anteriores
}
  if (cm1<=20){
//comandos para atacar alvo
   Serial.println ("Atacar alvo");
   delay (1000);
 }
...
Novamente colocamos o (delay) para facilitar a visualização na gravação no proteus.
Finalmente inserimos o comando de leitura do sensor de ultrassom (sonar) e criamos uma função para leitura do sensor logo após o (void loop) para assim limitar o movimento do servo se baseando na distância do alvo, conforme o programa abaixo:
_________________________________________________________________________________
//Programa Pequenos Cientistas para sistema de radar
#include <Servo.h>//biblioteca do servo motor
//Variáveis do sensor de ultrasssom
int emissor=11;// trigger pinos do sensor de ultrassom
int receptor=10; //echo pinos do sensor de ultrassom
long cm1,duracao;
//Variáveis do servo-motor
Servo radar;
int posicao;
int m;

void setup(){
  //aciona os pinos do sensor de ultrassom
  pinMode (emissor, OUTPUT);
  pinMode (receptor, INPUT);
  //pino do servo-motor
  radar.attach (9);
  Serial.begin (9600);
}//fim do void setup

void loop(){
  //leitura do sensor de ultrassom
  sonar();
  //leitura da posição do servo
  posicao=radar.read();
  //imprime as leituras
  Serial.print (cm1);
  Serial.print (", ");
  Serial.print (posicao);
  Serial.print (", ");
  Serial.println (m);
  //Se o objeto estiver a mais de 20 cm
 if (cm1>20){
  if (m<180){
   m+=10;
   radar.write (m);
   Serial.println ("Procurando alvo");
   delay(10);
  }//fim do if para movimentar o servo
  if (m==180){
  radar.write (0);
  Serial.println ("Zerando a posicao");
  m=0;
  delay (500);
  }// fim do if para zerar o servo
 }// fim do if de distância do alvo
 //Se o objeto estiver a menos de 20 cm
  if (cm1<=20){
    //comandos de ataque
   Serial.println ("Atacar alvo");
   delay (1000);
 }//fim do if atacar alvo
}//fim do void loop
//Função de leitura do sensor de ultrassom
long sonar(){
  digitalWrite (emissor, LOW);
  delayMicroseconds (2);
  digitalWrite (emissor, HIGH);
  delayMicroseconds (10);
  digitalWrite (emissor, LOW);
  duracao=pulseIn(receptor,HIGH);
  cm1=microsecondstocentimeters(duracao);
  return cm1;
}
//Converte microssegundos em centímetros - velocidade do som = 1cm/29ms
long microsecondstocentimeters(long microseconds){
  return microseconds/29/2;
}
_________________________________________________________________________________
Vídeo de teste:
O primeiro número é a leitura do ultrassom, o segundo a leitura da variável (posicao) - servo.read, e o terceiro número é a leitura da variável (m) que controla a posição do servo. No teste primeiro deixamos o servo buscar até o final e retornar a zero, aí simulamos um objeto e, depois, esse objeto sai da frente do sensor de ultrassom, retornando a busca normal pelo objeto.


19/07/2013
Fonte para consulta (slide share):
http://www.slideshare.net/Miojex360/rob-seguidor-de-linha

20/06/2013 - Início do Projeto
Objetivo: desenvolver um sistema de sensor de ultrassom que localize um objeto, sem mover o chassi e, depois, o chassi se move em direção ao objeto.

Materiais:
Servo de posição HB
Sensor de ultrassom HC-SR04
Arduino Uno
Protoboard para testes
Fios wire macho macho
Chassi de teste : robô Osíris

Planejamento dos testes
1- Teste do servo motor usando o comando for (0 a 180º)
2- Teste de programa usando o sonar e o servo-motor: o servo deve se mover parando quando encontrar o objeto.
3- Teste de programa simulando o motor: o servo deve se mover até encontrar o objeto. Após encontrar o objeto luzes se acenderão simulando os motores do robô e, depois, o servo deve se posicionar em 90º, acionando um outro conjunto de luzes.
4- Teste final: o sonar será instalado no chassi Osíris e será realizado os testes de simulação de combate contra o robô Artemis.

Fase 1- Teste de uso do servo motor
Objetivo: determinar um programa de controle do servo-motor
Neste caso usamos o comando for e as instruções contidas no modelo de programa da pasta "Examples" do Arduino.
Resultado - O motor funcionou, movendo-se de 1 em 1º.
Vídeo abaixo:

 Teste 2- Montagem do radar
Neste teste fizemos 9 programas diferentes sendo que, usamos o comando for, comandos if e outros para ver se conseguíamos fazer o servo localizar o objeto e parar de se mover. O teste 1, 3 e 9 foram os únicos que chegaram próximos disso, conforme vídeos abaixo:
Teste 1

Teste 3

Teste 9

Chegamos a conclusão que o melhor programa era o do "Teste 1" e, portanto trabalharíamos em aprimorá-lo para conseguir chegar ao objetivo desta etapa. Abaixo segue imagem com o fluxograma utilizado, e os links para o programa já na linguagem do Arduino.

Teste 11 - Neste teste usamos o comando if para fazer a função dos comandos que estavam distribuídos ao longo do sketch do programa 1, deixando mais próximo do fluxograma de programa que julgamos ideal, atingindo nosso objetivo nesta etapa que era do radar se mover até encontrar o objeto. Caso o objeto saísse da frente ele voltava a rotina de busca e localização. Como padrão usamos a distância de 30 cm que era a distância ideal da mesa de teste.

quinta-feira, 15 de novembro de 2012

Sensor de ultrassom

08/12/2012
Artigo que será a base do projeto:
http://www.nitt.edu/portal/rmi/home/projects/ultrasonic_sensors/

Fizemos o primeiro teste de sensor de ultrassom. Usamos um buzzer comum e um microfone retirado do Arduino, usando o comando tone - tone (6, 30000); - e, no microfone um resistor de 1k e de 10k ohm e o resultado foi negativo, não funcionou.

5/12/2012 - Planejamento do trabalho
Fase 1- Usando o Arduino para gerar 40kHz de frequência, buzzer e um microfone ligado a porta analógica
Fase 2- Adicionando a fase 1 um amplificador ou filtro de frequências (microfone)
Fase 3 - Adicionando a fase 2, no amplificador ou filtro, um RS232 para converter o sinal
Fase 4 - Substituindo o Arduino por um 555 gerando pulsos de 40kHz.
Fase 5 Montagem em placa e teste final

Perguntas para a introdução
O que é um sensor?
O que é frequência? O que é som? Quais são as frequências do ultrassom?
Quais são as aplicações de sensores de ultrassom?
Resumo do projeto (o que vamos fazer)

15/11/2012
Estamos planejando fabricar nosso próprio sensor de ultrassom e como referência básica usamos este link:
http://www.micro-examples.com/public/microex-navig/doc/090-ultrasonic-ranger.html

Para tanto, vamos usar este esquema:



Os primeiros testes foram feitos no Simulino, usando este sketch mas, ainda não obtivemos resultado, até porque nós não sabemos como criar uma simulação de reflexão.


/* Código adaptado do sensor PING */

// configura os pinos de sáida
const int emissor = 7;
const int receptor = 8;


void setup() {
  // initialize serial communication:
  Serial.begin(9600);
  pinMode(emissor, OUTPUT);
  pinMode(receptor, INPUT);

}

void loop()
{
  // establish variables for duration of the ping,
  // and the distance result in inches and centimeters:
  long duration, cm;

  // The PING))) is triggered by a HIGH pulse of 2 or more microseconds.
  // Give a short LOW pulse beforehand to ensure a clean HIGH pulse:

  digitalWrite(emissor, LOW);
  delayMicroseconds(2);
  digitalWrite(emissor, HIGH);
  delayMicroseconds(5);
  digitalWrite(emissor, LOW);
  //o receptor faz a leitura do estado do pino e se retorna HIGH ele informa
  duration = pulseIn(receptor, HIGH);
  cm = duration/58;//converte o valor do sensor1 em cm


  Serial.print(cm);
  Serial.println("cm");
  delay(100);


}

quarta-feira, 10 de outubro de 2012

Leitura de 2 sensores de ultrassom HC-SR04 com Arduino

Em nossa pesquisa de uso de sensores de ultrassom não encontramos nenhuma referência de códigos para Arduíno que apresentasse a leitura de 2 sensores de ultrassom. Começamos a pesquisar um código fonte de exemplo ( o PING) e chegamos ao presente resultado, que apresenta um nível de resposta satisfatório:

Abaixo as fotos da montagem em Breadboard:



O código fonte utilizado:

/* Código adaptado do sensor PING */

// configura os pinos de sáida
const int emissor = 7;
const int receptor = 8;


void setup() {
  // initialize serial communication:
  Serial.begin(9600);
  pinMode(emissor, OUTPUT);
  pinMode(receptor, INPUT);

}

void loop()
{
  // establish variables for duration of the ping,
  // and the distance result in inches and centimeters:
  long duration, inches, cm;

  // The PING))) is triggered by a HIGH pulse of 2 or more microseconds.
  // Give a short LOW pulse beforehand to ensure a clean HIGH pulse:

  digitalWrite(emissor, LOW);
  delayMicroseconds(2);
  digitalWrite(emissor, HIGH);
  delayMicroseconds(5);
  digitalWrite(emissor, LOW);


  //o receptor faz a leitura do estado do pino e se retorna HIGH ele informa
  duration = pulseIn(receptor, HIGH);

  // converte a distância
  inches = microsecondsToInches(duration);
  cm = microsecondsToCentimeters(duration);
  inches2 = microsecondsToInches(duration2);
  cm2= microsecondsToCentimeters(duration2);

  Serial.print(inches);
  Serial.print("in, ");
  Serial.print(cm);
  Serial.print("cm,");
  Serial.println();

  delay(100);
}

long microsecondsToInches(long microseconds)
{
  // According to Parallax's datasheet for the PING))), there are
  // 73.746 microseconds per inch (i.e. sound travels at 1130 feet per
  // second).  This gives the distance travelled by the ping, outbound
  // and return, so we divide by 2 to get the distance of the obstacle.
  // See: http://www.parallax.com/dl/docs/prod/acc/28015-PING-v1.3.pdf
  return microseconds / 74 / 2;
}

long microsecondsToCentimeters(long microseconds)
{
  // The speed of sound is 340 m/s or 29 microseconds per centimeter.
  // The ping travels out and back, so to find the distance of the
  // object we take half of the distance travelled.
  return microseconds / 29 / 2;
}
Abaixo o vídeo de resposta desta programação:

Nosso desafio foi adaptar este código a leitura de 2 sensores de ultrassom ao mesmo tempo. Usamos led´s diferentes pois o vermelho era de alto brilho e atrapalhava a visão. O código fonte segue abaixo:


/* Programa para uso de 2 Sensores de Ultrassom medindo distância em cm para robôs de combate - Projeto TITAN
Código adaptado do sensor PING
Grupo Pequenos Cientistas*/

// constante dos pinos
const int emissor = 7;
const int receptor = 8;
const int emissor2= 9;
const int receptor2= 10;

void setup() {
  // Configuração de pinos como entrada e saída
  pinMode(emissor, OUTPUT);
  pinMode(receptor, INPUT);
  pinMode(emissor2, OUTPUT);
  pinMode(receptor2, INPUT);
  pinMode(12, OUTPUT);
  pinMode(13, OUTPUT);
}

void loop()
{
  // variáveis utilizadas para conversão do ping em centímetros
  long duration, inches, cm;
  long duration2,inches2, cm2;

  // sensor 1
  //desliga o emissor
  digitalWrite(emissor, LOW);
  delayMicroseconds(2);
  // 2 microssegundos depois enivia um sinal que dura 5 microssegundos
  digitalWrite(emissor, HIGH);
  delayMicroseconds(5);
  //desliga o emissor
  digitalWrite(emissor, LOW);
  // o receptor recebe o eco e envia um sinal digital HIGH - alto
  duration = pulseIn(receptor, HIGH);
  //converte os valor do sinal de microssegundos para centímetros, retornando a variável cm
  cm = microsecondsToCentimeters(duration);
//condição de leitura da variável - comandos para motores
 if (cm > 15){
   digitalWrite (13, HIGH); // se a distância for maior que 15 cm acende o led
  }
 else{
   digitalWrite(13, LOW); // se não, desliga o led
 }
// Sensor 2
//desliga o emissor
  digitalWrite(emissor2, LOW);
  delayMicroseconds(2);
// 2 microssegundos depois enivia um sinal que dura 5 microssegundos
  digitalWrite(emissor2, HIGH);
  delayMicroseconds(5);
 //desliga o emissor
  digitalWrite(emissor2, LOW);
  // o receptor recebe o eco e envia um sinal digital HIGH - alto
  duration2 = pulseIn(receptor2, HIGH);
  // converte a distância e retorna a variável cm
  cm2= microsecondsToCentimeters(duration2);
//condição de leitura da variável - comandos para motores
 if (cm2 > 15){
   digitalWrite (12, HIGH);// se a distância for maior que 15 cm acende o led
   }
    else{
   digitalWrite(12, LOW);// se não, desliga o led
 }
}

// Variável de conversão de microssegundos para centímetros
long microsecondsToCentimeters(long microseconds)
{
  // A velocidade do som é 340 m/s ou 29 microssegundos por centímetro. O ping vai e volta e, sua distância será metade do tempo de ida e volta.
  return microseconds / 29 / 2;
}

Neste programa iniciamos fazendo os comenados fazerem a leitura de um sensor junto com o outro. O resultado foi desastroso lia o sensor 1 e não o 2. Depois separamos os sensores e inserimos, após a leitura dos dois, a condição de reação e resolvemos o problema.

O vídeo de 2 sensores fazendo a leitura de distância:

Aplicação
Instalação dos sensores nos robôs (parabéns pela ideia de usar os soquetes de led de computadores Paulo). No robô, instalamos 4 sensores e o resultado foi satisfatório:









Vídeo do robô em funcionamento utilizando os sensores de ultrassom para desviar dos obstáculos.





domingo, 30 de setembro de 2012

Sugestão

Na biblioteca do sensor HC-SR04 veio um modelo que sugere usar o sensor de ultrassom com lcd conforme programa abaixo:

#include "Ultrasonic.h"
#include <LiquidCrystal.h>
LiquidCrystal lcd(11, 10, 9, 4, 5, 6, 7);
Ultrasonic ultrasonic(12,13);

void setup() {
lcd.begin(16, 2);
lcd.print("testing...");
}

void loop()
{
  lcd.clear();
  lcd.setCursor(0, 0);
  lcd.print(ultrasonic.Ranging(CM));
  lcd.print("cm");
 
  delay(100);
}

Caso queira tentar use o esquema abaixo:

Detalhe: quando fui testar na versão Arduíno 1.0.1 descobri que a biblioteca não funciona. Tive que alterar o Arduíno versão 0022 aí a biblioteca funcionou.

SENSOR DE ULTRASSOM HC-SR04

Aplicação em robôs de sumô: detecção de objetos.
Programa de testes- Utilizado para 2 sensores de ultrassom:

// Comandos para leitura de sensor de ultrassom para os robôs TITAN e ORION.
//sensor 1
#define echoPin 2                            // Pino do Arduino para emissor
#define trigPin 3                            // Pino do Arduino para receptor
//sensor 2
#define echoPin1 4                           // Pino do Arduino para emissor
#define trigPin1 5                           // Pino do Arduino para receptor

float distancia=0; // variável para distância do sensor 1
float distancia1=0;//variável para distância do sensor 2

float valorSensor=0; //valor do sensor 1
float valorSensor1=0;//valor do sensor 2

void setup(){
  Serial.begin(9600);
  pinMode(echoPin, INPUT); // seta pino 2 como entrada - receptor - echo
  pinMode(trigPin, OUTPUT); // seta pino 3 do Arduino como saída - transmissor - trigger
  pinMode(echoPin1, INPUT);//seta o pino 4 como entrada receptor
  pinMode(trigPin1, OUTPUT);//seta o pino 5 como saída (gatilho) - transmissor
}

void loop(){
  //sensor de objeto 1
  digitalWrite(trigPin, LOW); // desliga o pino gatilho do sensor por 2 microssegundos
  delayMicroseconds(2);
  digitalWrite(trigPin, HIGH);// gatilho ativado por 10 microssegundos
  delayMicroseconds(10);
  digitalWrite(trigPin, LOW);// gatilho desligado
  //sensor de objeto 2
  digitalWrite(trigPin1, LOW); // desliga o pino gatilho do sensor por 2 microssegundos
  delayMicroseconds(2);
  digitalWrite(trigPin1, HIGH); // gatilho ativado por 10 microssegundos
  delayMicroseconds(10);
  digitalWrite(trigPin1, LOW); // gatilho desligado

  int distance = pulseIn(echoPin, HIGH);//leitura do sensor 1 - alto ou baixo.
  int distance1 = pulseIn(echoPin1, HIGH);//leitura do sensor 2 - alto ou baixoo pulso em microssegundos.
  distance = distancia/58;//converte o valor do sensor1 em cm
  distance1 = distancia1/58;//converte o valor do sensor2 em cm
  //a partir daqui pode seguir com as variáveis para controlar os motores usando a distância
  //comando para exibir no serial monitor o valor de distância
  Serial.print(distancia);
  Serial.print(distancia1);
  Serial.println(distancia);
  Serial.println(distancia1);
  delay(100);
}


FONTE: http://www.webtronico.com/documentos/HC-SR04.pdf


Descrição:
 Medidor de distância ultrasônico é capaz de medir distâncias de 2cm a 5 metros. O módulo possui um circuito pronto, com emissor e receptor ultrasônico.
Conexões:
  • 5V Supply
  • Trigger Pulse Input
  • Echo Pulse Output
  • 0V Ground
Também pode ser utilizado para detectar objetos, movimento, etc.
Especificações:
  • power supply :5V DC
    Corrente: 15mA
  • quiescent current : <2mA
  • effectual angle: <15°
  • alcance da medição : 2cm – 500 cm
  • resolution : 3mm
O módulo possui 4 pinos : VCC , Trig, Echo, GND . Sendo assim, é muito simples utiliza-lo. O processo de medição se resume em: coloque o pino TRIG em nível ALTO por mais de 10us, e a medição começa; Quando o ultrassom emitido bater em um obstáculo e voltar, o pino ECHO ficará em nível ALTO pelo tempo correspondente a distância medida. Assim, a distância do obstáculo pode ser medida pelo tempo (largura do pulso) que o pino ECHO ficar em nível alto usando a seguinte regra:
Distância em CEMTIMETROS: (largura do pulso em uS) / 58;
Distância em POLEGADAS: (largura do pulso em uS) / 148;
Se a largura do pulso for igual a 38ms, então não tem obstaculo.

sábado, 25 de agosto de 2012

Projeto Fenix - Seguidor de linhas

19/12/2012
Apesar dos meses sem evolução e parados, neste fim de ano, esse chassi recebeu uma atenção especial e, esta semana, passou pelos primeiros testes usando o Arduino e 4 sensores de linha. Ainda com problemas para virar, este projeto se mostrou muito bom, precisando apenas de ajustes no motor dianteiro (que vira o carrinho), mas com boa velocidade e tração. Segue abaixo os vídeos de testes:

25/08/2012
A equipe Fenix está desenvolvendo um projeto de seguidor de linha para desafios "Labirinto de Linhas" do Torneio Juvenil de Robótica, Seguidor de Linhas do Summer Challenge da Robocore  e para o "Resgate de Alto Risco" da OBR - Olimpíada Brasileira de Robótica. Abaixo segue vídeo do chassi, doação da empresa Citoka Chinelos, em que a equipe transformou a base de um carrinho de controle remoto em um suporte para o Arduíno, protoboard e uma garra de acrílico (projeto vencedor do 5° Grande Desafio - Unicamp 2011).

Ainda falta material para completar o projeto mas podemos ver que ele é veloz e tem precisão de movimentos. Falta os sensores de linha (comprados hoje da empresa Laboratório de Garagem e da empresa Webtronico) que serão instalados nos próximos 15 dias. Serão 2 na lateral (25cm entre eles) e 1 na dianteira. Além disso, estamos trabalhando num projeto de sensor de ultrassom para detecção de objetos usando o esquema abaixo:

Em breve publicaremos a programação e os vídeos do robô com o Arduino instalado.

Obrigado Citoka, pela doação.