El sensor de ultrasonido puede ser muy útil, aunque su poca precisión debe de tenerse en cuenta para evitar ciertos problemas. Así mismo, un uso mejorado de los motores puede incrementar nuestra precisión a la hora de realizar movimientos complicados. En este artículo ahondaré en temas ya vistos, como los motores, e introduciré el sensor de ultrasonidos en RobotC. Finalmente haré un programa de prueba para que se vea todo esto.
Sensor de ultrasonido:
Basado en un sistema parecido al que usan los murciélagos, el sensor de ultrasonidos lanza ondas de sonido a la espera de que reboten en objetos y vuelvan, y finalmente halla la distancia al objeto calculando el tiempo que ha tardado en regresar dicha onda. La precisión del sensor de ultrasonidos del NXT es bastante reducida, pero a pesar de ello se le puede sacar partido. En el caso de RoboC la cantidad de funciones es bastante reducida, y en este caso solo usaremos una, la que nos sirve para tomar la distancia al supuesto obstáculo:
SensorValue(sonarSensor): Toma la medida de distancia al objeto en centímetros. El máximo valor es de 255, que muchas veces puede ser una medición mal tomada.
Al igual que los demás sensores, el sensor de ultrasonido se debe definir, indicando el puerto en el que va a estar conectado. Se definiría de la siguiente manera:
#pragma config(Sensor, S4, sonarSensor, sensorSONAR);
Una vez definido ya estará listo para su uso.
Manejo avanzado de motores:
Los motores del NXT tienen un encoder interno que es capaz de decirles cuanto grados ha girado un motor desde su ultimo reseteo. Esto nos puede ser útil para girar una cantidad de grados determinada, o para volver a la posición inicial del motor. En RobotC hay diversas formas de manejar estos encoders, la más simple y útil es modificando la variable del encoder:
nMotorEncoder[motor_deseado]: Esta variable contiene la cantidad de grados que ha rotado el motor (motorA, motorB, o motorC) desde la ultima vez que se puso a cero.
Para resetear el encoder no tenemos más que poner su valor a 0, por ejemplo:
nMotorEncoder[motorC] = 0;
En el programa de prueba veréis la utilidad de esta variable.
Programa de prueba: Radar sencillo
En este programa el robot será un robot estático, solo usaremos un motor. Lo que hará es girar el sensor de ultrasonidos 180º mientras este va tomando medidas, por lo que tomaremos 180 medidas. Calcularemos en que grado hemos detectado el objeto más cercano, y lo mostraremos por pantalla, al igual que a que distancia esta situado del robot. Este programa sirve como preparación para posteriores programas de mayor complejidad que publicaré en un futuro. El código sería el siguiente:
#pragma config(Sensor, S4, sonarSensor, sensorSONAR)
task main()
{
int grado, valor, min = 255;
nMotorEncoder[motorB] = 0;
for(int i = 1; i <= 180; i++){
while(nMotorEncoder[motorB] < i)
{
motor[motorB] = 30;
}
motor[motorB] = 0;
valor = SensorValue[sonarSensor];
if (valor < min){
min = valor;
grado = i;
}
wait1Msec(50);
}
while(nMotorEncoder[motorB] > 0)
{
motor[motorB] = -30;
}
motor[motorB] = 0;
nxtDisplayCenteredTextLine(3, “Grado: %d”, grado);
nxtDisplayCenteredTextLine(5, “Distancia: %d cm”, min);
wait1Msec(5000);
}
Ahora explicaré algunas líneas del código para aclararlas:
05 – La variable min es inicializada a 255, ya que 255 es el máximo valor que puede devolver el sensor de ultrasonidos, y no hay ningún otro por encima.
06 – Reseteamos el valor del encoder del motor que vamos a utilizar, en este caso es el motor B.
08 – Creamos un búcle de 180 repeticiones.
09 – Mientras el motor no haya girado hasta el grado i (1, 2, 3,…, 180):
11 – Pon el motor en marcha al 30% de potencia.
13 – Una vez alcanzado el grado deseado el motor se detendrá.
14 – Tomamos la medida del sensor de ultrasonido
15 – Si esta medida es menor que la mínima que ya teníamos:
16 – Lo guardamos como la nueva mínima y,
17 – Guardamos en que grado estamos.
19 – Dejamos unos milisegundos para que el giro no sea brusco y podamos tomar bien los valores del ultrasonido.
22 – Ahora que hemos terminado devolveremos el motor B a su posición inicial. por tanto mientras el motor no este en su posición inicial:
24 – Lo ponemos marcha atrás al 30% de potencia.
26 – Una vez que ha alcanzado el punto inicial paramos el motor.
29 – Finalmente mostramos por pantalla en que grado hemos detectado el valor mínimo,
30 – Y cual ha sido.
31 – Dejamos unos segundos antes de que se acabe el programa para poder ver los resultados por pantalla.
También podríamos buscar el hueco más grande por ejemplo, incluso mover el robot hacía el hueco más grande, pero eso ya lo pondré en otro artículo. Aquí os dejo un video de ejemplo para que veáis su funcionamiento: