So-net無料ブログ作成
検索選択

Arduino で3軸加速度センサーを試してみた! [Arduino]

Arduino で3軸加速度センサーを試してみました。今回試してみたのはSTマイクロの『LIS3DH』です。(ハンダ付けが少し雑になってしまいました。。^^;)

0_LIS3DH.JPG

LIS3DH』は、3.3V駆動でI2C/SPIの両対応になっています。今回はSPIを使ってArduinoと接続してみます。

1_LIS3DH.JPG


ArduinoのSPIライブラリはデジタルポートの10~13番ピンを使います。10番ピン以外は、ArduinoのSPI Library の中で定義されています。Arduino側のデータIN/OUTとLIS3DH側のIN/OUTを対応させるために結線がクロスしているところに注意してください。

2_SPI connection.png


ただ、この加速度センサーは3.3V駆動である一方、Arduino は5V駆動なので、途中にロジックレベル変換ICを通す必要があります。

加速度センサーSPI.png


実際に結線をしてみたのがこちらです。今までのセンサー類に比べると少し複雑です。。。

DSC03909.JPG


結線を拡大してみました。接続図とジャンパー線の色は分かりやすいように対応しています。

DSC03907.JPG


さて、問題はスケッチです。LIS3DHを動かすにあたり、こちらのサイトがとても参考になりました。

最初にプログラムからSPIインターフェースをセットアップをします。代表的な手順は下記のようになります。

pinMode(CS, OUTPUT); // CSピンを指定
SPI.begin();
SPI.setBitOrder(LSBFIRST or MSBFIRST);
SPI.setDataMode(SPI_MODE0~3);
SPI.setClockDivider(SPI_CLOCK_DIV2~128);


さて、問題は、setBitOrder、setDataMode、setClockDivider のパラメータに何を設定するかです。この設定はデバイスのデータシートを見る必要があります。LIS3DHのデータシートを見てみましょう。

まずは、setBitOrder

5_SPI Timing MSB.png

このタイミングチャートを見れば分かるようにビットの高いほうから出力されています。なので、MSBFIRSTを指定します。


次に、setDataMode。各モードの定義は次のようになっています。

6_setDataMode.png

う~ん、よく分かりませんねぇ。いろいろ探していたら、SPIEEPROMのページに分かりやすい解説が書いてありました。CPOL、CPHAに注目してください。

8_SPI control register.png

CPOLは、SPIのクロックが動作していないときHIGHなのかLOWなのか。CPHAは、立ち上がりエッジで処理するか、立下りエッジで処理するかを選択します。

もう一度、データシートに着目しましょう。クロックが動作していない時は信号はHIGHになっています。データは明らかに立下りエッジで処理をしています。なので、SPI_MODE3ということになります。

7_SPI Timing Mode.png


最後は、setClockDividerです。
これはSPI通信のクロックを指定します。再びデータシートを見てみます。LIS3DHのSPIクロックは最大10MHz となっています。

9_SPI clock timing LIS3DH.png

Arduinoは16MHzですので、そのままデータを出力するとオーバクロックになります。なので半分の8MHzに設定するために、2分周する SPI_CLOCK_DIV2 を選択します。

LIS3DH は省電力設計になっており、設定しないと Power Down モードになっています。そのためSPIを通じてPower Down をオフする必要があります。それを設定するのが、CTRL_REG1です。今回は、Normalモードで10Hzで測定を行うことにします。値は0x27を指定します。

a_CTRL_REG1.png

SPIのRead/Write プロトコルもデータシートで確認しましょう。

Read プロトコルは下記のようになっています。

b_SPI read protocol.png

最上位ビットは必ず"1"です。今回はマルチバイトのデータは使わないので、2ビット目は常に"0"になります。

Writeプロトコルは下記のようになります。

c_SPI write protocol.png

最上位ビットは必ず"0"です。Readプロトコル同様2ビット目は常に"0"です。スケッチを書くにあたってこの点は念頭においておきましょう。

X, Y, Z 軸の値を取得するには、下記のレジスタを使って読み込みます。

d_XYZ.png

能書きが長くなってしまいました。それではスケッチをお見せしましょう。

sketch_for_LIS3DH_with_SPI.png


なぜかCTRL_REG1 をLoopの度に設定しないと、リセット後値が正しくXYZの値が読めないことがありました。なにか問題があるのかも知れません。どなたかご指摘いただけると助かります。

それでは実験してみましょう。こんな感じで傾けて測定してみました。これは左傾斜になります。

DSC03908.JPG


取得できた値をグラフにしてみました。どうやら正しく動作しているようです。

g_result.png


プロトコルが絡むとやはり説明が複雑になってしまいますね。今回はSPIで試してみましたが、デジタルポートを四つも使ってしまうのはもったいないです。次はこれをI2Cで試してみたいと思います。それでは~。
(^_^)/~


関連記事
Arduino 3軸加速度センサーのI2C接続うまく行きましたー
http://makers-with-myson.blog.so-net.ne.jp/2014-03-16

Arduino 3軸加速度センサーで大ハマリ中。。
http://makers-with-myson.blog.so-net.ne.jp/2014-03-15


※8ビット双方向ロジックレベル変換回路を加えた図を差し替え・追加ました。(2016.4.10)





Arduinoをはじめよう 第2版 (Make:PROJECTS)

Arduinoをはじめよう 第2版 (Make:PROJECTS)

  • 作者: Massimo Banzi
  • 出版社/メーカー: オライリージャパン
  • 発売日: 2012/03/16
  • メディア: 単行本(ソフトカバー)



Arduinoをはじめようキット

Arduinoをはじめようキット

  • 出版社/メーカー: スイッチサイエンス
  • メディア: エレクトロニクス



MMA7455使用 I2C/SPI 三軸デジタル加速度センサ モジュール 3.3V

MMA7455使用 I2C/SPI 三軸デジタル加速度センサ モジュール 3.3V

  • 出版社/メーカー: OEM
  • メディア: エレクトロニクス




nice!(33)  コメント(0)  トラックバック(0) 
共通テーマ:趣味・カルチャー

nice! 33

コメント 0

コメントを書く

お名前:
URL:
コメント:
画像認証:
下の画像に表示されている文字を入力してください。

トラックバック 0

この記事のトラックバックURL: