terça-feira, junho 23, 2015

Módulo GY-282: Bússola Triaxial - Características

O módulo GY-282 é uma bússola triaxial que é encontrada em alguns sites chineses, como a DX e GoodLuckyBuy, por menos de US$6,00. Entretanto, informações detalhadas sobre ele não são tão facilmente encontráveis. Documento nesta série o que eu descobri e os meus experimentos.


HMC6983

A documentação da bússola em si não é difícil encontrar. O integrado usado é o HMC5983, cujo datasheet pode ser baixado do site do fabricante. De forma resumida:
  • Possui três sensores magnetoresistivos, que são medidos utilizando um ADC de 12 bits
  • Suporta interfaces seriais I2C e SPI
  • Requer alimentação entre 2,16 e 3,6 V
  • Possui um sensor de temperatura interno e compensa automaticamente as medições

Internamente o  HMC5983 possui 15 registradores, sendo 2 para configuração, 1 para seleção do modo de operação, 1 de status, 3 de identificação do chip e 4 pares para ler os três eixos e a temperatura:

O acesso aos registradores usa um ponteiro interno.

Comunicação I2C

Lembrando, a comunicação I2C utiliza dois sinais, dado (bidirecional)  e o clock (gerado pelo mestre). Portanto é necessário estabelecer a direção (leitura ou escrita) dos bytes transferidos.

A comunicação I2C deve sempre começar com um byte com o endereço do dispositivo (0x1E) e a indicação de leitura ou escrita.

Na escrita (primeiro byte é 0x3C), o byte seguinte será um endereço de registrador, que será salvo no ponteiro. Os bytes seguintes, se presentes, serão escritos no registrador endereçado pelo ponteiro, a cada escrita o ponteiro é incrementado. Se nenhum byte for enviado após o endereço do registrador, o efeito é apenas carregar o ponteiro.

Na leitura (primeiro byte é 0x3D) são enviados o byte apontado pelo ponteiro; a cada byte lido o ponteiro é incrementado.

Confuso? Vamos ver alguns exemplos ([start] e [stop] são as sinalizações correspondentes no I2C):
  • [start] 0x3C 0x00 0x70 0xA0 [stop]: escreve 0x70 no registrador CRA (0x00) e 0xA0 no registrador CRB (0x01).
  • [start] 0x3C 0x0A [stop]: coloca o endereço 0x0A (primeiro registrador da identificação) no ponteiro interno. Para ler a identificação, deve ser enviado em seguida [start] 0x3D, seguido da leitura de três bytes e um [stop] para encerrar a transação.
Comunicação SPI

Na comunicação SPI o endereçamento é feito através de um sinal (CS), não existindo o byte de endereço do dispositivo. Na forma mais comum (4 fios) são sempre transferidos dois bytes, um em cada sentido.

O início de uma transação é feito acionando o sinal CS e o seu fim desacionando-o. O primeiro byte da transação contém o endereço de um registrador, a operação (leitura ou escrita) e uma indicação se o ponteiro deve ou não ser incrementado a cada byte transferido. Os bytes seguintes são de dados.

Vejamos como seriam feitos os mesmos comandos mostrados acima ([start] é o acionamento de CS e [stop] o seu retorno ao repouso):
  • [start] 0x40 0x70 0xA0 [stop]: 0x40 indica endereço 0, escrita, incremento
  • [start] 0xCA seleciona o endereço 0A, leitura e incremento. Em seguida devem ser lidos os três bytes da identificação e encerrada a transação ([stop])
O  Circuito do Módulo

Agora que já conhecemos o HMC5983 precisamos saber como ele está ligado no módulo. Encontrei esta informação em um anúncio antigo no Ebay. Para o caso do anúncio sumir, o material está em GY282.zip nos arquivos do blog. Indo direto ao que interessa:
  • O pino VIN do conector está ligado a um regulador (LDO). Desta forma pode ser alimentado sem susto com qualquer tensão entre 3 e 5V.
  • Dois jumpers (I2C/SPI e 3V3/CS, ver na foto) possibilitam selecionar entre SPI e I2C. A placa veio configurada para I2C (solda entre o terminal I2C e o pino central no jumper de cima e jumper de baixo fechado). Para operar em SPI é necessário mudar o jumper de cima pra ligar SPI ao pino central e desconectar os pinos do jumper de baixo.
Para operar em I2C basta conectar os pinos VIN, GND, SCL e SDA. Para operar em SPI, após mudar os jumpers acima, usar os pinos VIN, GND, SCK, SDI, SDO e CS.

O uso do pino DRDY é opcional, este sinal é normalmente alto e pulsa quando um resultado está disponível.


No próximo post vamos ligar o módulo a um Arduino.

Nenhum comentário: