jueves, 26 de abril de 2012

Lecturas con la brújula I2C


Hoy os damos la noticia de que ya tenemos implementada y funcionando nuestra nueva brújula I2C CMPS03 en el robot Kigo.

Para ello, por un lado hemos tenido que realizar una serie de conexiones hardware entre la brújula y uno de los puertos de entrada del bloque NXT, tal y como podemos ver en la siguiente tabla:



 
Para realizar todas estas conexiones, hemos diseñado una placa impresa auxiliar y hemos utilizado dos conectores RJ11. Se puede encontrar el esquema eléctrico del circuito auxiliar en este enlace.

Por otro lado, hemos tenido que ampliar el software del robot con una nueva clase que se encarga de leer los registros de la brújula y convertir los valores leídos a grados sexagesimales: CompassCMPSensor.java.


La nueva estructura de clases del software del robot es:



La clase CompassCMPSensor.java consta de tres métodos:
  • public int getData(int register, byte[] buf, int len): Le pasamos como parámetro el número de registro del sensor I2C que queremos leer, un array de bytes donde queremos que se almacene la lectura y la longitud del entero que devolverá el método. Como se puede intuir al ver los parámetros de entrada, el método simplemente lee a través del bus I2C el valor del registro que se le ha indicado y guarda el byte que ha leído en un determinado array. Nos devolverá 0 si la lectura se ha realizado de forma correcta y un valor negativo en caso de error.
  • public int getSimpleDegrees(): Como ya explicamos al hablar de los distintos registros internos de la brújula CMPS03, ésta nos puede dar la posición respecto al polo Norte magnético con una resolución de grados o de décimas de grados. En el primer caso, la posición es un valor de 1 byte sin signo (registro 1), es decir, entre 0 y 255. Este valor representa un ángulo entre 0 y 360º. El método getSimpleDegrees() realiza la lectura del registro 1 de la brújula. Como Java trabaja con bytes con signo en complemento a 2, interpretará como negativos a todos los valores superiores a 128; por lo tanto, tenemos que hacer una conversión previa de byte con signo a número entero para volver a la escala de 0 a 255. Posteriormente, hacemos una segunda conversión de estos valores a grados sexagesimales, para tener una escala final de 0 a 360º:




  • public int getComplexDegreees(). Este método funciona de manera similar al que acabamos de explicar, pero con él obtenemos una resolución de décimas de grado. Lee los registros 2 y 3 de la brújula, que representan con 2 bytes valores entre 0 y 3599 (el del registro 2 es el más significativo). De nuevo hay que tener en cuenta que Java trabaja con bytes con signo en complemento a 2 y realizaremos la conversión previa a números enteros. En este caso, para obtener el valor en grados sexagesimales, simplemente tendremos que dividir entre 10 la lectura de los registros:



Uno de los problemas que nos hemos encontrado a la hora de conectar la brújula al robot es que, si la colocamos muy cerca del bloque NXT, se producen interferencias de las comunicaciones Bluetooth con la lectura de los sensores magnéticos. Por este motivo, hemos creado una estructura que permite a la brújula estar ligeramente alejada del bloque NXT para no verse afectada por sus campos electromagnéticos. 


Para completar la integración de la brújula en nuestro sistema, incorporaremos en la monitorización de sensores de la aplicación Android la lectura en tiempo real de la posición del robot respecto al polo Norte magnético.

Por último, modificaremos el algoritmo de detección de contenedores del robot (implementado en el behavior “Mapping()”). Hasta ahora medíamos el ángulo al que se encontraba un contenedor mediante el tacómetro de los motores. El problema es que, si la superficie donde trabajamos no es perfecta y las ruedas patinan, esta medida no es nada fiable, tal y como se podía ver en el vídeo del primer hito. Por este motivo, a partir de ahora mediremos este ángulo mediante la brújula. Próximamente iremos informando de las mejoras que consigamos.



No hay comentarios:

Publicar un comentario