¿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.

martes, 30 de noviembre de 2010

¿Cómo maneja LejOS los protocolos I2C y RS-485?

    LejOS permite la ejecución de código escrito en el lenguaje de programación JAVA en el interior del RCX. Incluye un API (Interfaz de Programación de Aplicaciones) que permite tener acceso a los distintos medios de comunicación propios de JAVA, además de a una parte del API estándar del propio lenguaje. LejOS no consta de todas la características de JAVA, pero puede fácilmente evolucionar hacia ellas en un futuro, siempre que la memoria del RCX, por ahora la principal limitación, lo permita

Protocolo I2C mediante LejOS

    Como se ha visto anteriormente, el robot puede comunicarse con los sensores que se le conecten haciendo uso del protocolo I2C. LejOS es capaz de gestionar esta comunicación haciendo uso de una clase denominada I2CSensor, cuyas principales funciones se van a describir a continuación.

    La clase I2CSensor, se encuentra contenida en el paquete Java.Lang.Object de JAVA. En primer lugar se van a ver los tres métodos más usados para nuestros propósitos. Cabe destacar que en todos los casos, si el método devuelve 0 la operación habrá sido un éxito, mientras que si devuelve otra cosa habrá que tratar el error producido.
  • void setAddress(int addr). Establece la dirección del puerto. Es importante destacar que el rango de direcciones que cubre va de 0x01 a 0x7F, y no de 0x02 a 0x7E como se incluye en las especificaciones de algunos dispositivos que funcionan bajo este protocolo.
  • Int sendData(int register, byte value) o Int sendData (int register, byte [ ] buf, int len). Esta instrucción nos va a permitir escribir lo que queramos en el registro del dispositivo seleccionado. En el primer caso, se va a escribir un único byte en el registro I2C deseado, en el segundo caso, se puede especificar la longitud del dato a mandar.
  • Int getData (int register, byte [ ] buf, int len). Es la operación contraria a la anterior. Nos va a permitir obtener el dato que el sensor haya puesto en el registro que indiquemos.

    Otros métodos que también nos van a ser de utilidad son los siguientes:

  • I2CPort GetPort ( ). Es un método que pertenece a la clase I2CPort, contenida dentro del paquete lejos.nxt.BasicSensorPort y más concretamente al paquete lejos.nxt.BasicSensorPort. Nos va a permitir obtener el número de puerto al que está conectado el sensor.
  • String getProductID ( ). Esta función devuelve el identificador de producto del sensor que se esté usando.
  • String getSensorType ( ). Nos va a devolver el tipo de sensor en una cadena, es decir, si es un sensor de temperatura, un sensor de luz, etc.
  • String getVersion ( ). Esta función devolverá, contenida en una cadena, la versión del sensor.

Protocolo RS-485 mediante LejOS

    La clase de LejOS que nos va a permitir tener acceso al protocolo RS-485 es la lejos-nxt.comm.RS485, contenida también dentro del paquete java.lang.objetc, y más conretamente dentro de lejos.nxt.comm.NXTCommDevice. Esta clase proporciona un acceso a bajo nivel a las capas más bajas del hardware que use el protocolo RS-485 y que esté conectado al puerto 4 del NXT. Así mismo, también soporta una conexión de más alto nivel basada en una red de tipo BitBus. Báicamente, la red proporciona una implementación simple de tipo maestro/esclavo usando transmisión de paquetes SDLC (Synchronous Data Link Control) con un control de errores mediante redundancia cíclica CRC-16-CITT. En esta implementación se usa una tasa de transferencia de 921.600 baudios y se usan bytes de lleno en lugar de bits de relleno, como se suele hacer (ya que no hay soporte hardware). El protocolo nos permite realizar hasta  siete conexiones.

    Si bien la implementación original usaba JAVA para el manejo de tramas, se comprobó que se estaba añadiendo una gran tara innecesaria al proceso. Por este motivo, las rutinas de más bajo nivel de implementaron en C y se incluyeron en el firmware como métodos nativos. Así, se consiguió una mejora de un factor de 10 aproximadamente.

    A continuación se van a describir los métodos más importantes para el manejo de este protocolo:
  • Static RS485connection connect (String target). Va a establecer la conexión con un dispositivo remoto mediante el nombre o la dirección, que irán contenida en el parámetro target.
  • Static RS485connection connect (String target, int mode). Es idéntica a la anterior, salvo que nos permite definir el método de entrada/salida que queremos usar.
  • Static void hsDisable ( ). Desactiva el puerto hardware del protocolo RS-485
  • Static void hcEnable ( ). Activa el puerto harware del protocolo RS-485
  • Static int hsRead (byte [ ] buf, int offset, int len). Realiza una lectura de bajo nivel del puerto 4 del Mindstorm. Devuelve el número de bytes leídos.
  • Static int hsWrite (byte [ ] buf, int offset, int len). Realiza una escritura de bajo nivel en el puerto 4 del NXT. Devuelve el número de bytes escritos.
  • Static RS485connection waitForConnection (int timeout, int mode). Espera una conexión de otro NXT. Devuelve el objeto conector.
--------------------------------------------------------------------------------------------------------------------------
Referencias:
  • Sistemas de bus RS-485. http://www.wut.de/e-6wwww-11-apes-000.php
  • Charbel Stockmans Daou (2008). Desarrollo y Evaluación de Aplicaciones Robóticas con Lego Mindstorms. Universidad de Málaga
  • Class I2CSensor (lejos NXJ API Documentation). http://lejos.sourceforge.net/nxt/nxj/api/lejos/nxt/I2CSensor.html#SENSOR_TYPE
  • Class RS485 (lejos NXJ API Documentaion). http://lejos.sourceforge.net/nxt/nxj/api/index.html

No hay comentarios:

Publicar un comentario