Você está na página 1de 12

leJOS: NXJ o casi Java para LEGO NXT

LPEZ COSTA, Jorge Breogn

leJOS: NXJ o casi Java para LEGO NXT

Lpez Costa, J. Breogn

ndice
1. 2. 3. 4. Introduccin a leJOS y NXJ ..................................................................................... 3 Qu ofrece leJOS? .................................................................................................. 4 Hola Mundo NXJ de dos formas diferentes ............................................................. 5 Control de motores y sensores requerido para la prctica ........................................ 7 4.1. Prueba tpica de motores en NXJ ..................................................................... 7 4.2. Prueba tpica de sensores lumnicos NXJ......................................................... 8 4.3. Control de tiempo en NXJ ................................................................................ 9 5. Port del programa NXC de la prctica propuesta a NXJ ........................................ 10 6. Bibliografa y referencias usadas............................................................................ 12

leJOS: NXJ o casi Java para LEGO NXT

Lpez Costa, J. Breogn

1. Introduccin a leJOS y NXJ


leJOS (segn la Web oficial pronunciado como se leera en espaol la palabra "lejos") es una pequea mquina virtual Java. In 2006 fue portada para el bloque o brick LEGO NXT. Esta mquina virtual es un firmware para el bloque LEGO NXT, es decir, se debe instalar en el NXT un nuevo firmware (de el se habla ms abajo), sobrescribiendo el existente. El instalador del firmware y del compilador para el ordenador de desarrollo est disponible tanto para Windows 32 bit como para GNU/Linux o Apple Mac OS-X. Est disponible en http://lejos.sourceforge.net/nxj-downloads.php As leJOS soporta lo que se denomina NXJ, Not eXactly Java, muy similar a Java pero no exactamente Java. Fue bautizado as anlogamente con NXC, es decir, Not eXactly C. leJOS NXJ incluye todas las clases del API NXJ as como las herramientas usadas para salvar el cdigo en el bloque NXT. Podemos encontrar ms informacin en su Web oficial: http://lejos.sourceforge.net/ Pero se debe de tener en cuenta que las versiones disponibles por el momento son todas alfa y beta, siendo la ms reciente en el momento de edicin de este documento la 0.8.5, del 2 de Septiembre de 2009.

Sea mencionado tambin, existe un firmware y API similar para el bloque LEGO RCX, pero no es el caso que nos ocupa.

leJOS: NXJ o casi Java para LEGO NXT

Lpez Costa, J. Breogn

2. Qu ofrece leJOS?
Algunos de los aspectos principales de lo provisto por leJOS NXJ son los siguientes: o o o o o o o o o Lenguaje de alto nivel Orientado a Objetos (Java) Hilos preemptivos1 (tasks) Arrays, includos multi-dimensionales Recursin Sincronizacin Excepciones Tipos Java, incluido float, long y String La mayora de lo incluido en las clases java.lang, java.util y java.io Un API para Robtica muy completo y muy bien documentado, incluso en formato Java Docs API NXJ para NXT en formato Java Docs: http://lejos.sourceforge.net/nxt/nxj/api/index.html

Preemptivo significa que si mientras un proceso se esta ejecutando, entra a la cola de listos un proceso mas corto, el proceso en la cola de listos se apropia de la CPU y comienza su ejecucin.

leJOS: NXJ o casi Java para LEGO NXT

Lpez Costa, J. Breogn

3. Hola Mundo NXJ de dos formas diferentes


Vamos a explicar en NXJ el ejemplo ms tpico desde la invencin de C, el hola mundo, pero con una ligera modificacin...

Forma ms similar al estndar Java:

import lejos.nxt.*; public class HolaMundo { public static void main (String[] args) { System.out.println("Hola NXJ"); Button.waitForPress(); } }

El cdigo debe estar contenido dentro de una clase, en este caso HolaMundo y para el lego debemos tener un public static void main como si de cualquier aplicacin Java se tratara (recordemos que para otras tecnologas no se usa el public static void main, como por ejemplo para los Applets Java). La salida de datos tambin es idntica a la usual en cualquier aplicacin Java, es decir, usamos el mtodo estndar de Java System.out.println(), que nos escribir lo que le pasemos como parmetro en la pequea pantalla LCD del brick NXT. Luego una buena idea es esperar algn evento, como, por ejemplo, la pulsacin de un botn, para esto empleamos Button.waitForPress(); Debe tenerse en cuenta que, para que esto funcione, se deben importar las clases que cuelgan de lejos.nxt, para lo que haremos un import lejos.nxt.*;

