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.





2 comentários:

  1. Muito bom o projeto, tenho uma duvida, como vocês fizeram para replicar o programa para os demais sensores, visto que são quatro no total.

    ResponderExcluir