# MC3630 - 加速度センサー

SPIバスを用いた加速度センサーです。

{% hint style="warning" %}
ボードビヘイビア `<PAL_MOT>` `<PAL_NOTICE>` を読み込んだ時のみ使用可能です。`begin(), available()`以外の共通メソッドの手続きはボードビヘイビア中で実行されています。
{% endhint %}

## 動作の流れ

1. `.begin()`: センサーの動作開始
2. `PIN_SNS_INT`割り込み または `available()`: FIFOキューが規定数に達する
3. `.get_que()`: FIFOキューからのデータを取得する

## 動作に必要な手続き

### SPI バス

特にありません。

### スリープ手続き

PIN\_SNS\_INT割り込みによる起床を行うため、スリープ前に以下の設定行います。

```cpp
pinMode(PAL_MOT::PIN_SNS_INT, WAKE_FALLING);
```

### スリープ復帰時の手続き

`.wakeup()`メソッドの呼び出しが必要です。この処理は`<PAL_MOT>`ボードビヘイビア中で実行されています。

{% hint style="warning" %}
半導体内部のFIFOキューが一杯になっても読み出さなかった場合は、データ取得は終了し、新たな値は格納されません。
{% endhint %}

## データ構造

各サンプルは[`axis_xyzt`](https://mwx.twelite.info/v0.1.7/api-reference/classes/axis_xyzt)構造体を要素とするキュー[`smplque`](https://mwx.twelite.info/v0.1.7/api-reference/classes/smplque)に格納されます。メンバーx,y,zはそれぞれX,Y,Z軸に対応します。

```cpp
struct axis_xyzt {
  int16_t x;
  int16_t y;
  int16_t z;
  uint16_t t;
};
```

各軸の値は1Gを1000とした値として格納されます。`t`はサンプルの番号で`0`から順番にサンプルごとに割り振られます。

## メソッド

### read()

```cpp
uint8_t read()
```

半導体のFIFOキューからデータを読み出します。読みだしたバイト数が戻りますが`.get_que()`で参照するキューのサイズに格納されるデータ数を読み出すようにしてください。

{% hint style="warning" %}
スリープ復帰後に`<PAL_MOT>`では`read()`が行われます。
{% endhint %}

### get\_que()

```cpp
smplque<axis_xyzt>& get_que()
```

加速度のサンプルを取得します。キューは[`axis_xyzt`](https://mwx.twelite.info/v0.1.7/api-reference/classes/axis_xyzt)を要素とした[`smplque`](https://mwx.twelite.info/v0.1.7/api-reference/classes/smplque)です。availableになってから速やかにキューを空にする必要があります。

## 共通メソッド

### setup()

```cpp
void setup() 
```

このセンサーでは`setup()`を使用しません。

### begin(), end()

```cpp
void begin(uint32_t conf)
void end()
```

`conf`で指定した設定で初期化します。

`conf[0:15]`(bit0-15) : サンプリングモード、`conf[16:23]` (bit16-23): 加速度のレンジ、`conf[24:31]` (bit24-31) : 割り込み発生までのサンプル数を設定します。

| conf\[0:15] サンプルモード      | 内容                     |
| ------------------------ | ---------------------- |
| `MODE_LP_1HZ_UNOFFICIAL` | 1Hz Low Power (非公式設定)  |
| `MODE_LP_2HZ_UNOFFICIAL` | 2Hz Low Power (非公式設定)  |
| `MODE_LP_7HZ_UNOFFICIAL` | 7Hz Low Power (非公式設定)  |
| `MODE_LP_14HZ`           | 14Hz Low Power (デフォルト) |
| `MODE_LP_28HZ`           | 28Hz Low Power         |
| `MODE_LP_54HZ`           | 54Hz Low Power         |
| `MODE_LP_105HZ`          | 105Hz Low Power        |
| `MODE_LP_210HZ`          | 210Hz Low Power        |
| `MODE_LP_400HZ`          | 400Hz Low Power        |
| `MODE_ULP_25HZ`          | 25Hz Ultra Low Power   |
| `MODE_ULP_50HZ`          | 50Hz Ultra Low Power   |
| `MODE_ULP_100HZ`         | 100Hz Ultra Low Power  |
| `MODE_ULP_190HZ`         | 190Hz Ultra Low Power  |
| `MODE_ULP_380HZ`         | 380Hz Ultra Low Power  |

{% hint style="warning" %}
非公式設定はMC3630のデータシートに記述がないもので**設定時の動作は未定義**となります。お客様のほうでの動作確認の上利用下さい。非公式設定にかかわる問題やご質問について弊社サポートでは対応いたしかねます。
{% endhint %}

| conf\[16:23] 加速度レンジ   | 内容          |
| --------------------- | ----------- |
| `RANGE_PLUS_MINUS_8G` | ±8G (デフォルト) |
| `RANGE_PLUS_MINUS_4G` | ±4G         |
| `RANGE_PLUS_MINUS_2G` | ±2G         |
| `RANGE_PLUS_MINUS_1G` | ±1G         |

### process\_ev()

```cpp
void process_ev(uint32_t arg1, uint32_t arg2 = 0)
```

このセンサーでは`process_ev()`を使用しません。

### available()

```cpp
bool available()
```

センサーにデータが読み出され内部のキューにデータが保存されていると`true`を戻します。

### probe()

```cpp
bool probe()
```

このセンサーでは`probe()`は使用できません。

### wakeup()

```cpp
void wakeup()
```

スリープ復帰後のSPIバスの再初期化を行い、加速度データを読み出します。