Usando las clases LCD, propio de NXJ:

import lejos.nxt.*; public class HolaMundo { public static void main (String[] args) { public static final String mensaje = "Hola NXJ"; LCD.drawString(mensaje,0,0); LCD.refresh(); Button.waitForPress(); } }

leJOS: NXJ o casi Java para LEGO NXT

Lpez Costa, J. Breogn

La diferencia es que usamos el mtodo drawString de la clase LCD para escribir en la posicin 0,0 (lnea y columna) del bloque NXT. El LCD se organiza como se muestra en el grfico siguiente:

Siendo los rangos de las X de 0 a 15 y de las Y de 0 a 7.

leJOS: NXJ o casi Java para LEGO NXT

Lpez Costa, J. Breogn

4. Control de motores y sensores requerido para la prctica


4.1. Prueba tpica de motores en NXJ
Los motores se controlan a travs de la clase Motor que cuelga de lejos.nxt. Se deber indicar a continuacin el puerto al que est conectado el motor y la operacin a realizar, las que pueden ser, entre otras: forward() o Hace que el motor avance hacia adelante setSpeed(integer speed) o configura la velocidad del motor en en grados por segundo backward() o Hace que el motor avance hacia atrs changeDirection() o Invierte el sentido de rotacin del motor stop() o para el motor Para esta prctica usaremos solamente las dos primeras, forward() y setSpeed(vaor_entero)

Esto funciona del siguiente modo:

Motor.puerto_al_que_est_conectado.mtodo()

por ejemplo, si queremos avanzar con el motor A hacia delante, pondremos:

Motor.A.forward();

Si queremos configurar una nueva velocidad al motor C, pondremos:

Motor.C.setSpeed(valor_entero);

Vamos a mostrar un ejemplo. Este ejemplo es lo que tipicamente se suele hacer para el test de motores (independientemente para cada motor, en este ejemplo se usa el motor A): 1. Avanzar con el motor A.

leJOS: NXJ o casi Java para LEGO NXT

Lpez Costa, J. Breogn

2. Mostrar la cadena ADELANTE en la primera lnea del LCD. 3. Esperar hasta que se pulsa un botn. 4. Mover el motor hacia atrs. 5. Mostrar la cadena ATRAS en la lnea siguiente del LCD. 6. Esperar hasta que se pulsa un botn. 7. Ejecutar el motor A en la direccin de avance. 8. Mostrar la cadena ADELANTE en la lnea siguiente del LCD. 9. Esperar hasta que se pulsa un botn. 10. Detener el motor. Es posible escribir este programa utilizando cada mtodo de motor slo una vez.

import lejos.nxt.*;

