lunes, 19 de abril de 2010

Demostracion Realizada En el evento de Ciencia y Tecnologia

Buenas nuevamente hablandoles del proyecto que hemos estado realizando, hemos terminado la primera version y realizamos una primera demostracion en el evento de ciencia y tecnologia.

domingo, 18 de abril de 2010

Aspectos Tecnicos (Comunicacion de Clasificador y Computadora XO-Parte 2)

Despues de haber discutido la implementacion del programa del rotot Clasificador veamos como se realizo la aplicacion para la computadora XO.

Todo comienza con la clase Main, la cual crea un ojbeto NXTComm al crear la comunicacion mandandole como parametro que sera atraves de la USB.

Se crea un arreglo de objetos Info buscando en la comunicaion y pasandole como parametro que sera de tipo USB.

Se crea dos objetos un DataOutputStream y un DataImputStream obteniendo para ambos el bojeto comunicacion y los respectivos Input y Output Stream.

Con estos objetos se crea la ventana y se hace visible.

Este main sera como el siguiente

public static void main(String[] args) {
DataOutputStream dos;
DataInputStream dim;
try {
NXTComm nxtComm = NXTCommFactory.createNXTComm(NXTCommFactory.USB);
NXTInfo[] infos = nxtComm.search(null, NXTCommFactory.USB);
nxtComm.open(infos[0]);
dos = new DataOutputStream(nxtComm.getOutputStream());
dim = new DataInputStream(nxtComm.getInputStream());
new MainWindow(dos, dim).setVisible(true);
}catch (NXTCommException ex) {
Logger.getLogger(Main.class.getName()).log(Level.SEVERE, null, ex);
}

}
La interfaz tendra dos botones btnProcessFood y btnProcessWaste ambos botones tienen el evento action performed que solo seleccionara btnProcessFoodAction cuando se selecciona btnProcessFood y btnProcessWasteAction cuadno se seleccion btnProcessFood.

Esta parte de codigo sera como la siguiente:

public void actionPerformed(ActionEvent e) {
if(e.getSource()==btnProcessFood)
btnProccessFoodAction();
else if(e.getSource()==btnProcessWaste)
btnProcessWasteAction();
}

private void btnProccessFoodAction() {
dSystem.startBlinking();
}

private void btnProcessWasteAction() {
dSystem.createNDiscardTrash();
}

El metodo btnProcessFoddAction llama a al sistema digestivo indicandole que debe empezar el proceso en que la pelota es un nutriente de comida.

El metodo btnProcessFoodAction llama al sistema digestivo indicandole que debe empezar el proceso en que la pelota es un desecho.

Oor ultimo DygestSystem, tambien se encarga del la simulacion en pantalla en la interfaz grafica. Utilizando el metodo paint.

Los codigos se pueden descargar de esta pagina.

Aspectos Tecnicos (Comunicacion de Clasificador y Computadora XO-Parte 1)

En este post tratare de hablarles un poco sobre el programa implementado del Robot Lego Mindstorm (Clasificador).

Para empezar se crearon 2 Clases DLTest y Grabber. DLTest tendra el main que en resumen creara una instancia de una Clase Grabber. Esperara la señal del Robot Obrero utilizando el metodo g.readFromNXT() que escribira un entero en la clase LCD. Despues de esto esperara la interaccion del usuario leyendo del pc con el metodo g.readFromPC(); Y con este valor decidira si debe realizar un proceso para desecharlo o para procesarlo como comida.

Esto se muestra a continuacion

public static void main(String[] args) {

Grabber g = new Grabber(Motor.C, Motor.A, Motor.B, null, new TouchSensor(SensorPort.S2));
while (true) {
LCD.drawInt(g.readFromNXT(), 0, 4);
g.writePCMessage(1);
int n = g.readFromPC();
switch (n) {
case 2:
g.processWaste();
break;
case 3:
g.processFood();
break;
}

}
}

La clase Grabber Tiene un constructor que recibira los tres motores el sensor de luz y el sensor de movimiento. Este metodo es implmentado de la forma siguiente

public Grabber(Motor xAxis, Motor yAxis, Motor grabber, LightSensor colorSensore, TouchSensor touchsensor){
this.xAxis = xAxis;
this.yAxis = yAxis;
this.grabber = grabber;
xAxis.setSpeed(900);
yAxis.setSpeed(900);
grabber.setSpeed(900);

this.colorSensor = colorSensore;
this.touchSensor = touchsensor;
location = 0;
getMode();
startPCConnection();
startNXTConnection();
}

En este constructor podemos ver que existen los metodos startPcConnection(); y startNXTConnection();

public void startPCConnection(){
///Inicializando conexion PC
LCD.drawString("Conectandose PC", 0, 0);
USBConnection conn = USB.waitForConnection();
dPCIn = conn.openDataInputStream();
dPCOut = conn.openDataOutputStream();
LCD.clear();
}
public void startNXTConnection(){
if(test)
return;
LCD.drawString("Conectandose NXT", 0, 0);
BTConnection btc = Bluetooth.waitForConnection();
LCD.clear();
LCD.drawString("Conectado", 0, 0);
LCD.refresh();
dNXTIn = btc.openDataInputStream();
dNXTOut = btc.openDataOutputStream();
LCD.clear();
}

Como la comunicacion con la PC es atravez de USB para realizar la conexion se utiliza la instruccion

USBConnection conn = USB.waitForConnection();

Y la comunicacion con la NXT es atravez de Blotoot para realizar la conexion inicial se utiliza la instruccion

BTConnection btc = Bluetooth.waitForConnection();

Por ultimo los metodos processWaste y processFood son muy parecidos pues ambos se mueven abajo, graban se mueven a arriba.

Pero se diferencian en que el metodo processFood se mueve a la izquierda, elimina y se mueve a la derecha. Como lo siguiente:

public void processFood() {
moveDown();
grab();
moveUp();
moveLeft(false);
drop();
moveRight(true);
}

En cambio el metodo proccesWaste se mueve a la derecha, elimina y se mueve a la izquierda. Este codigo se muestra a continuacion:

public void processWaste() {
moveDown();
grab();
moveUp();
moveRight(false);
drop();
moveLeft(true);
}