2013/04/29

Raspberry Pi で3軸加速度センサを使ってみたけれど・・・

 I2C接続で使える3軸加速度センサMMA8451Qを使ってみました・・・が,結果は芳しくありません^^;このセンサは,各軸の加速度データを14 bitまたは8 bitで取得できるはずなのですが,なぜか8 bit分しか取得できないのです・・・。
MMA8451Q
 使用した基板はStrawberry Linuxの8ピンDIPモジュール。MMA8451Qと電源まわりのコンデンサ等が実装されたものです。I2C接続でなるべく小さな基板を探した結果,これを選びました。


 単に3軸の加速度を計測できるだけでよかったのですが,MMA8451Qはデジタル出力ならではの機能が多く用意されています(FIFO,ハイパスフィルタ,オーバーサンプリング,方向検出,など)。データシート・マニュアルは下記リンクで見ることができます。一部,日本語のドキュメントもありますが,肝心のデータシートは英語のみ。しかも多機能なのでページ多めです。


 適当なレジスタを読めば簡単にデータが取れるだろうと思っていたのですが,なぜか値は0xFFから変化せず。頼みの綱のデータシートは読めなかった読む気力が起きなかったので,色々検索してみるも日本語の情報はほとんど見つからず・・・。
 唯一分かったのは,データレジスタはブロック転送でないと読めないということでした。これで一応データは取れましたが,なぜか14 bitモードでも8 bit分のデータレジスタしか更新されません。どうやら英語データシートを頭から読まないといけない雰囲気です。
・・・
・・


まあ8 bitでもいいですよね!

 以下のプログラムで動作確認しました。AdafruitのI2C Classを使いました。
 一応データレジスタは読めますが,ブロック転送した最初のデータが必ず0xFFになり,その後にX軸,Y軸,Z軸の加速度が続きます。

MMA8451データ取得サンプル
#!/usr/bin/python

import time
from Adafruit_I2C import Adafruit_I2C

i2c = None

# Registers
STATUS = 0x00
OUT_X_MSB = 0x01
CTRL_REG1 = 0x2A
XYZ_DATA_CFG = 0x0E

i2c = Adafruit_I2C(0x1c)

# CTRL_REG Reset, StandbyMode
i2c.write8(CTRL_REG1, 0x00)

# FullScaleRange
i2c.write8(XYZ_DATA_CFG, 0x00)  # 2g
#i2c.write8(XYZ_DATA_CFG, 0x01)  # 4g
#i2c.write8(XYZ_DATA_CFG, 0x02)  # 8g

# ODR=100Hz, FastRead(8bit), ActiveMode
i2c.write8(CTRL_REG1, 0x1B)

# Read Data
while(True) :
  block = i2c.readList(OUT_X_MSB,4)
  for data in block:
    print "%5d" % data ,
  print ""
  time.sleep(0.1)


 一応計測はできたので,しばらくはこのまま放置です^^;

2 件のコメント:

  1. ソースコードを探してここにたどり着きました.
    ありがとうございます.
    私も四苦八苦して色々と試しているところなのですが,0x1bを0x3dにすれば14bitモード読めないですかね?(私の環境では8bitですらへんてこな値になるので,あっているかどうかよくわからないので買い直そうと思っているところなのですが・・・)
    初心者ですので,的外れなことを言っていたらすみません.

    返信削除
  2. あ,もちろん0x1dとかでもいいと思います.(私の環境ではx方向の加速度が変な値が出るのでそれで正しいか確証を持っていないのですが)

    返信削除