Página principal
Detector de obstáculos mediante arduino y el hc-sr04
xsetaseta@gmail.com

Ayer me llegó un hc-sr04, detector de obstáculos mediante ultrasonidos. Se puede encontrar por un precio entre 2€ y 6€.
En este montaje pretendo realizar un detector de obstáculos que produzca un sonido dependiendo la distancia.
El montaje se realiza mediante el buen arduino y el detector hc-sr04, ademas de  un altavoz  piezoelectrico.
Su utilización práctica puede ser extensa, pero la primera que me viene a la mente es de ayuda para aparcar un coche.


hc-sr04

Voltaje: 5VDC

  • Corriente en reposo: < 2 mA

  • Salida: High 5V/Low 0V

  • Angulo: < 15º

  • Distancia: 2 a 450 cm

  • Resolución: 0,3 cm

Pins de conexión:

  • VCC

  • Trig (Disparo del ultrasonido)

  • Echo (Recepción del ultrasonido)

  • GND


La formula para calcular la distancia es:
Distancia = {(Tiempo entre Trig y el Echo) * (V.Sonido 340 m/s)}/2
El montaje es el siguiente:

La asignación de los pin de arduino que se conectan al hc-sr04 se pueden cambiar a gusto de cada uno.
En mi montaje la conexión es la siguiente:

ARDUINO Digital
HC-SR04
GND
GND
5V
Vcc
9
Trig
8
Echo

En este primer montaje solo realizamos el detector que manda la distancia hasta el obstaculo al ordenador mediante la conexion usb.
// Ultrasonic - Library for HR-SC04 Ultrasonic Ranging Module.
// SETA43
// xsetaseta@gmail.com

#include <Ultrasonic.h>

Ultrasonic ultrasonic(9,8); // (Trig PIN,Echo PIN)

int sonar;                  //Declaramos la variable sonar

void setup() {
  Serial.begin(9600); 
}

void loop()
{
 
  sonar = ultrasonic.Ranging(CM); //Leemos la distancia del sonar 
  
  Serial.print(sonar); // CM or INC
  Serial.println(" cm" );
  delay(100);  
}
Programa que utiliza la librería Ultrasonic.
En la versión de esta librería que he utilizado, está colocada para que solo mida hasta 50cm.
Para medir hasta 5m debes modificar el archivo de la librería Ultrasonic.ccp.
Cambiar:
Time_out=3000;  // 30ms 5 metros // 3ms 50cm

// SETA43
// xsetaseta@gmail.com
//29-11-2012


#define ECHOPIN 8       // Pin to receive echo pulse  (Echo PIN)
#define TRIGPIN 9        // Pin to send trigger pulse (Trig PIN)


unsigned int tiempo,distancia;                  


void setup() {
  Serial.begin(9600); 
  pinMode(ECHOPIN, INPUT);
  pinMode(TRIGPIN, OUTPUT);
}
  
void loop()
{
 
  digitalWrite(TRIGPIN, LOW);
  delayMicroseconds(2);
  digitalWrite(TRIGPIN, HIGH);
  delayMicroseconds(10);
  digitalWrite(TRIGPIN, LOW);
  // Calcula la distancia midiendo el tiemp que est el pin ECHOPIN en alto.
  tiempo = pulseIn(ECHOPIN, HIGH);
  // La velocidad del sonido es 340 m/s o 29 microsegundos por centimetro.
  distancia= tiempo/58;
  //manda la distancia al puerto serie.  
  Serial.print(distancia);
  Serial.println(" cm");
  delay(200);
  
}
En este caso no utiliza ninguna librería, emplea el comando pulseIn.


Consola del arduino recibiendo datos de distancia.
En el caso que vemos en la consola, hemos utilizado float para ver decimales en los centímetros.
 


Una vez probado el funcionamiento del circuito, nos disponemos a poner el altavoz  piezoelectrico.
Al utilizar un altavoz  piezoelectrico no hace falta colocar resistencia debido a su alta impedancia.
Si se utiliza un altavoz de 8 ohmios se debería utilizar una resistencia en serie de 330 ohmios.

La conexión del altavoz se realiza al pin Digital 7, y a la masa GND.
También se puede variar el pin de conexión en el programa.

// SETA43
// xsetaseta@gmail.com
//29-11-2012


#define ECHOPIN 8       // Pin to receive echo pulse  (Echo PIN)
#define TRIGPIN 9        // Pin to send trigger pulse (Trig PIN)

#define PINTONO 7


unsigned int tiempo,distancia;                  


void setup() {
  Serial.begin(9600); 
  pinMode(ECHOPIN, INPUT);
  pinMode(TRIGPIN, OUTPUT);
  pinMode(PINTONO, OUTPUT);
}
  
void loop()
{
 
  digitalWrite(TRIGPIN, LOW);
  delayMicroseconds(2);
  digitalWrite(TRIGPIN, HIGH);
  delayMicroseconds(10);
  digitalWrite(TRIGPIN, LOW);
  // Calcula la distancia midiendo el tiemp que est el pin ECHOPIN en alto.
  tiempo = pulseIn(ECHOPIN, HIGH);
  // La velocidad del sonido es 340 m/s o 29 microsegundos por centimetro.
  distancia= tiempo/58;
  //manda la distancia al puerto serie.  
  Serial.print(distancia);
  Serial.println(" cm");
  tone(PINTONO,2000);
  delay(200);
  //Si la distancia es menor que 10cm, produce un tono continuo
  if (distancia>10)noTone(PINTONO);
  delay(distancia*3);
  
}

Vídeo del montaje funcionando:  http://youtu.be/Efmkj8W7ai

Bibliografía:

http://electronicavm.wordpress.com/2011/07/07/sensor-de-aparcamiento-con-arduino/
http://www.ardublog.com/library-for-arduino-ultrasonic-ranging-hc-sr04/

Un saludo.
JUAN GALAZ