Bluetooth en LeJOS

bluetoothEl Bluetooth es un protocolo de comunicaciones muy útil que permite conectar distintos dispositivos a distancia. Se emplea en la actualidad para el intercambio de información entre móviles, aunque también lo podemos encontrar en otros dispositivos como micrófonos inalámbricos, ordenadores, o la misma PS3, etc. Los LEGO Mindstorms NXT también cuentan con Bluetooth, el cual sirve generalmente para subir programas al NXT desde el ordenador. Sin embargo las posibilidades son mucho mayores. Veamos cómo se controla el Bluetooth en LeJOS.

Manejo del Bluetooth:

La conexión Bluetooth funciona como la mayoría de comunicaciones en informática: el dispositivo que desea enviar los datos busca al destinatario, establece conexión con el, y va enviando conjuntos de información a través de un buffer (una línea de información). El dispositivo que va a recibir los datos estará siempre a la espera de recibir una petición de conexión, y una vez aceptada y establecida la conexión irá leyendo del buffer dicha información, actuando en consecuencia a lo que reciba. Una vez finalizada la tarea ambos cerrarán la conexión, y el dispositivo de recepción quedará a la espera de una nueva conexión.

En primer lugar necesitaremos importar las librerias necesarias, principalmente serán lejos.nxt.comm.* y las librerias de java java.io.* y javax.bluetooth.*.

Para crear una conexión con un dispositivo, antes necesitamos buscar ese dispositivo, y ver si está disponible, esto lo podemos hacer mediante:

RemoteDevice id = Bluetooth.getKnownDevice(nombre del dispositivo): Buscamos el dispositivo cuyo nombre hayamos elegido, si existe nos devolverá su identificador, y en caso contrario nos devolverá null.

Teniendo ya el id del dispositivo podemos generar ya una conexión mediante el siguiente método:

BTConnection nombre_conexion = Bluetooth.connect(id): Creamos una conexión bluetooth con el dispositivo cuya id sea la indicada. Esta conexion tendrá el nombre que queramos ponerle. Si el resultado de la conexión es el valor null, nos está indicando que la conexión ha fallado.

Una vez establecida la conexión es importante crear canales a través de los cuales podamos enviar y recibir información. Se puede crear uno de cada, por ejemplo:

DataOutputStream canal_salida = btc.openDataOutputStream(): Creamos un canal de salida en el que escribiremos y enviaremos información para que el dispositivo al que estemos conectados pueda leerla.

DataInputStream canal_entrada = btc.openDataInputStream(): Creamos un canal de entrada del que leeremos la información que el dispositivo al que estemos conectados nos haya enviado.

Una vez terminados los envios de datos (para ver como enviar datos ver el programa de prueba) necesitamos cerrar tanto los canales como las conexiones, para ello usaremos el método close():

canal_salida.close();
canal.entrada.close();
nombre_conexion.close();

Ahora ilustraré todo esto con un programa de prueba.

Programa de prueba:

El programa de prueba consiste en realidad en dos programas: uno lo tendrá un NXT que usaré de mando radiocontrol, y el otro lo tendrá el vehículo con cambios de marchas que habéis visto en artículos anteriores. Con el NXT “manejador” conseguiremos hacer que el vehículo cambie de marcha, pare, o se mueva marcha adelante o marcha atrás. El dódigo del manejador es el siguiente:

import lejos.nxt.Button;
import lejos.nxt.LCD;
import lejos.nxt.comm.BTConnection;
import lejos.nxt.comm.Bluetooth;
import java.io.*;
import javax.bluetooth.*;

public class BlueTest {

public static void main(String[] args) throws Exception {
String nombre = “NXTTorna”;
LCD.drawString(“Conectando…”, 2, 1);
LCD.refresh();

RemoteDevice bt = Bluetooth.getKnownDevice(nombre);

if (bt == null){
LCD.clear();
LCD.drawString(“No existe ese dispositivo”, 0, 1);
Thread.sleep(2000);
System.exit(1);
}

BTConnection btc = Bluetooth.connect(bt);

if (btc == null){
LCD.clear();
LCD.drawString(“Conexión fallida”, 1, 1);
Thread.sleep(2000);
System.exit(1);
}

LCD.clear();
LCD.drawString(“Conectado”, 2, 1);
Thread.sleep(2000);

DataOutputStream dos = btc.openDataOutputStream();

LCD.drawString(“Pulsa un boton”, 2, 1);
while(!Button.ESCAPE.isPressed()){
int i = Button.waitForPress();
dos.writeInt(i);
dos.flush();
}

LCD.clear();
LCD.drawString(“Cerrando conexion”, 0, 1);
dos.close();
btc.close();

LCD.clear();
LCD.drawString(“Finalizado”, 0, 1);
Thread.sleep(2000);
}
}

17 y 26 – Podéis ver como hacemos las comprobaciones para ver si se ha podido encontrar el dispositivo, y si se ha podido establecer la conexión.

42 – Aquí se ve como escribir en un canal o buffer de salida. En este caso, como queremos enviar un entero usaremos el método writeInt(), escribiendo en para ello el identificador del botón que hemos pulsado.

43 – El método flush() obliga a que se envíen los datos.

Código del actuador:

import lejos.nxt.Button;
import lejos.nxt.LCD;
import lejos.nxt.Motor;
import lejos.nxt.comm.BTConnection;
import lejos.nxt.comm.Bluetooth;
import java.io.*;

public class BlueRec {

public static void main(String[] args) throws Exception {
int nummarcha = 1;
Marchas m = new Marchas();
while(!Button.ESCAPE.isPressed()){
LCD.clear();
LCD.drawString(“Esperando…”, 2, 1);
LCD.refresh();

BTConnection btc = Bluetooth.waitForConnection();

LCD.clear();
LCD.drawString(“Conectado”, 2, 1);

DataInputStream dis = btc.openDataInputStream();

while(!Button.ESCAPE.isPressed()){
int i = dis.readInt();
LCD.clear();
switch (i) {
case 1:
LCD.drawString(“Cambio de Marcha”, 1, 4);
if (nummarcha == 1){
m.marchaUp(Motor.C);
nummarcha++;
}else{
m.marchaDown(Motor.C);
nummarcha–;
}
break;
case 2:
LCD.drawString(“Marcha alante”, 1, 4);
Motor.A.backward();
break;
case 4:
LCD.drawString(“Marcha atras”, 1, 4);
Motor.A.forward();
break;
case 8:
LCD.drawString(“Stop”, 1, 4);
Motor.A.stop();
break;
}
}
Thread.sleep(2000);
LCD.clear();
LCD.drawString(“Cerrando conexion”, 0, 1);
dis.close();
btc.close();
Thread.sleep(2000);
}
}
}

26 – Como queremos leer el int con el identificador del botón pulsado que nos ha enviado el manejador, usaremos el método readInt().

Y aquí tenéis el vídeo de muestra del programa:

Para cualquier duda no dudéis en escribir en el foro.

Información adicional:

2 thoughts on “Bluetooth en LeJOS

  1. Hola muy buen blog tengo una duda estoy trabajando en lejos con blue j y queria saber si me puedes ayudar en el tema de como poder cambiar en nombre del dispositivo bluetooth del NXT lo necesito.

    Gracias 🙂

    • Gracias por el cumplido! 🙂

      Te contesto en el foro!

      Un saludo