Saltar al contenido principal

Código básico para medir distancias

Con Trig en el pin 10 y Echo en el pin 9.

1. Medir y mostrar la distancia​

#define TRIG 10
#define ECHO 9

void setup() {
pinMode(TRIG, OUTPUT);
pinMode(ECHO, INPUT);
Serial.begin(9600);
}

void loop() {
// pulso de 10 µs en Trig
digitalWrite(TRIG, LOW);
delayMicroseconds(2);
digitalWrite(TRIG, HIGH);
delayMicroseconds(10);
digitalWrite(TRIG, LOW);

// duración del eco (máximo 30 ms)
long tiempo = pulseIn(ECHO, HIGH, 30000);
float distancia = tiempo * 0.0343 / 2;

if (tiempo == 0) {
Serial.println("Sin eco (fuera de alcance)");
} else {
Serial.print(distancia, 1);
Serial.println(" cm");
}

delay(60); // deja que se apaguen los ecos antes de medir otra vez
}

Mueve la mano delante del sensor y mira el Monitor Serie.

2. Una función reutilizable​

Para usarlo dentro de un programa más grande, encapsula la medida:

float medirDistancia() {
digitalWrite(TRIG, LOW);
delayMicroseconds(2);
digitalWrite(TRIG, HIGH);
delayMicroseconds(10);
digitalWrite(TRIG, LOW);

long tiempo = pulseIn(ECHO, HIGH, 30000);
if (tiempo == 0) return 999; // sin eco: lo tratamos como "muy lejos"
return tiempo * 0.0343 / 2;
}

Devolver un valor grande cuando no hay eco hace que el resto del programa lo trate como "camino libre".

3. Lecturas fiables: la mediana​

Una lectura suelta puede salir mal por un eco perdido. Tomar 5 medidas y quedarse con la del medio descarta los valores raros:

float distanciaFiable() {
float m[5];
for (int i = 0; i < 5; i++) {
m[i] = medirDistancia();
delay(10);
}
// ordenamos (5 valores: basta con un método sencillo)
for (int i = 0; i < 4; i++)
for (int j = i + 1; j < 5; j++)
if (m[j] < m[i]) { float t = m[i]; m[i] = m[j]; m[j] = t; }
return m[2]; // la mediana
}

4. Alarma de proximidad​

El LED de la placa parpadea más rápido cuanto más cerca está el objeto, como un sensor de aparcamiento:

void loop() {
float d = medirDistancia();

if (d < 50) {
int pausa = map(d, 0, 50, 30, 400); // cerca = pausa corta
digitalWrite(13, HIGH);
delay(30);
digitalWrite(13, LOW);
delay(pausa);
} else {
digitalWrite(13, LOW);
delay(60);
}
}

Recuerda añadir pinMode(13, OUTPUT); en setup(). Con un zumbador en lugar del LED, suena como el de un coche.

tip

La librería NewPing (Administrar Bibliotecas) simplifica todo esto a una línea, sonar.ping_cm(), y gestiona varios sensores a la vez.

¿Y ahora qué?​

Con este sensor, dos motores DC y un driver ya tienes lo necesario para un robot que esquiva obstáculos.