¿Qué es este blog?

La idea de este blog nace para compartir los avances que se vayan realizando a lo largo de un estudio sobre cómo interconectar los distintos sensores que se pueden encontrar en el mercado, o fabricar de forma casera, con la plataforma Mindstorms de LEGO. Para ello se hará uso ARDUINO, un entorno de desarrollo abierto basado en microcontrolador.

lunes, 10 de enero de 2011

Ejemplo 1: Manejar I2C desde LejOS


A continuación se va a presentar un ejemplo de cómo manejar desde LejOS un dispositivo que usa el protocolo I2C. Se trata del NXTServo de Mindsensors, que ha sido desarrollado para manejar varios servos RC.
            En primer lugar, para poder leer la batería conectada a este dispositivo, es necesario conocer los siguientes parámetros:
-       Dirección I2C del NXTServo: 0xb0
-       Registro I2C del NXTServo que nos permite leer el nivel de batería: 0x41

Un ejemplo de código que efectuaría la lectura del nivel de batería de nuestro dispositivo sería el siguiente:
Public class NXTServoTest {
    Public static void main(String[] args) {
        DebugMessages dm = new DebugMessages();
        dm.setLCDLines(6);
        dm.echo(“Probando NXT Servo);

        MSC msc = new MSC(SensorPort.S1);
        msc.addServo81,”Mindsensors RC Servo 9Gr”);

        while(¡Buton.ESCAPE.isPressed()){
            dm.echo(msc.getBattery());
        }
        dm.echo(“Test finalizado”);
    }
}

La clase MSC (Mindsensors Servo Controller) es capaz de manejar hasta 8 servos RC. Vamos a ver, para entender un poco mejor todo esto, dos métodos internos de la clase MSC.
El primero de ellos es el constructor. Si nos fijamos en él, veremos que todas las operaciones de I2C usan la dirección 0xb0:
public static final byte NXTSERVO_ADDRESS = (byte)0xb0;

public MSC (SensorPort port) {
    super(port);
    port.setType(TYPE_LOWSPEED_9V);
    this.setAddress(MSC.NXTSERVO_ADDRESS);

    this.portConnected = port;
    arrServo = new ArrayList();
}

El segundo método es el que nos devuelve el estado de la batería. En este caso se lee el registro 0x41 que, como se dijo anteriormente, almacena dicho nivel. Cada acción que se realice en I2C tiene una repsuesta: si esta respuesta es cero, es que todo ha ido bien, pero en caso contrario es que algo ha fallado. Normalmente cuando se lee un valor de un registro es necesario usar un buffer para almacenar los datos leídos, en nuestro caso se denomina “bufReadResponse”. Tenemos el código a continuación:
Public int getBattery() {
    int I2C_repsonse;
    byte [] bufReadResponse;
    bufReadResponse = new bye[8];
    byte kSc8_Vbatt = 0x41; // El registro I2C para leer la batería
    return(37*(0x00FF & bufReadResponse[0])); //El 37 proviene de el voltaje que
    //nos da el NXT = 4700 mv / 128

No hay comentarios:

Publicar un comentario