Buscar en Google

lunes, 10 de noviembre de 2008

WILLY-1: Comunicando nuestro programa con el robot casero, mediante un puerto USB conectado al puerto serie del controlador de servos.

Y nos tuvimos que poner algo técnicos...

Para la comunicación serie en java estoy utilizando la librería gnu.io.* que tiene la clase RXTXPort. Esta clase nos da todas las herramientas necesarias para hacer dicha conexión. Un detalle que hay que tener en cuenta es que es necesario que le digamos a dicha librería que el puerto /dev/ttyUSB0 es un puerto serie.

Primero importamos la libreria.

import gnu.io.*;

Como variables globales de la clase definimos:

InputStream entrada = null;
OutputStream salida;
RXTXPort puertoSerie = null;
int timeout = 10;

Este fragmento de código muestra la conexión con el puerto USB que usa el programa.

private void inicializaPuerto(){

// Nuestro Puerto
String dispositivo2 = "/dev/ttyUSB0";

try{
puertoSerie = new RXTXPort( dispositivo2 );
puertoSerie.setSerialPortParams( 19200,RXTXPort.DATABITS_8, RXTXPort.STOPBITS_1,RXTXPort.PARITY_NONE );
puertoSerie.setFlowControlMode( RXTXPort.FLOWCONTROL_NONE );
puertoSerie.enableReceiveThreshold( 1 );
puertoSerie.enableReceiveTimeout( timeout );
//System.out.println( "Dispositivo Serie abierto" );
salida = puertoSerie.getOutputStream();
entrada = puertoSerie.getInputStream();
}catch(Exception e){
this.textArea1.setText("No puedo abrir el puerto.");
}
}

Para iniciar los servos y enviar los comandos uso estas sencillas funciones. Tened en cuenta que el formato del comando a enviar es el del controlador de servos que uso (SUPER CONTROLADOR DE SERVOS S310175, www.superrobotica.com - voy a tener que pedir comisión por tanta publicidad :P). Como podeis ver, en la inicialización de los servos recorre un bucle del 1 al 8, ya que este controlador permite hasta 8 servos (en realidad se pueden usar hasta 8 controladores de este tipo como si fueran uno solo, lo que nos darias hasta un maximo de 64 servos - pero mejor nos conformamos con 8... que ya esta bien). Estas son las funciones:

public void iniciaServos(){
int i=0;
for(i=1;i<9;i++){>1"+i+"w",(byte)1);
enviaComando(">1"+i+"a",(byte)128);
}
}

public void enviaComando(String myCommand, byte data){
char[] arr = myCommand.toCharArray();
try{
salida.write(arr[0]);
salida.write(arr[1]);
salida.write(arr[2]);
salida.write(arr[3]);
salida.write((byte)data);
//Thread.sleep(1000);
}catch(Exception e){
//...
}
}

Añadiendo un control de tipo Slide para cada servo podemos hacer lo siguiente:

private void slideServo(int modulo, int servo, int posicion){
int miValor = (posicion*254)/100 +1;//.getValue();
//String cadena = new Character((char)miValor).toString();
String miComando = ">"+modulo+""+servo+"a";
this.textArea1.setText(miComando + " - " + miValor);
enviaComando(miComando,(byte)miValor);

}

//Este es el evento de arrastrar el raton en el Slide1
//por lo que necesitamos una de estas por cada servo.
private void jSlider1MouseDragged(java.awt.event.MouseEvent evt) {
// Cambio de valor en Servo 1
slideServo(1,1,jSlider1.getValue());
}


Los slide ofrecen valores de 1 a 100, y los servos de 1 a 255, por eso se hace la pequeña operación para obtener el valor (no os asusteis que solo es una regla de tres simple).

Bueno, después si tengo un rato os pongo más cosillas, a ver si esta semana lo puedo tener armado al completo para subiros un video de como va funcionando el elemento.

Ya sabeis, se agradecen los comentarios.

6 comentarios:

  1. Muy interesante. Podrías publicar una lista con los componentes que estas utilizando para armar el robot?

    ResponderEliminar
  2. Yo también quisiera apuntarme a esto de los robots. Si publicas esa lista te lo agradeceríamos mucho. Un abrazo, Juan.

    ResponderEliminar
  3. He publicado una lista previa en un post, si teneis alguna duda o comentario, ya sabeis!!! y gracias por comentar!!!!

    ResponderEliminar
  4. Mira tu por dónde, yo siempre tuve ganas de pegarle a esto de la robótica, de hecho le ando de trás a mi mujer para que me "regale" el robotito ese de Lego tan chulo X-D

    Seguiré tu blog para ver tus avances y probar por mi cuenta.

    Dale caña!

    ResponderEliminar
  5. Esta libreria del Java es exactamente lo que mi primo queria yo no se si el aun sabe de esta informacion pero me voy a asegurar de que se entere porque es una muy buena informacion.

    ResponderEliminar
  6. Buena infamación muy útil para todos nosotros

    ResponderEliminar

Escribe un comentario

Noticias tecnológicas