Sonar básico en RobotC

sonar_an_sqS31El sonar (del inglés SONAR, acrónimo de Sound Navigation And Ranging, ‘navegación y alcance por sonido’) es una técnica que usa la propagación del sonido bajo el agua (principalmente) para navegar, comunicarse o detectar otros buques. Veremos en este tutorial el sonar básico en RobotC.
El sonar puede usarse como medio de localización acústica, funcionando de forma similar al radar, con la diferencia de que en lugar de emitir señales de radiofrecuencia se emplean impulsos sonoros. De hecho, la localización acústica se usó en aire antes que el radar, siendo aún de aplicación el SODAR (la exploración vertical aérea con sonar) para la investigación atmosférica.

El término «sonar» se usa también para aludir al equipo empleado para generar y recibir el sonido. Las frecuencias usadas en los sistemas de sonar van desde las infrasónicas a las ultrasónicas.

Aunque algunos animales (como delfines y murciélagos) han usado probablemente el sonido para la detección de objetos durante millones de años, el uso por parte de humanos fue registrado por vez primera por Leonardo Da Vinci en 1490. Se decía que se usaba un tubo metido en el agua para detectar barcos, poniendo un oído en su extremo. En el siglo XIX se usaron campanas subacuáticas como complemento a los faros para avisar del peligro a los marineros.

Manejo de sensores:

El manejo básico del sensor de ultrasonidos lo vimos en el artículo Manejo del sensor de ultrasonido en RobotC. En este artículo no añadiremos más funcionalidad al ultrasonido , aunque si veremos una nueva función para mostrar datos por pantalla. En este caso usaremos una función para dibujar píxeles, ya que necesitaremos dibujar obstáculos. La función es:

nxtSetPixel(int x, int y): Dibuja el píxel de la posición indicada. Recordad que la pantalla tiene 100 píxeles de ancho (del 0 al 99) por 64 de alto (del 0 al 63).

Un poco de trigonometría:

Para dibujar el sonar en forma de círculo y los objetos que detectemos necesitamos utilizar senos y cosenos. Suponiendo que queramos crear un circulo de radio 32 (la mitad de 64 que es el ancho de la pantalla), centrado en medio de la pantalla (coordenadas x = 50 e y = 32 aprox) necesitaremos dibujar 360 píxeles. La posición de cada píxel será igual a:

x = 50 + 32*cos(número de píxel)
y = 32 + 32*sen(número de píxel)

9846 NXT Ultra Sonic Sensor

En RobotC existen funciones para calcular senos y cosenos:

sinDegrees(angulo_en_grados): Devuelve el seno del ángulo cuyos grados son los indicados.
cosDegrees(angulo_en_grados): Devuelve el coseno del ángulo cuyos grados son los indicados.

Programa de prueba:

Lo que hará este programa es realizar un giro completo de 360º mientras va tomando mediciones de distancia con el sensor de ultrasonidos, y a la vez dibujando un círculo y dentro de el todos los objetos que se encuentren a menos de 100 cm en este caso. Una vez finalizado el recorrido el sensor de ultrasonidos volverá a su posición. Aquí tenéis el código:

#pragma config(Sensor, S4, sonarSensor, sensorSONAR)

task main()
{
int grado, valor, min = 255;
nMotorEncoder[motorB] = 0;

for(int i = 1; i <= 360; i++){
while(nMotorEncoder[motorB] < i)
{
motor[motorB] = 30;
}
nxtSetPixel(31*cosDegrees(i) + 50, 31*sinDegrees(i) + 32);
motor[motorB] = 0;
valor = SensorValue[sonarSensor];
if (valor < 100){
int aux = valor*32/100;
nxtSetPixel(aux*cosDegrees(i) + 50, 31*sinDegrees(i) + 32);
}
wait1Msec(50);
}

while(nMotorEncoder[motorB] > 0)
{
motor[motorB] = -30;
}
motor[motorB] = 0;
wait1Msec(5000);
}

En breve colgaremos un vídeo de muestra.

Espero que os guste el programa. Si tenéis dudas, preguntad en el foro.

Comments are closed.