El 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. Hoy veremos el tratamiento del Bluetooth en RobotC.
Manejo sencillo del Bluetooth en RobotC:
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 RobotC un programa puede realizar varias tareas al mismo tiempo, por lo que podemos crear una tarea dedicada a enviar mensajes y otra a recibirlos. Estas tareas se denominan task, y si os habéis fijado en programas de artículos anteriores de RobotC, siempre creamos una tarea principal llamada main.
Para crear una conexión con un dispositivo necesitamos su nombre y el puerto en el que lo queremos conectar (recordad que el Bluetooth del NXT permite un máximo de cuatro conexiones, una de maestro y tres de esclavos). Para ello usaremos la función:
btConnect(numeroPuerto, nombre): Nos conectamos con el dispositivo cuyo nombre sea el indicado, en el puerto deseado.
Si un programa crea conexiones Bluetooth es importante que ese mismo programa las deshaga al final. Para ello se usan las funciones:
btDisconnect(numeroPuerto): Nos desconectamos del NXT que este anclado a dicho puerto.
btDisconnectAll(): Nos desconectamos de todos los NXT;
Una vez establecida la conexión ya podemos enviar información. Una forma muy útil es mediante la funcion:
sendMessageWithParm(short mensaje, ….): Nos permite enviar enviar información en forma de enteros. Se pueden enviar varios valores.
Para recibir un mensaje primero necesitamos leerlo, para saber si hay o no mensaje podemos usar la variable message, que nos devolverá un número distinto de cero en caso de que lo haya. Para leer el mensaje usaremos:
messageParm[numParametro]: Nos devuelve el parámetro que haya en la posición numParametro (empezando desde 0). En el programa de prueba podéis ver un ejemplo de esto.
Para limpiar el mensaje despues de leerlo usar la función:
ClearMessage(): Limpia el mensaje, lo que nos permite poder recibir nuevos mensajes.
Programa de prueba:
El programa de prueba consiste en un control remoto para manejar un NXT con otro NXT. En ambos tendremos dos task ejecutandose, una que recibe información y otra que la recibe, de forma que se pueden controlar mutuamente. Para que este programa funcione es importante que enlaceís los NXT mediante el menú de Bluetooth. Este programa lo deberán tener por tanto ambos NXT. A continuación os pongo el código (aunque vaya por partes cuando lo escribáis tiene que ir todo junto):
Inicio del programa y definición de variables:
#pragma platform(NXT)
int nBoton;
int nAccion;
int nMensaje = 0;
task enviarMensajes();
void leerMensajes();
void comprobarConexion();
Task main:
task main()
{
comprobarConexion();
eraseDisplay();
bNxtLCDStatusDisplay = true;
wait1Msec(500);
StartTask(enviarMensajes);
leerMensajes();
return;
}
Task enviarMensajes:
task enviarMensajes()
{
while (true){
if((nBoton = nNxtButtonPressed) > -1)
sendMessageWithParm(nBoton);
}
return;
}
Función leerMensaje:
void leerMensajes()
{
while (true){
nMensaje = message;
if (nMensaje != 0){
nAccion = messageParm[0];
switch(nAccion){
case 1 : motor[motorA] = 30;
motor[motorC] = 70;
break;
case 2 : motor[motorA] = 70;
motor[motorC] = 30;
break;
case 3 : motor[motorA] = 70;
motor[motorC] = 70;
break;
}
ClearMessage();
}
}
}
Función comprobarConexion:
void comprobarConexion()
{
if (nBTCurrentStreamIndex >= 0)
return;
PlaySound(soundLowBuzz);
PlaySound(soundLowBuzz);
eraseDisplay();
nxtDisplayCenteredTextLine(3, "No esta");
nxtDisplayCenteredTextLine(4, "Conectado");
wait1Msec(3000);
StopAllTasks();
}
Nota: Esta última función se encarga de comprobar si la conexión Bluetooth es correcta. En caso contrario el robot emitirá un pitido.
En breve incorporaremos el vídeo de muestra del programa.
Para cualquier duda no dudéis en escribir en el foro.
Información adicional:
- Página oficial de Bluetooth