public class BasicMotorTest { public static void main(String[] args) { Motor.A.forward(); LCD.drawString("ADELANTE ", 0, 0); Button.waitForPress(); Motor.A.backward(); // Podra usarse Motor.A.reverseDirection en su lugar LCD.drawString("ATRAS", 0, 1); Button.waitForPress(); Motor.A.reverseDirection(); LCD.drawString("ADELANTE ", 0, 2); Button.waitForPress(); Motor.A.stop(); } }

4.2. Prueba tpica de sensores lumnicos NXJ


Para usar un sensor lumnico, se debe instanciar la clase LightSensor pasando como parmetro el puerto al que est conectado el sensor. Por ejemplo, para indicar que usamos el puerto 1, codificaremos lo siguiente:
LightSensor light = new LightSensor(SensorPort.S1);

Si deseamos leer un valor del sensor, este nos devuelve un valor entero y lo podemos hacer a travs del mtodo readValue(). Se pueden leer en este formato y en otros formatos, adems realizar otras operaciones con los sensores, por ejemplo:

leJOS: NXJ o casi Java para LEGO NXT

Lpez Costa, J. Breogn

int readValue() o recibe el valor de lectura int readNormalizedValue o lee el valor normalizado int getNormalizedLightValue o hace lo mismo que readNormalizedValue calibrateLow() o se llamar cuando el sensor est leendo el valor bajo (usado por readValue) calibrateHigh() o se llama cuando el sensor estea leyendo el valor alto (usado por readValue) Nosotros usaremos en la prctica readNormalizedValue() El ejemplo tpico de prueba de sensores es el siguiente:

import lejos.nxt.*; public class LightTest { public static void main(String[] args) throws Exception { LightSensor light = new LightSensor(SensorPort.S1); while 0); 1); 2); 3); } } (true) { LCD.drawInt(light.readValue(), 4, 0, LCD.drawInt(light.readNormalizedValue(), 4, 0, LCD.drawInt(SensorPort.S1.readRawValue(), 4, 0, LCD.drawInt(SensorPort.S1.readValue(), 4, 0,

4.3. Control de tiempo en NXJ


Se hace con la clase Timer de lejos.util.* (el que se debe importar). Los mtodos que usaremos son: setDelay(int newDelay) o Cambia el tiempo de conteo. start() o arranca el temporizador. Usa el mtodo timedOut() del interface TimerListener, el que debemos usar en la prctica stop() o apaga el timer.

leJOS: NXJ o casi Java para LEGO NXT

Lpez Costa, J. Breogn

5. Port del programa NXC de la prctica propuesta a NXJ

import lejos.nxt.*; import lejos.util.*; public class circuito1 { static int CINTA_BLANCA_MIN = 47; valor en cinta blanca int curve_time = 50; por defecto int move_time = 100; defecto

//

mnimo

// 0,05 segundos // 0,1 segundos por

/* Velocidades para usar con Motor.setSpeed. En Motor.setSpeed configrase o motor en grados por segundo. Segn a informacin atopada nos Java Docs do API, o tope (sin conectar o LEGO a 8V) parece 900 NOTA: habera que revisar na prctica estes valores, aqu son calculados teoricamente. */ // NXC era 75%. 75% de 900 = 675 grados por segundo int jspeed_curve = 675; // 75% da capacidade mxima do motor // NXC era 25%. 25% de 900 = 225 grados por segundo int jopposite_speed_curve = 225; // 25% da capacidade mxima do motor // NXC era 50%. 50% de 900 = 450 grados por segundo int jspeed_straight = 450; // 60% da capacidade mxima do motor TimerListener tL; Timer tmr = new Timer(move_time, tL); // Timer(int theDelay, TimerListener el) public void circuito1() { }; // circuito1 public void corre(){ LightSensor light1 = new LightSensor(SensorPort.S1); // Indicamos que a ese porto est conectado un sensor ptico. Ser o do lado dereito LightSensor light4 = new LightSensor(SensorPort.S4); // Indicamos que a ese porto est conectado un sensor ptico. Ser o do lado esquerdo

10

leJOS: NXJ o casi Java para LEGO NXT

Lpez Costa, J. Breogn

while (true) { // CHEQUEAMOS SENSOR DEREITO (se detecta a cinta) if (light1.readNormalizedValue() > CINTA_BLANCA_MIN) { // xiramos esquerda Motor.A.setSpeed(jspeed_curve); // aumentamos velocidad en motor del lado que deseamos girar Motor.C.setSpeed(jopposite_speed_curve); // reducimos velocidad en motor contrario tmr.setDelay(curve_time); // continuamos a traxectoria durante curve_time tmr.start(); } // if // CHEQUEAMOS SENSOR ESQUERDO (se detecta a cinta) else if (light4.readNormalizedValue() > CINTA_BLANCA_MIN) { // xiramos dereita Motor.C.setSpeed(jspeed_curve); // aumentamos velocidad en motor del lado que deseamos girar Motor.A.setSpeed(jopposite_speed_curve); // reducimos velocidad en motor contrario tmr.setDelay(curve_time); // continuamos a traxectoria durante curve_time tmr.start(); } // else if else // seguir recto { // aceleramos e seguimos recto Motor.A.setSpeed(jspeed_straight); Motor.C.setSpeed(jspeed_straight); tmr.setDelay(move_time); // continuamos a traxectoria durante curve_time tmr.start(); } // else } // while } // corre() public static void main (String[] args) { circuito1 c1 = new circuito1(); c1.corre(); } // public static void main }

11

leJOS: NXJ o casi Java para LEGO NXT

Lpez Costa, J. Breogn

6. Bibliografa y referencias usadas


http://lejos.sourceforge.net/nxt/pc/api/index.html http://lejos.sourceforge.net/nxt/nxj/api/index.html http://lejos.sourceforge.net/nxt/nxj/tutorial/index.htm "Develop leJOS Programs Step by Step" Versin 0.6 (abril 2009), Juan Antonio Brea Moral (colaborador con el Proyecto leJOS como investigador desde 2006), eBook disponible gratuitamente (previo registro de un e-mail) en: o http://www.juanantonio.info/lejos-ebook/

12