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
Sea mencionado tambin, existe un firmware y API similar para el bloque LEGO RCX, pero no es el caso que nos ocupa.
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.
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.*;
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(); } }
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:
Motor.puerto_al_que_est_conectado.mtodo()
Motor.A.forward();
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.
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(); } }
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:
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,
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
/* 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
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
12