jueves, 18 de agosto de 2011

Comunicación USB

Para controlar el robot mediante gestos, la primera meta fue controlarlo con el teclado de una computadora comunicandolo mediante el protocolo USB.

Este protocolo presenta una alta velocidad de transmisión de datos pero tiene como principal desventaja de que es una conexión  alámbrica entonces esta comunicacion nos limita el rango de movimiento del robot. Pero como primera meta esta bien, posteriormente será mediante Bluetooth haciendo entonces un robot remoto.

Básicamente para establecer conexión vía USB se necesitan dos programas, uno que manda datos (en nuestro caso será ejecutado por la PC) y otro que recibe esos datos (ejecutado por el Robot).

Acá los códigos de ambos programas.

import lejos.nxt.*;
import java.io.*;
import lejos.nxt.comm.*;

public class UsbBrick {
    public static void main(String[] args) throws Exception
    {
    
    LCD.drawString("Esperando", 4,2);
    
    USBConnection conn = USB.waitForConnection();
    LCD.clear();
    LCD.drawString("Conexion ",3,3);
       
    DataOutputStream odos = conn.openDataOutputStream();
    DataInputStream odin = conn.openDataInputStream();
        char d;
    while(true){
    d = odin.readChar();
    //odos.writeChar(d);
    //odos.flush();
    
        LCD.drawChar(d,2,0);
    LCD.drawString("Recibi dato",5,1);
    if(d == 'w') Motor.B.forward(); Motor.C.forward(); //Motor.B.rotate(30); Motor.C.rotate(30);}
    if(d == 's'){Motor.B.backward();Motor.C.backward();}
    if(d == 'a'){Motor.C.forward();}
    if(d == 'd'){Motor.B.forward();}
      
    if (d == 'z'){Motor.B.stop();Motor.C.stop();}
    //Button.waitForPress();
    //Thread.sleep(10);
    LCD.clear();
    
    }
    }
}
y acá el programa que ejecuta la pc:

import lejos.pc.comm.*;
import java.io.*;
public class UsbPc { 
    public static void main(String[] args) throws Exception {
    NXTConnector conn = new NXTConnector();
    conn.connectTo("usb://"); //Para hacer la conexión vía usb
    DataInputStream dis = conn.getDataIn();
    DataOutputStream dos = conn.getDataOut();
  
     
     System.out.println("Control del LEGO via USB");
    System.out.println("Los movimientos son: ");
    System.out.println("w + enter = Adelante");
    System.out.println("s + enter = Atras");
    System.out.println("a + enter = Giro izquierda");
    System.out.println("d + enter = Giro derecha");
    System.out.println("x + enter = salir");
    while(true){
    char d = (char)System.in.read();
    //char z;
    dos.writeChar(d);
    dos.flush();
    //z = dis.readChar();
    //System.out.println("Mandado "  +d    +"Recibido " +z);
    System.out.println("Mandando " +d );
    
    if (d=='x'){
    dis.close();
    dos.close();
    break;
    }
    }
    }
}




  


El programa de la PC manda el dato respectivo a la tecla pulsada + enter, el programa del robot compara que dato le llegó y actua en consecuencia. Cabe destacar que el programa de pc no es del todo eficiente pues necesita la tecla enter para poder enviar el dato, haciendo la interacción un poco más complicada. Lo ideal es que se enviara el dato inmediatamente cuando se pulse alguna tecla.


No hay comentarios:

Publicar un comentario