Javier Santos Paniego
César Pérez Fernández

miércoles, 10 de febrero de 2010

Trasteando antes de las prácticas...

Como era de esperar en nosotros (gente de paciencia y templanza suprema) ...no pudimos esperar a las primeras prácticas, de manera que comenzamos a investigar los métodos de las clases que nos ofrece leJOS.
¿Probarlo?Sí, pero ¿Cómo?

Cuestiones Previas
Compilar una aplicación para un NXT

Como ya dijimos en la entrada anterior, nos servimos de Eclipse para desarrollar nuestras pequeñas aplicaciones.

En mi caso(particular, no hablo por mi compañero) uso Eclipse para poder explorar con mayor facilidad las clases y así crear el archivo .java , pero para el proceso de compilación,"linkado" y subida al robot, hago uso de terminal.

Pongamos que tenemos un fichero de programa "HolaMundo.java".
Seguimos los siguientes pasos para compilarlo, "linkarlo" y descargarlo en la consola del robot.

1. Compilación

nxjc HelloWorld.java

2. "Linkado"


nxjlink HelloWorld -o HelloWorld.nxj

3. Descarga en la consola del robot


nxjupload HelloWorld.nxj



Después de seguir estos pasos, el robot emitirá un sonido confirmando éxito en la descarga en su consola.

Paso 1: MONTAJE
(Para los redichos: "Ensamblado" )

En primer lugar nos faltaba el Hardware que soportase las perrerías que haríamos llamando a métodos aún sin testar por nuestra psique. De manera que el primer paso fue montar HansF10 de forma básica.
Para ello seguimos el manual de montaje suministrado en la caja. Tras varios pasos y varias injurias a empresas como Ikea conseguimos el siguiente resultado:





Paso 2: Probando la rotación y movimiento de la criatura

Fue entonces cuando nos dimos cuenta de que estábamos frente a la máquina perfecta.
Para probar su potencial hicimos un pequeño programa, absurdo sí, en apariencia, pero que nos sirvió para comprobar como funcionaban los servo-motores y ensayar un poco sobre el LCD.

El código es el siguiente:

import lejos.nxt.*;
public class HolaMundo {
public static void main(String[] args)throws Exception {
LCD.drawString("Hola Mundo!",3,1);
LCD.drawString("HANSF10",3,3);
Thread.sleep(3500);

Motor.B.setSpeed(500);
Motor.C.setSpeed(500);
Motor.B.forward();
Thread.sleep(6000);
Motor.C.stop();
Motor.C.forward();
Thread.sleep(6000);
Motor.B.stop();



LCD.clear();
LCD.drawString("YA ESTÁ",3,3);
Thread.sleep(2000);
}
}


El funcionamiento en resumen era que el robot girase sobre si mismo 6 segundos en sentido antihorario, avanzase seguidamente hacia delante durante otros 6 segundos, y por último girase otros 6 segundos más en sentido horario, para acabar mostrando por pantalla "YA ESTA".

Paso 3: ...y si ahora le añadimos ULTRASONIDOS...

Ocurrió que, atreviéndonos a dar un paso adelante, decidimos montar los ultrasonidos para programar un poco más sobre leJOS y desentrañar el funcionamiento sobre los UltraSonidos...
HansF10 evolucionó hasta adquirir el siguiente aspecto:





Esta vez hicimos una pequeña aplicación de prueba que consistía en poner a rodar el robot hacia delante, regulando su velocidad en función a la proximidad con el objeto más cercano detectado por el ultrasonido.

El código es el siguiente:

import lejos.nxt.*;
public class PruebaUltraSonidos {
public static void main(String[] args)throws Exception {

final int MAX_VELOCIDAD=600;
final int MAX_ALCANCE_ULTRASOUND=225;
final int DISTANCIA_PARADA=25;


Boolean salir = false;
UltrasonicSensor US = new UltrasonicSensor(SensorPort.S1);

LCD.drawString("UltraSonidos Test",1,1);
LCD.drawString("para HANSF10",1,2);
Thread.sleep(3500);

Motor.B.setSpeed(MAX_VELOCIDAD);
Motor.C.setSpeed(MAX_VELOCIDAD);
Motor.B.forward();
Motor.C.forward();
US.continuous();
Thread.sleep(2000);
while(salir!=true){
int distanciaAlObjetoMasProximo=US.getDistance();
LCD.clear();
LCD.drawInt(distanciaAlObjetoMasProximo,3,1);
if (distanciaAlObjetoMasProximo<DISTANCIA_PARADA){
salir=true;
}
Motor.B.setSpeed( (distanciaAlObjetoMasProximo*MAX_VELOCIDAD)/MAX_ALCANCE_ULTRASOUND);
Motor.C.setSpeed( (distanciaAlObjetoMasProximo*MAX_VELOCIDAD)/MAX_ALCANCE_ULTRASOUND);
}
Motor.B.stop();
Motor.C.stop();
US.off();
LCD.clear();
LCD.drawString("YA ESTÁ",3,3);
Thread.sleep(2000);
}
}


El resultado en cuestión es el siguiente (obviemos el suelo de parquet y la zapatilla tirada):



PROBLEMAS OBSERVADOS:

Fue difícil determinar la distancia a la que debía pararse el robot antes de chocar contra un obstáculo. Mediante la ancestral técnica del "prueba y error" determinamos que 25 centímetros era distancia prudencial. La tuvimos en cuenta a partir de un error aproximado de 5 cm + 12 cm que puede tener de largo el robot. El resto de la distancia que falta hasta llegar a 25 es lo que falta para que Hans chocase contra un objeto o pared.

No hay comentarios: