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.
No hay comentarios:
Publicar un comentario