ブログ

Armadillo-400シリーズ:3軸加速度センサー(MMA8452Q)から加速度を取得するサンプルプログラム

at_kazutaka.bito
2016年5月3日 11時38分

Armadillo-440からNXPの3軸加速度センサーMMA8452Qの加速度を取得してみました。
動作確認の手順とサンプルプログラムについて下記に説明します。

補足)
サンプルプログラムは、Armadillo-400シリーズのLinux-2.6.26、Linux-3.14のどちらのカーネルでも使用できることを確認しました。

●1.機材

機材は下記のものを使用しました。
・Armadillo-440
LFSTBEB845X(MMA845X開発ボード)に含まれるMMA8452Qモジュールに周辺部品を追加したもの
(周辺部品を含めた回路は、MMA8452Qデータシートのアプリケーション図を参考にしました。)

●2.Armadillo-440とMMA8452Qの接続

Armadillo-440とMMA8452Qとの通信はI2Cで行います。
ここでは、Armadillo-440のCON14のI2C(3pin:SCL、4pin:SDA)に、MMA8452QのI2C端子(4pin:SCL、6pin:SDA)を接続しました。

補足)
Armadillo-440のCON14のI2Cは、標準のカーネルで"/dev/i2c-1"というデバイスファイル名になっています。
CON14のI2C以外のI2Cを使用する場合、下記説明内のデバイスファイル"/dev/i2c-1"の箇所は、 該当するデバイスファイル名に読み替える必要があります。

●3.MMA8452Qから加速度を取得するサンプルプログラム

Armadillo実践開発ガイド第3部  2.2. I2C接続A/Dコンバーター  2.2.5. サンプルプログラム をベースにMMA8452Qから加速度を取得して標準出力に表示するサンプルプログラムになっています。
i2c_acc_mma8452.tar.gz

<サンプルプログラムの用法>
添付のサンプルプログラムをATDE上に解凍して、i2c_acc_mma8452ディレクトリ内でmakeすると、acc_mma8452という実行ファイルができます。

この実行ファイルをArmadillo-440に置いて、I2Cのデバイスファイルを引数として実行します。

acc_mma8452 -d <device>
オプション
 -d: デバイスファイルを指定するためのオプション
引数
 device: I2Cのデバイスファイル

実行すると、まず、WHO_AM_I(0x0D)レジスタと全レジスタをReadした値を表示後、センサーをACTIVE(※)にします。
※)加速度センサーを動作させるためには、コントロールレジスタ(CTRL_REG1(0x2A))のbit0に"1"をセットする必要があります。
以降は、100ms毎に加速度をReadして表示します。

下記は、手順2のようにArmadillo-440のCON14のI2C(デバイスファイル:"/dev/i2c-1")にMMA8542Qを接続した場合の実行例です。

[root@armadillo440-0 (ttymxc1) ~]# ./acc_mma8452 -d /dev/i2c-1
-------- WHO_AM_I --------
WHO_AM_I(0x0D): 0x2A
-------- Read All Registers --------
0x00: 0xFF
0x01: 0xFE
0x02: 0x00
0x03: 0x01
0x04: 0xF0
0x05: 0x3F
0x06: 0x80
0x07: 0x00
0x08: 0x00
0x09: 0x00
0x0A: 0x00
0x0B: 0x01
0x0C: 0x00
0x0D: 0x2A
0x0E: 0x00
0x0F: 0x00
0x10: 0x00
0x11: 0x80
0x12: 0x00
0x13: 0x44
0x14: 0x84
0x15: 0x00
0x16: 0x00
0x17: 0x00
0x18: 0x00
0x19: 0x00
0x1A: 0x00
0x1B: 0x00
0x1C: 0x00
0x1D: 0x00
0x1E: 0x00
0x1F: 0x00
0x20: 0x00
0x21: 0x00
0x22: 0x00
0x23: 0x00
0x24: 0x00
0x25: 0x00
0x26: 0x00
0x27: 0x00
0x28: 0x00
0x29: 0x00
0x2A: 0x01
0x2B: 0x00
0x2C: 0x00
0x2D: 0x00
0x2E: 0x00
0x2F: 0x00
0x30: 0x00
0x31: 0x00
-------- Set CTRL_REG1[0] = 1: ACTIVE --------
CTRL_REG1(0x2A): 0x01
-------- Get Status and XYZ-Axis --------
time=1450698601[s](414483[us])
STATUS(0x00): 0xFF
X: 0xFE3 =    -29
Y: 0x015 =     21
Z: 0x404 =   1028
-------- Get Status and XYZ-Axis --------
time=1450698601[s](518349[us])
STATUS(0x00): 0xFF
X: 0xFE2 =    -30
Y: 0x017 =     23
Z: 0x402 =   1026
-------- Get Status and XYZ-Axis --------
time=1450698601[s](622112[us])
STATUS(0x00): 0xFF
X: 0xFE2 =    -30
Y: 0x016 =     22
Z: 0x401 =   1025

補足)ログ内の表記について、一例を抜き出して説明します。

-------- Get Status and XYZ-Axis --------
time=1450698601[s](622112[us]) // Armadillo-440のタイマーで計測した時間
STATUS(0x00): 0xFF // MMA8452QのSTATUSレジスタの値
X: 0xFE2 =    -30 // MMA8452QのX軸の加速度レジスタの値(12bit、2の補数)を10進数にした値(※)
Y: 0x016 =     22 // MMA8452QのY軸の加速度レジスタの値(12bit、2の補数)を10進数にした値(※)
Z: 0x401 =   1025 // MMA8452QのZ軸の加速度レジスタの値(12bit、2の補数)を10進数にした値(※)
※)[m/s^2]単位への算出は行っていません。

<サンプルプログラムの補足>
Armadillo実践開発ガイド第3部  2.2. I2C接続A/Dコンバーター  2.2.5. サンプルプログラム をベースに今回のサンプル特有の箇所を抜粋します。

mma8452.c

MMA8452Qで任意のレジスタをReadするには、I2C通信のRepeated Start Conditionを使います。

補足)
I2C通信のRepeated Start Conditionについては Armadillo-400シリーズ:Repeated Start Condition対応のI2C通信のデバイスのレジスタからリード を参考ください。

/**** sample: for I2C SMBUS: begin ****/
// Repeated Start Conditionで通信するために、ioctlでI2C_SMBUSを指定できるようにi2c.hをインクルード。
#include <linux/i2c.h>
/**** sample: for I2C SMBUS: end ****/
/**** sample: for I2C SMBUS: begin ****/
int mma8452_read_smbus_byte(struct mma8452 *acc, uint8_t start_addr, uint8_t *digit)
{
    // "start_addr"で指定したレジスタアドレスから1Byte分Readして、"*digit"に格納
}
/**** sample: for I2C SMBUS: end ****/
acc_mma8452.c
    /**** MMA8452: SMBUS Read Register(WHO_AM_I: 0x0d): begin ****/
    // MMA8452QのWHO_AM_Iレジスタ(アドレス:0x0d)をReadして標準出力に表示。
    /**** MMA8452: SMBUS Read Register(WHO_AM_I: 0x0d): end ****/

    /**** MMA8452: SMBUS Read Register(All: 0x00-0x31): begin ****/
    // MMA8452Qの全レジスタ(アドレス:0x00-0x31)をReadして標準出力に表示。
    /**** MMA8452: SMBUS Read Register(0x00-0x31): end ****/

    /**** MMA8452: Write Register(CTRL_REG1: 0x2A) for ACTIVE: begin ****/
    // MMA8452QのCTRL_REG1レジスタ(アドレス:0x2A)のbit0に"1"をセット(ここでは、0x01をWrite)して、センサーをACTIVEにする。
    // MMA8452QのCTRL_REG1レジスタ(アドレス:0x2A)をReadして標準出力に表示。
    /**** MMA8452: Read Register(CTRL_REG1: 0x2A) for ACTIVE: end ****/

    /**** MMA8452: Read Register(Axis): begin ****/
    // 以下、100ms毎に繰り返す。
    // MMA8452QのSTATUSレジスタ(0x00)をReadして標準出力に表示。
    // X、Y、Z軸の加速度データのレジスタ(0x01-0x06)をRead。
    // 加速度データのレジスタの値(12bit、2の補数)を10進数で算出して標準出力に表示。
    /**** MMA8452: Read Register(Axis): end ****/