Acelerômetro MMA845X com Raspberry pi em Python - Embarcados
Acelerômetro MMA845X com Raspberry pi em Python
Neste artigo, iremos aprender como conectar o acelerômetro MMA845X a Raspberry pi, e como adquirir a aceleração e a orientação da placa por meio de um programa em linguagem Python.
Grande parte dos sistemas que necessitam obter a orientação de algum objeto, realizar análise de vibrações, detecção de quedas e outros, necessitam do uso do acelerômetro. Existem vários modelos bastantes difundidos no mercado, cujo princípio de funcionamento já foi explicado anteriormente neste post. Neste artigo utilizaremos a placa MMA845X que possui um acelerômetro de 3-eixos, e possui tais características:
Sobre o MMA845X
O acelerômetro MMA845X, possui como características:
Aceleração instantânea nos 3 eixos, com resolução configurável entre 8 e 12 bits.
Tensão de alimentação entre 1.95V e 3.6V
Fundo de escala selecionável dinamicamente entre: ±2g/±4g/±8g
Taxa de saída de dados (Output Data Rate-ODR) de 1.56 Hz até 800 Hz
Interface de comunicação I2C
Consumo de corrente muito baixo, variando de 6 a 165 μA
Detecção de orientação (paisagem ou retrato)
Como a comunicação é realizada por meio do protocolo I2C, é necessário configurar o endereço. O MMA845X, por padrão, possui dois endereços disponíveis: 0x1D e 0x1C. A escolha do endereço a ser utilizado, depende do nível lógico aplicado no pino SA0 do acelerômetro, assim, para utilizar o endereço 0x1D, deve-se aplicar nível lógico ALTO (lembre-se que neste pino o nível alto é de 3V3!!). E, para utilizar o endereço 0x1C deverá ser aplicado o nível lógico baixo, conectando o pino SA0 ao GND.
O diagrama de conexão do MMA845x com a Raspberry Pi é mostrado na Figura 1:
Figura 1 – Diagrama de conexão
Configuração da Raspberry
Agora que o acelerômetro está conectado à Raspberry, é necessário configurar a Raspberry para usar a comunicação I2C, garantindo assim, que o barramento I2C está ativo. Para isto, deve abrir o terminal e digitar o seguinte comando:
~/sudo raspi-config
Em seguida, aparecerão as opções tal como mostrado na Figura 2. Selecione a opção "5 – Interfacing Options".
Figura 2 – Tela de configurações gerais
Em seguida, selecione a opção "P5 – I2C", e depois, selecione a opção SIM. tal como mostrado nas Figuras 3 e 4.
Figura 3 – Menu de configurações das opções de interfaces
Figura 4 – Tela de confirmação da habilitação do barramento I2C
Após estes passos, nos certificamos que a Raspberry está com o barramento I2C disponível para ser utilizado para tráfego de informações.
A biblioteca para uso do MMA845X, está disponível NESTE repositório. Assim, para usá-lo basta fazer o download ou clonar em uma pasta do seu interesse utilizando o seguinte comando:
~/ git clone https://github.com/ASdOliveira/MMA845X.git
Em seguida abra a pasta MMA845X, cujos arquivos baixados são mostrados na Figura 5. E por fim, execute o código example.py
Figura 5 – Arquivos baixados
Explicando o código para usar o acelerômetro MMA845X com Raspberry Pi
Primeiramente são adicionadas as bibliotecas que serão utilizadas.
from library.accelerometer import * from time import sleep
from library.accelerometer import *
Nesse caso, a biblioteca accelerometer, responsável pelo controle do acelerômetro e a biblioteca time, por meio da qual é possível usar a função sleep, podendo assim dando um delay em um determinado ponto.
accelerometer_address = 0x1C myAccel = accelerometer(accelerometer_address)
accelerometer_address = 0x1C
myAccel = accelerometer(accelerometer_address)
Em seguida, é instanciada a classe accelerometer, cujo único parâmetro é o endereço que como dito anteriormente, deve ser 0x1D ou 0x1C a depender do nível lógico aplicado no pino SA0.
A última parte do código é responsável por adquirir a aceleração instantânea em cada eixo e imprimir estas informações na tela, assim como obter a orientação da placa do acelerômetro e printar esses dados na tela.
try: while True: myAccel.read() #Imprimir a aceleração de cada eixo print("x = {0}, y = {1}, z = {2}".format(myAccel.x, myAccel.y, myAccel.z)) #Imprimir a orientação do acelerômetro print(myAccel.readPosition()) sleep(0.3) except KeyboardInterrupt: pass
myAccel.read()
#Imprimir a aceleração de cada eixo
print("x = {0}, y = {1}, z = {2}".format(myAccel.x, myAccel.y, myAccel.z))
#Imprimir a orientação do acelerômetro
print(myAccel.readPosition())
O método read() é responsável por ler a aceleração de cada eixo e guardar nas variáveis x, y e z da classe. Enquanto que o método readPosition() retorna uma string informando a orientação em que se encontra o acelerômetro, que pode ser: Flat, retrato ou paisagem.