LoginSignup
8
11

More than 5 years have passed since last update.

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

Posted at

初めに

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

セットアップ

公式のスターターガイドにのっとっていけば終えられるはずです。
ただし、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にシリアル通信で送信するには次のようにします。

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;
}
実行結果の一部
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側にシリアル通信で送信するには次のようにします。

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;
}

実行結果の一部
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側にシリアル通信で送信するには次のようにします。

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℃ほど高く表示されています。

実行結果の一部
accelerometer_temperature: 28.240000
motion_tracker_temperature: 31331998.000000 29.608141
8
11
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
8
11