3軸加速度センサー ADXL345をArduinoから制御する(I2C)


# ADXL345

![Analog_Devices-ADXL345BCCZ-image.jpg](https://qiita-image-store.s3.amazonaws.com/0/63450/51590796-d31d-15fd-f894-9fb882bf49f7.jpeg)


# Datasheet

[Datasheet](http://www.analog.com/media/en/technical-documentation/data-sheets/ADXL345.PDF)

# 計測可能な値

| 種類 | 概要 |
|:--|:--|
| 加速度 | 3軸、±2g / ±4g / ±8g / ±16g(最大13ビットの分解能まで対応) |
| タップ | シングルタップ／ダブル・タップを検出 | 
| フリー・フェール | 端末の自由落下を検出 | 
| アクティブ／インアクティブ | 加速度の有無と現在の加速度がユーザー設定可能な閾値以上か、もしくは以下であるかを検出 |


# Slave address

| Slave Address | 0x53 |
|:--|:--|

# Register map

| Address | Name | Type | Default |概要 |
|:--|:--|:--|:--|:--|
| 0x00 | DEVID | R | 11100101 | Device ID |
| 0x1D | THRESH_TAP | R/W | 00000000 | タップしきい値 |
| 0x1E | OFSX | R/W | 00000000 | X-axisオフセット |
| 0x1F | OFSY | R/W | 00000000 | Y-axisオフセット |
| 0x20 | OFSZ | R/W | 00000000 | Z-axisオフセット |
| 0x21 | DUR | R/W | 00000000 | タップ持続時間 |
| 0x22 | Latent | R/W | 00000000 | タップ待ち時間 |
| 0x23 | Window | R/W | 00000000 | タップWindow |
| 0x24 | THRESH_ACT | R/W | 00000000 | Activityしきい値 |
| 0x25 | THRESH_INACT | R/W | 00000000 | Inactivityしきい値 |
| 0x26 | TIME_INACT | R/W | 00000000 | Inactivity time |
| 0x27 | ACT_INACT_CTL | R/W | 00000000 | Axis enable control for activity and inactivity detection |
| 0x28 | THRESH_FF | R/W | 00000000 | Free-fallしきい値 |
| 0x29 | TIME_FF | R/W | 00000000 | Free-fall time |
| 0x2A | TAP_AXES | R/W | 00000000 | シングル・ダブルタップの軸別の設定　 |
| 0x2B | ACT_TAP_STATUS | R | 00000000 | シングル・バブルタップのソース |
| 0x2C | BW_RATE | R/W | 00001010 | データレートとパワーモード操作 |
| 0x2D | POWER_CTL | R/W | 00000000 | パワーセービング機能の操作 |
| 0x2E | INT_ENABLE | R/W | 00000000 | 割り込みを有効にする操作 |
| 0x2F | INT_MAP | R/W | 00000000 | Interrupt mapping control |
| 0x30 | INT_SOURCE | R | 00000010 | Source of interrupts |
| 0x31 | DATA_FORMAT | R/W | 00000000 | データフォーマット操作 |
| 0x32 | DATAX0 | R | 00000000 | X-Axis Data 0(LSB) |
| 0x33 | DATAX1 | R | 00000000 | X-Axis Data 1(MSB) |
| 0x34 | DATAY0 | R | 00000000 | Y-Axis Data 0(LSB) |
| 0x35 | DATAY1 | R | 00000000 | Y-Axis Data 1(MSB) |
| 0x36 | DATAZ0 | R | 00000000 | Z-Axis Data 0(LSB) |
| 0x37 | DATAZ1 | R | 00000000 | Z-Axis Data 1(MSB) | 
| 0x38 | FIFO_CTL | R/W | 00000000 | FIFO control |
| 0x39 | FIFO_STATUS | R | 00000000 | FIFO status |

# Who_am_i

| DEVID | 0x00 |
|:--|:--|

AXDL345の場合、0x5eが返ってくる。

```cpp:arduino
#define ADXL345_WHO_AM_I 0x00
#define ADXL345_DEVICE 0x32

bool searchDevice()
{
  byte device = 0x00;
  readI2c(ADXL345_WHO_AM_I, 1, &device);

  if(device == ADXL345_DEVICE){
      return true;
  } else{
      return false;
  }
}
```

# Configuration

| DATA_FORMAT | 0x31 |
|:--|:--|

Data Formatでは、

- SELF_TEST
- SPI 
- INT_INVERT 
- FULL_RES 
- Justify 
- Range

の設定ができる。

| Bit7 | Bit6 | Bit5 | Bit4 | Bit3 | Bit2 | Bit1 | Bit0 |
|:--|:--|:--|:--|:--|:--|:--|:--|
| SELF_TEST | SPI| INT_INVERT | 0 | FULL_RES | Justify| Range | Range |

Range 設定

| Bit1 | Bit0 | g Range |
|:--|:--|:--|
| 0 | 0 | ±2 g |
| 0 | 1 | ±4 g |
| 1 | 0 | ±8 g |
| 1 | 1 | ±16 g |

# PowerOn

| POWER_CTL | 0x2D |
|:--|:--|


Power Controlでは

- Link 
- AUTO_SLEEP 
- Measure 
- Sleep Wakeup

の設定ができる。MeasureにBitを立てると、計測が開始される。


| Bit7 | Bit6 | Bit5 | Bit4 | Bit3 | Bit2 | Bit1 | Bit0 |
|:--|:--|:--|:--|:--|:--|:--|:--|
| 0 | 0 | Link | AUTO_SLEEP  | AUTO_SLEEP  | Measure | Sleep Wakeup | Sleep Wakeup |


Sleep Mode有効時の読み込み周期

| Bit1 | Bit0 | Frequency (Hz) |
|:--|:--|:--|
| 0 | 0 | 8 (Hz) |
| 0 | 1 | 4 (Hz) |
| 1 | 0 | 2 (Hz) |
| 1 | 1 | 1 (Hz) |


# 加速度

| Type | Address |
|:--|:--|
| DATAX0 | 0x32 |
| DATAX1 | 0x33 |
| DATAY0 | 0x34 |
| DATAY1 | 0x35 |
| DATAZ0 | 0x36 |
| DATAZ1 | 0x37 |


# シングルタップとダブルタップ

## 設定

| Type | Address |
|:--|:--|
| THRESH_TAP| 0x1D |
| DUR | 0x21 |
| LATENT | 0x22 |
| WINDOW | 0x21 |

シングルタップは、

- THRESH_TAPレジスト(TAPの強さのしきい値)
- DURレジスタ(TAPの持続時間)

の値を設定する必要がある。

ダブルタップは、

- THRESH_TAPレジスト(TAPの強さのしきい値)
- DURレジスタ(TAPの持続時間)
- LATENTレジスタ(識別間隔)
- WINDOWレジスタ(識別間隔の期限切れから新しい認識を始めるまでの間隔)

の値を設定する必要がある。

| NAME | Address | 値の意味 |
|:--|:--|:--|
| THRESH_TAP | 0x1D | 1単位は62.5 mg/LSB, 0xFFを設定すると16g。0にすると識別できない。 |
| DUR | 0x21 | 1単位は625 µs/LSB。0にすると識別できない。 |
| LATENT | 0x22 | 単位は、 1.25 ms/LSB。0にするとダブルタップが識別できなくなる。0xFFを設定すると320ms/LSB。 |
| WINDOW | 0x23 | 単位は、 1.25 ms/LSB。0にするとダブルタップが識別できなくなる。 0xFFを設定すると320ms/LSB。|

## 計測

| INT_SOURCE | 0x30 |
|:--|:--|

Tapの状態の取得は、Interrupts Sourceから取得する。

| Bit7 | Bit6 | Bit5 | Bit4 | Bit3 | Bit2 | Bit1 | Bit0 |
|:--|:--|:--|:--|:--|:--|:--|:--|
| DATA_READY | SINGLE_TAG | DOUBLE_TAP | Activity | Inactivity | FREE_FALL | Watermark | Overrun |