Está en la página 1de 4

Conexión de Brújula Digital mediante I2C a un PIC

En este documento se muestra la implementación de la lectura de una brújula digital CMPS03, que está
basada en el sensor magnético Philips KMZ51. La disposición de pines se muestra en la Figura 1.

Figura 1 Imagen de brújula CMPS03

Por el pin 4 se puede observar la salida analógica del módulo. Esta señal es una señal de ancho de
pulso variable, que se rige por la siguiente expresión:

ancho_pulso = (65 + (ángulo en grados)*100) [us].

El periodo de la señal es el ancho del pulso más 1 [ms]. Un diagrama se muestra en la Figura 2.

Figura 2 Diagrama de pulsos de salida de brújula

Esta señal es útil para realizar acciones de depuración una vez que la brújula ya esté conectada, por
ejemplo, para revisar perturbaciones frente a campos magnéticos externos, por ejemplo, de motores.
Funcionamiento mediante I2C
Para conectar la brújula a un bus I2C es necesario realizar resistencias pullup de 1.2K (hacia 5V) en los
pines 3 y 2. En la Figura 3 se muestra un esquemático de las conexiones con un microcontrolador
PIC18F242.

Figura 3 Esquema de Conexiones de Brújula con microcontrolador PIC mediante I2C

La brújula siempre trabaja como esclava (slave). En caso que esté sólo conectado el microcontrolador y
la brújula, el primero debe estar configurado como maestro (master). La secuencia de bits que se
observa en una comunicación entre la brújula y el microcontrolador se observa en la Figura 4.

Figura 4 Secuencia de valores para la comunicación I2C con la brújula

La secuencia anterior se puede resumir como la siguiente:

Start bit
Enviar_dirección brujula, bit lectura en 0 (en este caso 0xC0)
Enviar_instrucción
Start bit
Enviar_dirección_brújula, bit lectura en 1 (en este caso 0xC1)
Recibir_datos
Stop Bit
La brújula tiene un total de 16 bytes de registros, algunos de los cuales forman registros de 2 bytes tal
y como puede verse en la siguiente tabla:

Registro Función
0 Numero de Revisión del Software
1 Dirección. en 1 byte 0-255 para 0 - 360º
2,3 Dirección. en 2 bytes 0-3599 para 0 - 359,9º
4,5 Test interno señal diferencial sensor 1
6,7 Test interno señal diferencial sensor 2
8,9 Test interno, valor de calibración 1
10,11 Test interno, valor de calibración 2
12 Sin usar, devuelve 0
13 Sin usar, devuelve 0
14 Sin usar, devuelve 0
15 Comando de calibración, escribir 255 para calibrar

Este documento no se realizará la revisión de calibración de la brújula, pues es necesaria una brújula
“analógica” para realizar esto.

Código en PICC
El código para ser compilado con PICC se muestra a continuación. Se puede observar que es muy
simple:

#include <18F242.h>
#use delay(clock=20000000)
#fuses NOWDT,WDT128, HS, BORV20, STVREN, NOLVP, NODEBUG, NOBROWNOUT
#use i2c(Master,Slow,sda=PIN_C4,scl=PIN_C3)

int main()
{
setup_adc_ports(NO_ANALOGS);
setup_adc(ADC_OFF);
setup_wdt(WDT_OFF);
setup_timer_0(RTCC_INTERNAL);
setup_timer_1(T1_DISABLED);
setup_timer_2(T2_DIV_BY_16,255,1);
setup_timer_3(T3_DISABLED|T3_DIV_BY_1);

i2c_start(); // Condición de inicio


i2c_write(0xc0); // Dirección de brújula, data bit 0
i2c_write(0x01); // Instrucción
i2c_start();
i2c_write(0xc1); // Dirección de brújula, data bit 1
data1 = i2c_read(0); // recepción de datos
i2c_stop(); // detener comunicación
delay_ms(200); // delay para refresco
}

El compilador de PICC para los PIC de la familia 16 es gratuito, y se puede encontrar en


http://www.htsoft.com/products/PICClite.php. Para otras versiones de microcontroladores es necesario
cambiar el nombre del dispositivo, la velocidad del cristal y verificar los argumentos de setup que
existan o no.

Referencias
Superrobótica.com: Sensor Brújula Digital CMPS03 S320160.
Entrega una información detallada de este dispositivo.
http://www.superrobotica.com/S320160.htm

El bus I2C
http://www.comunidadelectronicos.com/articulos/i2c.htm