Olá pessoal… depois do jejum de post’s resolvi postar algo um pouco mais complexo para me redimir um pouco… se bem que acredito que a leitura será interessante e muito agradável pois se trata de uma tecnologia atual e que já faz parte do nosso cotidiano, vamos implementar o uso de um acelerômetro digital com comunicação via I²C.
Acelerômetro
O acelerômetro consiste em um dispositivo micro eletromecânico (MEMS) que utiliza-se de nanotecnologia para construção de sensores que medem a grandeza de aceleração em objetos.
Para conseguir efetuar a leitura desta grandeza, este componente possui em seu interior uma massa móvel contendo várias placas que interagem com placas fixas ao ci, formando desta maneira um sistema capacitivo que altera o valor da capacitância conforme o movimento da massa móvel, ou seja, a cada movimento no componente temos uma informação disponível relacionada a um dos eixos.
A empresa ST Microeletronics desenvolve a muitos anos essa tecnologia e hoje conta com seus MEMS instalados em muitos equipamentos, desde pequenos brinquedos e controle de video games até os telefones de ultima geração.
Para este post, vamos utilizar o LIS3LV02DL que possui muitos recursos embutidos além de medir aceleração em três eixos e possuir comunicação via barramento I²C que é um dos mais utilizados para comunicação entre microcontroladores e seus periféricos, além de ter duas escalas de medição, uma medindo até 2 g e outra medindo até 6 g, sendo 1.0025 g o equivalente a uma aceleração de 9.8310 m/s².
Este componente é fornecido pela ST Microeletronics em uma placa de avaliação comercializada pelo código STEVAL-MKI009V1.
Abaixo podemos observar a foto do acelerômetro LIS331, utilizado no iPhone 3GS comparado a uma moeda.
Os acelerômetros podem apresentar duas formas de interfaceamento, sendo, digital ou analógico, nos analógicos as saídas correspondentes aos eixos informam a grandeza variando o nível de tensão DC no pino correspondente ao seu eixo, já no caso dos acelerômetros digitais, esses valores são transferidos via comunicação serial, podendo ser utilizado I²C ou SPI.
Este componente ainda conta com uma interrupção por movimentos, sendo possível efetuar o ajuste do nível de sensibilidade.
Curiosidade!!!
Alguns computadores antigos da Apple, contam com uma função que detecta uma possível queda de nível, fazendo com que a agulha do HD fosse para a posição de descanso a fim de não danificar o disco antes do impacto acontecer, pois bem, como é possível efetuar a detecção de queda livre?
R. Como todos sabemos, todos os corpos na terra sofrem a ação da gravidade, portanto o acelerômetro sempre estará sofrendo esta força, quando em queda livre de maneira linear, esta força tende a se anular pois o corpo acelera em relação ao eixo da terra e é neste momento que se pode detectar a queda livre ou free fall.
Interfaceamento
# Inicializar o barramento
# Informar o comando de escrita para o LIS3LV02DL
# Escrever o conteúdo do registrador CTRL_REG1 (Já vem indexado)
# Escrever o conteúdo do registrador CTRL_REG2
Após este procedimento podemos efetuar as leituras propriamente ditas seguindo a sequência abaixo.
# Inicializar o barramento
# Informar o comando de escrita para o LIS3LV02DL
# Informar qual o endereço desejamos ler inicialmente
# Reinicializar o barramento novamente
# Informar o comando de leitura para o LIS3LV02DL
# Efetuar a leitura de forma sequencialmente dos eixos
Por fim, como a leitura do acelerômetro se dá em 12 bits, precisamos concatenar esses dois bytes para obtermos a informação desejada para enfim apresentarmos os resultados no display LCD e via porta serial.
- WHO_AM_IEndereço padrão deste CI no barramento I²C…
- CTRL_REG1Configurações para habilitação de leitura dos eixos, self test…
- CTRL_REG2Seleção de escala, interrupções…
- CTRL_REG3Ajuste de clock e filtros passa alta…
Software
O software para este exemplo mede a aceleração dos 3 eixos em 12 bits apresentando os valores lidos no display LCD, e envia os dados periodicamente via porta serial para o terminal serial do PC a 9600bps.
/******************************************************************************
JL Audio Manutenção Eletrônica
Data: 23/04/2011
Autor: Jean Carlos
Projeto: MEMS ST - Acelerômetro ( LIS3LV02DL )
Microprocessador: PIC18F4550
Clock do processador: 8MHz
Estação de desenvolvimento: PK2Lab V1.1
Versão atual: V 1.0
Descrição:
Este projeto demonstra o uso de um MEMS(Sistema Micro eletromecânico)
da ST, modelo LIS3LV02DL que se trata de um acelerômetro digital
de 3 eixos (2G e 6G)
*******************************************************************************/
//Variáveis Globais
unsigned char XL,XH,YL,YH,ZL,ZH;
unsigned int X,Y,J;
char txt[7];
//****************************************************************
//Rotinas Auxiliares
void Le_Acelerometro()
{
I2C_Start();
I2C_Wr(0x3A); // Endereço do acelerômetro para escrita.
I2C_Wr(0xA8); // Endereço do registrador Eixo X Lower (0x28), ainda foi setado o sétimo bit do registrador para indicar a indexação automática do endereço.
I2C_Repeated_Start();
I2C_Wr(0x3B); // Endereço do acelerômetro para leitura.
XL = I2C_Rd(1);
XH = I2C_Rd(1);
YL = I2C_Rd(1);
YH = I2C_Rd(1); // Carrega as informações referentes aos eixos
ZL = I2C_Rd(1);
ZH = I2C_Rd(0);
I2C_Stop();
}
void Envia_Serial()
{
Usart_Write(X);
Usart_Write(Y);
Usart_Write(J);
}
//****************************************************************
//Rotina Principal
void main() // Início do programa principal
{
TRISA = 0b00000000;
PORTA = 0b00000000;
TRISB = 0b00000000;
PORTB = 0b00000000;
TRISC = 0b00000000;
PORTC = 0b00000000;
TRISD = 0b00000000;
PORTD = 0b00000000;
TRISE = 0b00000000;
PORTE = 0b00000000;
ADCON1 = 0X0F; // Entradas digitais.
Lcd_Config(&PORTB,2,3,1,7,6,5,4); // Configuração PK2Lab V.1.1
Lcd_Cmd(Lcd_Cursor_Off);
Lcd_Cmd(Lcd_Clear);
Lcd_Out(1,1,"*** PK2Lab ***");
Lcd_Out(2,1," Acelerometro ");
Delay_ms(3000);
Lcd_Cmd(Lcd_Clear);
Lcd_Out(1,1,"X:");
Lcd_Out(2,1,"Y:");
Lcd_Out(2,9,"Z:");
Usart_Init(9600); // Inicia comunicação RS232
I2C_Init(100000); // Inicia comunicação I2C
I2C_Start(); // Inicia comunicação I2C
I2C_Wr(0x3A); // Endereço do LIS3LV02DL para escrita
I2C_Wr(0xA0); // Primeira palavra de endereço inicia pelo registrador CTRL_REG1 (0x20) , escrita contínua…
I2C_Wr(0xC7); // 11000111 ---> CTRL_REG1 C7
I2C_Wr(0x04); // 00000100 ---> CTRL_REG2 04
I2C_Stop();
while(1)
{
Le_Acelerometro(); // Efetua a leitura de aceleração dos 3 eixos
Delay_ms(100);
X = (XH); // Concatena as partes altas e baixas dos registradores.
X = (X<<8) + XL;
Y = (YH);
Y = (Y<<8) + YL;
J = (ZH); // Foi usado J no lugar de Z pois Z o compilador usa como Zero
J = (J<<8) + ZL;
intToStr(X,txt);
Lcd_Out(1,3,txt);
intToStr(Y,txt);
Lcd_Out(2,3,txt);
intToStr(J,txt);
Lcd_Out(2,11,txt);
Envia_serial(); // Envia os dados pela porta serial a 9600bps
}//while(1)
}//main
Vídeos do projeto
Neste vídeo podemos observar o projeto em funcionamento.
Neste outro vídeo, vemos o acelerômetro controlando um equipamento de iluminação profissional (Moving Head) onde controlamos PAN e TILT através da leitura dos eixos X e Y respectivamente.
Gostaria de agradecer imensamente ao Eng. André Braz, representante da empresa ST Microelectronics no Brasil, que gentilmente cedeu algumas peças destas incríveis máquinas assim como muita informação técnica! Valeu André!!!
Bom pessoal, por hoje é isto, grande abraço a todos e bons projetos!