2017年3月10日金曜日

Arduino + ADXL345 で加速度センサを試してみた

概要

ADXL345 という加速度センサを Arduino の試してみました
ADXL345 は X, Y, Z 軸方向に対してどれくらい加速しているかを計測するための小型モジュールです

環境

ADXL345ライブラリ のインストール

http://wiki.androciti.com/download/SNS-1004/Adxl345.rar

からライブラリをダウンロードしてして解凍します
解凍してできた「Adxl345」を /path/to/Arduino/libraries/Adxl345 として配置します

インストールはこれで完了です

配線

Arduino と ADXL345 を配線しましょう
ADXL345 はピンヘッダがハンダづけされていないので、ハンダごてを使ってハンダしてください

配線の全体図は以下の通りです
arduino_with_adxl345_circuit.jpg

綺麗に写真が撮れたのでたぶん説明不要だと思いますが

  • Arduino Analog5 ピン -> ADXL345 SCL
  • Arduino Analog4 ピン -> ADXL345 SDA
  • Arduino 3.3V ピン -> ADXL345 VDD
  • Arduino GND ピン -> ADXL345 GND
  • ADXL345 GND -> ADXL345 SDO
  • ADXL345 VDD -> ADXL345 Vs

になります

スケッチ作成

配線できたらスケッチを作成しましょう
今回は ADXL345 ライブラリに付属しているサンプルをそのまま使います

#include <Wire.h>
#include <ADXL345.h>

ADXL345 adxl;

void setup(){
  Serial.begin(9600);
  adxl.powerOn();

  //set activity/ inactivity thresholds (0-255)
  adxl.setActivityThreshold(75); //62.5mg per increment
  adxl.setInactivityThreshold(75); //62.5mg per increment
  adxl.setTimeInactivity(10); // how many seconds of no activity is inactive?

  //look of activity movement on this axes - 1 == on; 0 == off 
  adxl.setActivityX(1);
  adxl.setActivityY(1);
  adxl.setActivityZ(1);

  //look of inactivity movement on this axes - 1 == on; 0 == off
  adxl.setInactivityX(1);
  adxl.setInactivityY(1);
  adxl.setInactivityZ(1);

  //look of tap movement on this axes - 1 == on; 0 == off
  adxl.setTapDetectionOnX(0);
  adxl.setTapDetectionOnY(0);
  adxl.setTapDetectionOnZ(1);

  //set values for what is a tap, and what is a double tap (0-255)
  adxl.setTapThreshold(50); //62.5mg per increment
  adxl.setTapDuration(15); //625μs per increment
  adxl.setDoubleTapLatency(80); //1.25ms per increment
  adxl.setDoubleTapWindow(200); //1.25ms per increment

  //set values for what is considered freefall (0-255)
  adxl.setFreeFallThreshold(7); //(5 - 9) recommended - 62.5mg per increment
  adxl.setFreeFallDuration(45); //(20 - 70) recommended - 5ms per increment

  //setting all interupts to take place on int pin 1
  //I had issues with int pin 2, was unable to reset it
  adxl.setInterruptMapping( ADXL345_INT_SINGLE_TAP_BIT,   ADXL345_INT1_PIN );
  adxl.setInterruptMapping( ADXL345_INT_DOUBLE_TAP_BIT,   ADXL345_INT1_PIN );
  adxl.setInterruptMapping( ADXL345_INT_FREE_FALL_BIT,    ADXL345_INT1_PIN );
  adxl.setInterruptMapping( ADXL345_INT_ACTIVITY_BIT,     ADXL345_INT1_PIN );
  adxl.setInterruptMapping( ADXL345_INT_INACTIVITY_BIT,   ADXL345_INT1_PIN );

  //register interupt actions - 1 == on; 0 == off  
  adxl.setInterrupt( ADXL345_INT_SINGLE_TAP_BIT, 1);
  adxl.setInterrupt( ADXL345_INT_DOUBLE_TAP_BIT, 1);
  adxl.setInterrupt( ADXL345_INT_FREE_FALL_BIT,  1);
  adxl.setInterrupt( ADXL345_INT_ACTIVITY_BIT,   1);
  adxl.setInterrupt( ADXL345_INT_INACTIVITY_BIT, 1);
}

void loop(){

  //Boring accelerometer stuff   
  int x,y,z;  
  adxl.readAccel(&x, &y, &z); //read the accelerometer values and store them in variables  x,y,z

  // Output x,y,z values - Commented out
  //Serial.print(x);
  //Serial.print(y);
  //Serial.println(z);


  //Fun Stuff!    
  //read interrupts source and look for triggerd actions

  //getInterruptSource clears all triggered actions after returning value
  //so do not call again until you need to recheck for triggered actions
   byte interrupts = adxl.getInterruptSource();

  // freefall
  if(adxl.triggered(interrupts, ADXL345_FREE_FALL)){
    Serial.println("Free-fall detected.");           //自由落下を検出しました。
    //add code here to do when freefall is sensed
  } 

  //inactivity
  if(adxl.triggered(interrupts, ADXL345_INACTIVITY)){
    Serial.println("No motion detected.");          //動きを検出しなかった。
     //add code here to do when inactivity is sensed
  }

  //activity
  if(adxl.triggered(interrupts, ADXL345_ACTIVITY)){
    Serial.println("Motion detected.");                 //動きを検出しました。
     //add code here to do when activity is sensed
  }

  //double tap
  if(adxl.triggered(interrupts, ADXL345_DOUBLE_TAP)){
    Serial.println("Double tap detected.");           //ダブルタップを検出しました。
     //add code here to do when a 2X tap is sensed
  }

  //tap
  if(adxl.triggered(interrupts, ADXL345_SINGLE_TAP)){
    Serial.println("Single tap detected.");            //シングルタップを検出しました。
     //add code here to do when a tap is sensed
  }  
}

ファイル -> スケッチの例 -> Adxl345 -> ADXL345_Example

にあるものをそのまま使っています
不要なコメントは削除しています

あとはコンパイルして Arduino に書き込みましょう

動作確認

シリアルモニタを開いてスケッチを書き込みましょう
ブレッドボードを持ち上げて動かしてみると以下のような感じでシリアルモニタに表示されると思います
arduino_with_adxl345_serial.png

Single tap, Double tap はブレッドボードをコンコンと叩けば検出されます
Motion detected と No Motion detected はどの方向でもいいので動かしたり止めたりすれば簡単に出ると思います

一番出すのが難しいのが Free-fall detected. でした
ADXL345 のボード上に軸の方向が書いているのですが、 Y 軸方向に勢いよく加速すると発生させることができます
読んで字のごとく自由落下を検知しているかどうかなので、配線している Arduino とブレッドボードがある状態だと中々に難しいです

最後に

加速度センサを Arduino で試してみました
同じように角速度センサ(ジャイロセンサ)も試してみたいなと思っています

参考サイト

0 件のコメント:

コメントを投稿