En esta segunda parte del artículo voy a explicar cómo se realiza el control de varios NXT por Bluetooth (más de dos), su utilidad, y sus limitaciones. Veremos principalmente el problema de la latencia (el tiempo que tarda en establecer conexión con otro NXT).
Manejo de Varias Conexiones:
En el artículo anterior vimos que es posible conectar varios NXT mediante el Bluetooth, sin embargo existe una limitación implícita: un ladrillo NXT sólo puede tener una conexión de maestro y tres de esclavo. El maestro es el encargado de enviar información a los esclavos, y los esclavos se encargarán de actuar según las ordenes que hayan recibido. Todo esto lo podéis ver con claridad en nuestro artículo sobre robots repetidores en NXT-G. El problema principal es que para comenzar una nueva conexión debe cerrarse la anterior, y el NXT tarda varios segundos (entre 1s y 2s) en realizar las conexiones, lo que impide ciertas aplicaciones como de control simultáneo de varios NXT desde un NXT maestro. Las conexiones Bluetooth entre ordenadores son muchísimo más rápidas.
Programa de pruebas:
Gracias a este programa podemos ver la latencia (tiempo que tardan las conexiones que el Bluetooth en realizarse entre los NXT). Tenemos tres programas (uno para cada ladrillo NXT): el primer programa esperará a que pulsemos el botón ENTER, y una vez pulsado se conectará al segundo NXT, enviándole la información de que hemos pulsado el botón. El segundo esperará a recibir esta información, actuará moviendo el motor y haciendo un sonido, y enviará la información al tercero. Finalmente el tercero recibirá esta información y actuará en consecuencia. El código del primer NXT es:
import lejos.nxt.Button;
import lejos.nxt.LCD;
import lejos.nxt.Motor;
import lejos.nxt.Sound;
import lejos.nxt.comm.BTConnection;
import lejos.nxt.comm.Bluetooth;
import java.io.*;
import javax.bluetooth.*;
public class LatenciasMain {
public static void main(String[] args) throws Exception {
String nombre = “NXTTorna”;
LCD.drawString(“Conectando…”, 2, 1);
LCD.refresh();
LCD.drawString(“Pulsa un boton”, 2, 1);
int i = Button.waitForPress();
Sound.beep();
Motor.A.forward();
LCD.clear();
LCD.drawString(“Conectando”, 2, 1);
LCD.refresh();
RemoteDevice bt2 = Bluetooth.getKnownDevice(nombre);
if (bt2 == null){
LCD.clear();
LCD.drawString(“No existe ese dispositivo”, 0, 1);
LCD.refresh();
Thread.sleep(2000);
System.exit(1);
}
BTConnection btc = Bluetooth.connect(bt2);
if (btc == null){
LCD.clear();
LCD.drawString(“Conexión fallida”, 1, 1);
LCD.refresh();
Thread.sleep(2000);
System.exit(1);
}
LCD.clear();
LCD.drawString(“Conectado”, 2, 1);
LCD.refresh();
DataOutputStream dos = btc.openDataOutputStream();
dos.writeInt(i);
dos.flush();
LCD.clear();
LCD.drawString(“Cerrando conexion”, 0, 1);
LCD.refresh();
dos.close();
btc.close();
LCD.clear();
LCD.drawString(“Finalizado”, 0, 1);
LCD.refresh();
Thread.sleep(20000);
}
}
14 – El nombre del NXT al que se va a conectar tiene que ser el correcto. En nuestro hemos empleado estos nombres puesto que son como se llaman los NXT que estoy utilizando en el experimento.
El del segundo es:
import lejos.nxt.LCD;
import lejos.nxt.Motor;
import lejos.nxt.Sound;
import lejos.nxt.comm.BTConnection;
import lejos.nxt.comm.Bluetooth;
import java.io.*;
import javax.bluetooth.RemoteDevice;
public class LatenciaSlave2 {
public static void main(String[] args) throws Exception {
String nombre = “NXT3”;
LCD.drawString(“Esperando…”, 2, 1);
LCD.refresh();
BTConnection btc = Bluetooth.waitForConnection();
LCD.clear();
LCD.drawString(“Conectado”, 2, 1);
LCD.refresh();
DataInputStream dis = btc.openDataInputStream();
int i = dis.readInt();
dis.close();
btc.close();
LCD.clear();
if (i == 1){
Sound.beep();
Motor.A.forward();
RemoteDevice bt2 = Bluetooth.getKnownDevice(nombre);
if (bt2 == null){
LCD.clear();
LCD.drawString(“No existe ese dispositivo”, 0, 1);
LCD.refresh();
Thread.sleep(2000);
System.exit(1);
}
BTConnection btc2 = Bluetooth.connect(bt2);
if (btc2 == null){
LCD.clear();
LCD.drawString(“Conexion fallida”, 0, 1);
LCD.refresh();
Thread.sleep(2000);
System.exit(1);
}
LCD.clear();
LCD.drawString(“Conectado”, 2, 1);
LCD.refresh();
DataOutputStream dos = btc2.openDataOutputStream();
dos.writeInt(i);
dos.flush();
dos.close();
btc2.close();
}
LCD.clear();
LCD.drawString(“Cerrando conexion”, 0, 1);
LCD.refresh();
Thread.sleep(20000);
}
}
El del tercero sería:
import lejos.nxt.LCD;
import lejos.nxt.Motor;
import lejos.nxt.Sound;
import lejos.nxt.comm.BTConnection;
import lejos.nxt.comm.Bluetooth;
import java.io.*;
public class LatenciasSlave3 {
public static void main(String[] args) throws Exception {
LCD.drawString(“Esperando…”, 2, 1);
LCD.refresh();
BTConnection btc = Bluetooth.waitForConnection();
LCD.clear();
LCD.drawString(“Conectado”, 2, 1);
LCD.refresh();
DataInputStream dis = btc.openDataInputStream();
int i = dis.readInt();
dis.close();
btc.close();
LCD.clear();
if (i == 1){
Sound.beep();
Motor.A.forward();
}
LCD.clear();
LCD.drawString(“Cerrando conexion”, 0, 1);
LCD.refresh();
Thread.sleep(20000);
}
}
Y por último y como siempre, un video de demostración:
No os olvidéis de publicar cualquier duda que tengáis al respecto en el foro.
hola muy buen tutorial me gustaria sabe por ejemplo estoy enviando mensaje por Bt a traves de un sensor ultrasonido y me gustaria saber como puede realizar otra accion dependiendo de que no haya pasado ningun objeto por el ultrasonido .
Gracias
Gracias de nuevo!
Contestamos en el foro!