Le pasa a casi todos en robotica: construyes un buen robot que evita obstaculos. Codigo listo, cableado listo. Lo dejas en un pasillo vacio. Avanza contento y de pronto frena fuerte aunque no haya nada delante.
Miras sorprendido mientras actua como si hubiera chocado con una pared invisible. No se volvio loco. Vio un fantasma. El nombre tecnico es ruido del sensor (sensor noise).
El problema: enfoque ingenuo, sin filtro
Un sensor ultrasonico a veces da una muestra mala. Polvo, corriente de aire o un eco pueden hacer que una distancia real de 200 cm parezca 5 cm un instante.
En el codigo solemos confiar a ciegas en una sola lectura:
if (distancia < 10) {
parar();
}
El robot entra en panico con ese falso 5 cm y se detiene. No hay obstaculo; solo un error de medida, ruido.
El truco: filtra con promedio
En la vida real no creemos una sola frase al instante. Si alguien dice que fuera hay 50 grados, no te quitas el abrigo de golpe; compruebas otra vez. Dale al robot la misma costumbre. Eso se llama filtrado. El metodo simple y eficaz: promediar.
Un robot inteligente no decide con una muestra. En milisegundos toma 5–10 lecturas seguidas. Ejemplo:
200, 200, 5, 202, 198
Ese unico 5 cm malo se diluye entre buenos valores. El promedio se queda cerca de la distancia real. Para por obstaculos reales, no por fantasmas.
int distanciaMedia() {
long suma = 0;
int n = 5;
for (int i = 0; i < n; i++) {
suma += leerDistancia();
delayMicroseconds(2000); // pausa minima, no un sueno largo
}
return (int)(suma / n);
}
void loop() {
int distancia = distanciaMedia();
if (distancia > 0 && distancia < 10) {
parar();
} else {
avanzar();
}
}
Nota de taller: Deja un hueco muy corto entre muestras. Esta microespera no es la misma trampa que un
delay(1000)largo que congela todo el loop. Tambien puedes montar la misma idea conmillis().
Resumen
Un buen programador de robots no cree al instante cada valor del sensor. Filtra los datos con matematicas y solo para ante obstaculos reales. No hagas un cazafantasmas; ensenale a analizar las lecturas.