BlueNinjaのセンサーの値を一通り取得する方法

# 初めに
BlueNinjaを使って、一通りのセンサーの値を取得してみましたので、わかりにくかったことを書いていきます。
[公式のドキュメント](http://blueninja.cerevo.com/ja/docs/reference/index.html)を読めば関数は簡単に見つけることができると思いますので、関数の詳細についてはそちらに譲り、ドキュメントからはわからない部分に焦点を当てていきます。
また、今回はUSBバスパワーで動作させたので、Bluetooth LE関連のことはよくわかっていません。
USBバスパワーで動作させる場合は、ブレイクアウトボード裏面のJ1端子をショートさせる必要があるのですが、今回購入したものはもとから半田でショートしてある状態でした。

# セットアップ
[公式のスターターガイド](http://blueninja.cerevo.com/ja/guide/index.html)にのっとっていけば終えられるはずです。
**ただし、TZ1000 BSPの入手には、ApP Lite Technical Centerへのユーザー登録が必要です。
さらに、BSPのダウンロード権を得るために書類にサインし、その画像をメールで送る必要があります。実際にダウンロード可能になるまで3~4営業日ほどかかります。**思い立ったら即実行とはいかないので予め手続きはしておきましょう。

# シリアル通信でPC上に情報出力
デフォルトで使われている`TZ01_console_puts()`関数を使えば、シリアル通信でのデータ送信ができます。
`TZ01_console_gets()`ならば受信ができます。
一文字ずつ送受信したいならば`TZ01_console_putc()`、`TZ01_console_getc()`を、文字や文字列としてでなくバイトデータとして送受信したい場合は`TZ01_console_write()`、`TZ01_console_read()`を使えばよいようです。
デフォルトのボーレートは9600bpsです。tz01_system_conf.hの`TZ01_CONSOLE_BAUD`をいじれば変更可能です。
PC側は手軽にシリアル通信できるものが数多くあると思うので、お好きなものをお使いください。

# 気圧センサーを使う
`TZ01_airpressure_press_read()`関数の返り値が気圧(単位はパスカル[Pa])となっています。天気予報などでよく聞くヘクトパスカル[hPa]は[Pa * 100]という意味なので、取得した値を100で割ればヘクトパスカルとなります。
定義はTZ01_airpressure.hにてされているので、インクルードする必要があります。
また、makeする際に、CDP_TZ01B_BSP.mkのSOURCES+=src/boards/CDP-TZ01B/TZ01_airpressure.cとSOURCES+=src/drivers/BMP280.c、TZ10xx_DFP.mkのSOURCES+=$(SDK_DIR)TOSHIBA.TZ10xx_DFP/RTE_Driver/I2C_TZ10xx.cの部分をコメントアウトする必要があります。

### サンプル
気圧を取得し、PCにシリアル通信で送信するには次のようにします。

```c:main.c
#include <stdio.h>
#include <string.h>
#include <stdbool.h>
#include <stdint.h>

#include "TZ01_system.h"
#include "TZ01_console.h"
#include "TZ01_airpressure.h"

#include "utils.h"

int main(void) {
    /* Initialize */
    TZ01_system_init();
    TZ01_console_init();
    TZ01_airpressure_init(); // 気圧センサーの初期化処理を忘れないこと
	
    TZ01_console_puts("Program start.\r\n");

    for (;;) {
    	char buff[64];
    	float pressure = TZ01_airpressure_press_read();
        
    	sprintf(buff, "current pressure: %f [Pa]\r\n", pressure);
    	TZ01_console_puts(buff);
    	
        if (TZ01_system_run() == RUNEVT_POWOFF) {
            /* Power off operation detected */
            break;
        }
    }

    TZ01_console_puts("Program terminated.\r\n");
    return 0;
}
```

```title:実行結果の一部
current pressure: 102783.765625 [Pa]
```

# 加速度、角加速度、地磁気センサーを使う
これらのデータをとれる関数はすべてTZ01_motion_tracker.hに定義されています。
加速度は`TZ01_motion_tracker_accel_read()`関数で、角加速度は`TZ01_motion_tracker_gyro_read()`関数で、地磁気は`TZ01_motion_tracker_magnetometer_read()`関数で取得できます。
こちらもmakeする際に.mkファイルの編集が必要で、CDP_TZ01B_BSP.mkのSOURCES+=src/boards/CDP-TZ01B/TZ01_motion_tracker.cとSOURCES+=src/drivers/MPU-9250.c、TZ10xx_DFP.mkのSOURCES+=$(SDK_DIR)TOSHIBA.TZ10xx_DFP/RTE_Driver/SPI_TZ10xx.cの部分をコメントアウトする必要があります。

### サンプル
加速度を取得し、PC側にシリアル通信で送信するには次のようにします。

```c:main.c
#include <stdio.h>
#include <string.h>
#include <stdbool.h>
#include <stdint.h>

#include "TZ01_system.h"
#include "TZ01_console.h"
#include "TZ01_motion_tracker.h"

#include "utils.h"

int main(void) {
    /* Initialize */
    TZ01_system_init();
    TZ01_console_init();
    TZ01_motion_tracker_init();
	
    for (;;) {
    	char buff[128];
    	uint16_t rx, ry, rz;
		float x, y, z;
    	
    	TZ01_motion_tracker_accel_read(&rx, &ry, &rz, &x, &y, &z); //ここを置き換えれば角加速度、地磁気も同様。
    	sprintf(buff, "a %d %d %d %f %f %f\n", rx, ry, rz, x, y, z);
    	TZ01_console_puts(buff);
    	
        if (TZ01_system_run() == RUNEVT_POWOFF) {
            /* Power off operation detected */
            break;
        }
    }

    TZ01_console_puts("Program terminated.\r\n");
    return 0;
}

```

```title:実行結果の一部
a 176 517 2020 0.085938 0.252441 0.986328
```

# 温度センサーを使う
TZ01_airpressure.hとTZ01_motion_tracker.hのどちらにも、温度を取得する関数は定義されています。
それぞれ、`TZ01_airpressure_temp_read()`、`TZ01_motion_tracker_temperature_read()`です。

### サンプル
温度を取得し、PC側にシリアル通信で送信するには次のようにします。

```c:main.c
#include <stdio.h>
#include <string.h>
#include <stdbool.h>
#include <stdint.h>

#include "TZ01_system.h"
#include "TZ01_console.h"
#include "TZ01_airpressure.h"
#include "TZ01_motion_tracker.h"

#include "utils.h"

int main(void)
{
    /* Initialize */
    TZ01_system_init();
    TZ01_console_init();
	TZ01_airpressure_init();
	TZ01_motion_tracker_init();

    for (;;) {
    	char buf[256];
    	float at = TZ01_airpressure_temp_read();
    	float rt, mt;
    	TZ01_motion_tracker_temperature_read(&rt, &mt);
    	
    	sprintf(buf, "accelerometer_temperature: %f\r\nmotion_tracker_temperature: %f %f\r\n", at, rt, mt);
    	TZ01_console_puts(buf);
        if (TZ01_system_run() == RUNEVT_POWOFF) {
            /* Power off operation detected */
            break;
        }
    }

    TZ01_console_puts("Program terminated.\r\n");
    return 0;
}

```

実行してみると、motion_tracker側のほうが1.35℃ほど高く表示されています。

```title:実行結果の一部
accelerometer_temperature: 28.240000
motion_tracker_temperature: 31331998.000000 29.608141
```