Arduino で3軸加速度センサーを試してみた! [Arduino]
Arduino で3軸加速度センサーを試してみました。今回試してみたのはSTマイクロの『LIS3DH』です。(ハンダ付けが少し雑になってしまいました。。^^;)
『LIS3DH』は、3.3V駆動でI2C/SPIの両対応になっています。今回はSPIを使ってArduinoと接続してみます。
ArduinoのSPIライブラリはデジタルポートの10~13番ピンを使います。10番ピン以外は、ArduinoのSPI Library の中で定義されています。Arduino側のデータIN/OUTとLIS3DH側のIN/OUTを対応させるために結線がクロスしているところに注意してください。
ただ、この加速度センサーは3.3V駆動である一方、Arduino は5V駆動なので、途中にロジックレベル変換ICを通す必要があります。
実際に結線をしてみたのがこちらです。今までのセンサー類に比べると少し複雑です。。。
結線を拡大してみました。接続図とジャンパー線の色は分かりやすいように対応しています。
さて、問題はスケッチです。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。
このタイミングチャートを見れば分かるようにビットの高いほうから出力されています。なので、MSBFIRSTを指定します。
次に、setDataMode。各モードの定義は次のようになっています。
う~ん、よく分かりませんねぇ。いろいろ探していたら、SPIEEPROMのページに分かりやすい解説が書いてありました。CPOL、CPHAに注目してください。
CPOLは、SPIのクロックが動作していないときHIGHなのかLOWなのか。CPHAは、立ち上がりエッジで処理するか、立下りエッジで処理するかを選択します。
もう一度、データシートに着目しましょう。クロックが動作していない時は信号はHIGHになっています。データは明らかに立下りエッジで処理をしています。なので、SPI_MODE3ということになります。
最後は、setClockDividerです。
これはSPI通信のクロックを指定します。再びデータシートを見てみます。LIS3DHのSPIクロックは最大10MHz となっています。
Arduinoは16MHzですので、そのままデータを出力するとオーバクロックになります。なので半分の8MHzに設定するために、2分周する SPI_CLOCK_DIV2 を選択します。
LIS3DH は省電力設計になっており、設定しないと Power Down モードになっています。そのためSPIを通じてPower Down をオフする必要があります。それを設定するのが、CTRL_REG1です。今回は、Normalモードで10Hzで測定を行うことにします。値は0x27を指定します。
SPIのRead/Write プロトコルもデータシートで確認しましょう。
Read プロトコルは下記のようになっています。
最上位ビットは必ず"1"です。今回はマルチバイトのデータは使わないので、2ビット目は常に"0"になります。
Writeプロトコルは下記のようになります。
最上位ビットは必ず"0"です。Readプロトコル同様2ビット目は常に"0"です。スケッチを書くにあたってこの点は念頭においておきましょう。
X, Y, Z 軸の値を取得するには、下記のレジスタを使って読み込みます。
能書きが長くなってしまいました。それではスケッチをお見せしましょう。
なぜかCTRL_REG1 をLoopの度に設定しないと、リセット後値が正しくXYZの値が読めないことがありました。なにか問題があるのかも知れません。どなたかご指摘いただけると助かります。
それでは実験してみましょう。こんな感じで傾けて測定してみました。これは左傾斜になります。
取得できた値をグラフにしてみました。どうやら正しく動作しているようです。
プロトコルが絡むとやはり説明が複雑になってしまいますね。今回は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)
『LIS3DH』は、3.3V駆動でI2C/SPIの両対応になっています。今回はSPIを使ってArduinoと接続してみます。
ArduinoのSPIライブラリはデジタルポートの10~13番ピンを使います。10番ピン以外は、ArduinoのSPI Library の中で定義されています。Arduino側のデータIN/OUTとLIS3DH側のIN/OUTを対応させるために結線がクロスしているところに注意してください。
ただ、この加速度センサーは3.3V駆動である一方、Arduino は5V駆動なので、途中にロジックレベル変換ICを通す必要があります。
実際に結線をしてみたのがこちらです。今までのセンサー類に比べると少し複雑です。。。
結線を拡大してみました。接続図とジャンパー線の色は分かりやすいように対応しています。
さて、問題はスケッチです。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。
このタイミングチャートを見れば分かるようにビットの高いほうから出力されています。なので、MSBFIRSTを指定します。
次に、setDataMode。各モードの定義は次のようになっています。
う~ん、よく分かりませんねぇ。いろいろ探していたら、SPIEEPROMのページに分かりやすい解説が書いてありました。CPOL、CPHAに注目してください。
CPOLは、SPIのクロックが動作していないときHIGHなのかLOWなのか。CPHAは、立ち上がりエッジで処理するか、立下りエッジで処理するかを選択します。
もう一度、データシートに着目しましょう。クロックが動作していない時は信号はHIGHになっています。データは明らかに立下りエッジで処理をしています。なので、SPI_MODE3ということになります。
最後は、setClockDividerです。
これはSPI通信のクロックを指定します。再びデータシートを見てみます。LIS3DHのSPIクロックは最大10MHz となっています。
Arduinoは16MHzですので、そのままデータを出力するとオーバクロックになります。なので半分の8MHzに設定するために、2分周する SPI_CLOCK_DIV2 を選択します。
LIS3DH は省電力設計になっており、設定しないと Power Down モードになっています。そのためSPIを通じてPower Down をオフする必要があります。それを設定するのが、CTRL_REG1です。今回は、Normalモードで10Hzで測定を行うことにします。値は0x27を指定します。
SPIのRead/Write プロトコルもデータシートで確認しましょう。
Read プロトコルは下記のようになっています。
最上位ビットは必ず"1"です。今回はマルチバイトのデータは使わないので、2ビット目は常に"0"になります。
Writeプロトコルは下記のようになります。
最上位ビットは必ず"0"です。Readプロトコル同様2ビット目は常に"0"です。スケッチを書くにあたってこの点は念頭においておきましょう。
X, Y, Z 軸の値を取得するには、下記のレジスタを使って読み込みます。
能書きが長くなってしまいました。それではスケッチをお見せしましょう。
なぜかCTRL_REG1 をLoopの度に設定しないと、リセット後値が正しくXYZの値が読めないことがありました。なにか問題があるのかも知れません。どなたかご指摘いただけると助かります。
それでは実験してみましょう。こんな感じで傾けて測定してみました。これは左傾斜になります。
取得できた値をグラフにしてみました。どうやら正しく動作しているようです。
プロトコルが絡むとやはり説明が複雑になってしまいますね。今回は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)
- 作者: Massimo Banzi
- 出版社/メーカー: オライリージャパン
- 発売日: 2012/03/16
- メディア: 単行本(ソフトカバー)
MMA7455使用 I2C/SPI 三軸デジタル加速度センサ モジュール 3.3V
- 出版社/メーカー: OEM
- メディア: エレクトロニクス
コメント 0