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 ****/