Puesto que LeJOS esta basado en Java, un lenguaje orientado a objetos, cada parte del robot (LCD, botones, motores, sensores de conctacto….) serán objetos con sus propios métodos y atributos. En este artículo vamos a ver el manejo del LCD y botones en LeJOS, y finalmente haremos un programa de prueba explicado para que no tengáis dudas sobre su comportamiento.
Manejo básico de los botones:
Los botones del NXT son una clase de objetos en LeJOS (class Button), por lo que como dije en mi primer artículo tendrán sus métodos y atributos. En este caso uno de los atributos de un botón es que botón es (ENTER, ESCAPE, RIGHT, o LEFT). Cada botón tiene un número identificador también, que nos sirve para saber en ciertos métodos que botón se a pulsado o dejado de pulsar:
int id waitForPress(): Detiene el programa hasta que apretemos el botón indicado. Devuelve un número con el identificador del botón que ha sido presionado.
void waitForPressAndRelease(): Detiene el programa hasta que apretemos y soltemos el botón indicado.
Boolean apretado isPressed(): Devuelve true en caso de que el botón este apretado y false en caso contrario.
Aunque la mayoría de métodos necesitan que le especifiques el botón:
Button.ESCAPE.waitForPressAndRelease();
El método waitForPress() no exige ningún botón en particular y además no es recomendable ponérselo:
Button.waitForPress();
Manejo básico del LCD:
El LCD al igual que los motores es una clase de objeto, por lo que tendrá sus propios métodos. La pantalla tiene un alto y ancho de píxeles, por lo que para escribir en cierto píxel se necesitan unas coordenadas (x, y). Por ejemplo lo que escribamos en (0,0) aparecerá a partir de la parte superior izquierda de la pantalla. Aquí pongo un ejemplo de los métodos para manejar el LCD:
void clear(): Limpia el LCD.
void drawString(frase str, int x, int y) : Muestra una frase (o cadena de texto) en la pantalla a partir de la posición (x,y) (ancho, alto).
void drawInt(int numero, int x, int y) : Muestra un numero entero en la pantalla a partir de la posición (x,y).
Es importante usar el método clear() para limpiar la pantalla cada vez que queramos escribir una cosa nueva, si no queremos que se nos mezcle con lo que hubiera escrito anteriormente.
Programa de prueba:
El siguiente programa lo que hace básicamente es pedirte que pulses el botón ENTER, posteriormente te pide que presiones cualquier tecla, te muestre que tecla has pulsado, y finalmente te pedirá que pulses el botón ESCAPE para salir.
import lejos.nxt.*;
public class pruebaBotones
{
public static void main (String[] args) throws Exception
{
LCD.clear();
LCD.drawString("Pulse el boton", 1, 3);
LCD.drawString("ENTER", 5, 5);
Button.ENTER.waitForPressAndRelease();
LCD.clear();
LCD.drawString("Pulse cualquier", 1, 3);
LCD.drawString("boton", 5, 5);
int id = Button.waitForPress();
LCD.clear();
switch (id) {
case 1:
LCD.drawString("ENTER pulsado", 1, 4);
break;
case 2:
LCD.drawString("LEFT pulsado", 1, 4);
break;
case 4:
LCD.drawString("RIGHT pulsado", 1, 4);
break;
case 8:
LCD.drawString("ESCAPE pulsado", 1, 4);
break;
}
Thread.sleep(2000);
LCD.clear();
LCD.drawString("Pulse ESCAPE", 2, 3);
LCD.drawString("para salir", 3, 5);
Button.ESCAPE.waitForPressAndRelease();
LCD.clear();
LCD.drawString("Adios", 6, 4);
Thread.sleep(2000);
}
}
Puesto que es el primer programa que voy a explicar, lo haré linea por linea para que lo podáis entender todo (número de linea – explicación):
01 – Esta linea es siempre necesaria, lo que hace es importar las librerías de LeJOS (poner a nuestra disposición todas las clases de objetos con sus métodos para que las podamos usar en el programa.
02 – Se crear automáticamente al crear la clase. Para saber como crear una clase y un proyecto revisar mi artículo anterior.
04 – Esta línea siempre se añade a nuestra clase principal, ya que es lo que este dentro de aquí lo que se va a ejecutar cuando iniciemos el programa. Se puede añadir automáticamente (ver mi artículo anterior). Además necesitamos throws Exception para poder usar el método Thread.sleep(2000); de la última linea.
06 – Limpiamos la pantalla
07 – Escribimos Pulse el boton en la posición 1, 3 del LCD, este emplazamiento es recomendable para cuando escribimos dos lineás, ya que …
08 – Escribimos una segunda línea (sin borrar la anterior) con ENTER.
09 – Con esto esperamos a que el usuario tenga que apretar el botón ENTER.
10 – Limpiamos la pantalla para poder escribir.
11 – Escribimos Pulse cualquier en la posición 1, 3 del LCD, este emplazamiento es recomendable como antes, ya que vamos a escribir otra linea debajo sin borrar.
12 – Escribimos boton en el LCD.
13 – Aquí se espera a que el usuario pulse el botón, y entonces guardamos su número identificador en id. (int id significa que estamos creando una nueva variable de tipo entero (como un almacen en el que solo caben números) ).
14 – Volvemos a limpiar el LCD.
15 – Switch es una estructura de programación que lo que hace es mirar que valor hay en la variable (id en este caso), y ejecutar la parte de programa que corresponda con el valor de esa variable. En este caso es:
16 – Si id vale 1 se ejecutará este trozo. 1 es el identificador del botón ENTER, asi que
17 – Dibujamos ENTER pulsado.
18 – Esta linea sirve para salir del switch.
19 – Si id vale 2 se ejecutará este trozo. 2 es el identificador del botón izquierdo.
20 – La posición 1, 4 esta bien para cuando escribimos una sola línea
22 – Si id vale 4 se ejecutará este trozo. 4 es el identificador del botón derecho.
25 – Si id vale 8 se ejecutará este trozo. 8 es el identificador del botón Escape.
29 – Una vez se ejecute una de las opciones del switch llegaremos aquí. El método Sleep de la clase Thread hace que el programa se quede quieto durante X tiempo, en este caso 2000 milisegundos, o dos segundos. Esto lo hacemos para que antes de borrar lo que haya en el LCD con la siguiente linea se muestre durante al menos dos segundos lo que haya en patalla, que será ENTER pulsado o cualquiera de las otras opciones del switch.
30 – Limpiamos el LCD
31 – Dibujamos…
32 – estas dos lineas.
33 – Esperamos a que el usuario pulse y suelte el botón ESCAPE.
34 – Limpiamos el LCD
35 – Escribimos un mensaje de despedida que…
36 – Quedará escrito en la pantalla durante dos segundos antes de que el programa finalize.
Los corchetes estos “{” y “}” significan que todo lo que haya en medio pertenece a quién los ha abierto. Por ejemplo el switch (id) { abre corchetes, y los cierra después de todos los case, ya que pertenecen a el. Así pues la clase pruebaBotones public class pruebaBotones { abre corchetes al principio del todo, y los cierra al final del todo, significando que todo lo que hay dentro pertenece a esa clase. Hemos dicho que las clases de objetos se pueden componer de métodos y atributos; la clase pruebaBotones no es una escepción, y en este caso se compone de un único método llamado main. Como he explicado antes el método main es el que se ejecutará automáticamente cuando iniciemos el programa, y tiene que ir dentro de nuestra clase principal.