Introdução
Neste tutorial farei um exemplo de uso do acelerômetro, que é outro recurso integrado da placa FDM-KL25Z.
O MMA8451Q, que é a especificação do acelerômetro, é conectado ao KL25Z via interface de comunicação serial I2C, com a seguinte pinagem:
· SCL = PTE24
· SDA = PTE25
Figura 01
Faremos uso dessa pinagem para manipular o acelerômetro.
Terceiro Exemplo – Acelerômetro
Crie um novo programa. Dê o nome de Exemplo-Acelerometro. Lembre-se de alterar o template para Empty Program. Depois crie um novo arquivo e dê o nome de acelerometro.cpp. Importe a biblioteca mbed.
Para o acelerômetro funcionar precisaremos importar a biblioteca MMA8451Q, já que MMA8451Q é a especificação do acelerômetro da placa FRM-KL25Z. Faremos a importação de maneira diferente. Acesse o site https://developer.mbed.org/ , clique no menu Hardware -> Components. Selecione a opção Sensors.
Figura 02
Em seguida, clique em MMA8451Q Accelerometer.
Figura 03
Você será redirecionado para um link onde será possível importar a biblioteca para seu programa. Para isso clique em Import Library, como mostra a Figura 04.
Figura 04
Selecione em qual programa a biblioteca deverá ser adicionada em Target Path, como mostra a Figura 04, e clique no botão Import.
Figura 05
O código é o seguinte:
#include "mbed.h"
#include "MMA8451Q.h"
// Definição de acordo com o modelo do KIT
#define MMA8451_I2C_ADDRESS (0x1d<<1)
int main(void)
{
MMA8451Q acc(PTE25, PTE24, MMA8451_I2C_ADDRESS);
PwmOut ledr(LED1);
PwmOut ledg(LED2);
PwmOut ledb(LED3);
ledr = 1.0;
ledg = 1.0;
ledb = 1.0;
while (true) {
ledr = 1.0 - abs(acc.getAccX());
ledg = 1.0 - abs(acc.getAccY());
ledb = 1.0 - abs(acc.getAccZ());
wait(0.1);
}
}
A instrução MMA8451Q acc(PTE25, PTE24, MMA8451_I2C_ADDRESS) cria um objeto acc pertencente a classe MMA8451Q (biblioteca MMA8451Q.h) indicando a pinagem a ser utilizada e aloca os pinos da I2C.
A instrução acc.getAccX() capta o ângulo no eixo X, acc.getAccY() capta o ângulo no eixo Y, acc.getAccZ() capta o ângulo no eixo Z. A instrução abs pega o valor absoluto (inteiro) que o comando acc.getAcc retorna.
Neste exemplo conforme a placa é movimentada a cor do LED sofre alterações. O código verifica em qual dos eixos há movimentação, qual o ângulo e aplica intensidade no LED. Se for detectado movimentação no eixo X, o LED vermelho recebe intensidade, se for o eixo Y o LED verde recebe intensidade e se for o eixo Z o LED azul recebe intensidade.
Agora vamos alterar o código para que as cores alterem a cada 45° em cada eixo, sem mistura de cores, ou seja, se está azul ao movimentar 45° no eixo x fica vermelho, chegando aos 45° do eixo y muda pra verde e chegando aos 45° do eixo z fica azul. O código é o seguinte:
#include "mbed.h"
#include "MMA8451Q.h"
#include "math.h"
#define MMA8451_I2C_ADDRESS (0x1d<<1)
int main(void) {
MMA8451Q acc(PTE25, PTE24, MMA8451_I2C_ADDRESS);
PwmOut ledr(LED1);
PwmOut ledg(LED2);
PwmOut ledb(LED3);
ledr = 1.0;
ledg = 1.0;
ledb = 1.0;
long double calc = sqrt(2.0)/2;
while (true) {
ledr = (1.0 - (abs(acc.getAccX()))/calc);
ledg = (1.0 - (abs(acc.getAccY()))/calc);
ledb = (1.0 - (abs(acc.getAccZ()))/calc);
wait(0.001);
}
}
Primeiro foi calculado o valor de seno de 45°. A ideia foi pegar através do acc.getAcc o ângulo (tanto pra x, y e z) dividir pelo seno do ângulo e tirar de um fazendo com que o LED acenda.