内蔵センサー

概要

本製品には内蔵センサーとして加速度センサーとジャイロセンサーを搭載しています。ここでは内蔵センサーをレシピ言語から制御する方法を紹介します。

内蔵センサー機能の特徴

内蔵センサーである加速度センサーとジャイロセンサーの機能の特徴を以下に示します。

加速センサー

加速度センサー機能の特徴

加速度センサーはX,Y,Zの3軸あります。加速度センサーは端末が動いた瞬時的な値に加えて、常に重力方向に力を受けていることにより傾きの値の変化で端末の姿勢が分かります。

ACC_axis


加速度センサーの制御API

加速度センサーを制御するAPIは以下があります。

API 内容
1 ACC_SetDeviceMeasure() パフォーマンスモードとODRを変更する
2 ACC_SetDeviceRange ダイナミックレンジを変更する
3 ACC_GetDataOneShot() 加速度センサー測定値を一回取得する
4 ACC_StartPolling() 加速度センサー測定値を周期取得する

ACC_SetDeviceMeasure()

加速度センサーのパフォーマンスモードとODRを変更するAPIです。

ACC_SetDeviceMeasure(int8 performance, int8 odr) 
    performance : パフォーマンスモード
        ACC_LOW_PERF : Lowパフォーマンス
        ACC_HIGH_PERF : Highパフォーマンス  推奨
    odr : 動作周波数
        ACC_ODR1_002Hz : 2Hz
        ACC_ODR2_013Hz : 13Hz
        ACC_ODR3_026Hz : 26Hz
        ACC_ODR4_052Hz : 52Hz
        ACC_ODR5_104Hz : 104Hz
        ACC_ODR6_208Hz : 208Hz
        ODRを複数タスクから指定した場合は最も高い設定値が適用されます

加速度センサーのパフォーマンスモードはHighパフォーマンスに設定することを推奨します。Highパフォーマンスモードに設定することにより内部のノイズフィルターが働きます。Lowパフォーマンスはセンサーの消費電流を0.2mA減らすことが出来ますが、ACアダプタ駆動の環境下ではHighパフォーマンスモード固定でのご利用が適しています。

odrは加速度センサーの内部の測定周期となります。プログラムで取得したい周期以上の設定が必要となります。例えば10ms毎に加速度センサーの値を取得しようとした場合は104Hz以上を指定する必要があります。

ACC_SetDeviceRange()

加速度センサーのダイナミックレンジを変更するAPIです。

ACC_SetDeviceRange(uint8 range)
    range       : ダイナミックレンジの種類
         ACC_DRANGE_2  = 1 :±2[G]
         ACC_DRANGE_4  = 2 :±4[G]
         ACC_DRANGE_8  = 4 :±8[G] 
         ACC_DRANGE_16 = 8 :±16[G]

    ダイナミックレンジは最新の設置値のみが有効になります
        ダイナミックレンジは動的に変更は出来ないため
        ACC_GetDataOneShot(),ACC_StartPolling()で測定を開始していない
        間のみ変更が可能となります

ACC_GetDataOneShot()

加速度センサーの動作を開始し測定したデータを1回取得するAPIです。
周期取得動作は行いません。
重力方向を検出して傾きや姿勢を知る場合などにこのAPIが有用です。

ACC_GetDataOneShot(uint8 sync, int32 timeout, int32 interval)
    sync       : 同期/非同期
        同期     EAPI_SYNC_RESULT
        非同期   イベントID <1254>
    timeout    : タイムアウト値 [msec]
    interval   : 何秒後に測定値を取得するか [msec]

    timeoutは同期実行時に指定時間データが取得出来なかった場合に
     APIからコンテキストが戻ります非同期実行時は値に意味は持ちません
    timeout > intervalで値を設定する必要があります

APIの同期/非同期の動作

APIは同期及び非同期で実行することが出来ます。同期実行の場合はセンサーの値が取得出来るまでコンテキストがAPIに移ります。この場合APIから処理が戻って来たタイミングで値が取得出来るので、一連の流れとして処理を記述する時に有用です。非同期での実行の場合は、値が取得出来たタイミングでイベントが発生しますので、タスクの処理と並列で値の取得を行いたいケースに有用です。

ACC同期/非同期


加速度センサーの値の取り方

加速度センサーの値は、タスク間のデータ引継ぎ用メモリに格納されています。
APIのrcplib_TASK_GetArg()を利用して取り出します。

メモリの番号 説明
rcplib_TASK_GetArg(0) int32 レジスタのX軸値 <-32768~+32767>
rcplib_TASK_GetArg(1) int32 レジスタのY軸値 <-32768~+32767>
rcplib_TASK_GetArg(2) int32 レジスタのZ軸値 <-32768~+32767>
rcplib_TASK_GetArg(3) float 重力加速度のX軸値 [mG]<-16000~+16000>
rcplib_TASK_GetArg(4) float 重力加速度のY軸値 [mG]<-16000~+16000>
rcplib_TASK_GetArg(5) float 重力加速度のZ軸値 [mG]<-16000~+16000>

※レジスタの軸値はセンサーICの出力するレジスタ値がそのまま入ります。
 重力加速度はセンサータスクでmGに単位変換した値が入ります。


同期実行のコード例
#incliude "sensorAPI.h"
   
func any_func() {
    // センサーデータを格納するための変数定義
    int16 acc_x; int16 acc_y; int16 acc_z;
    float acc_f_x; float acc_f_y; float acc_f_z;

    // timeout設定 1000[msec], 値を取得までの時間 100[msec]指定で一回取得する
    ACC_GetDataOneShot(EAPI_SYNC_RESULT, 1000, 100);

    // APIが終了した後、以下でデータを取得出来ます。
    acc_x = rcplib_TASK_GetArg(0);
    acc_y = rcplib_TASK_GetArg(1);
    acc_z = rcplib_TASK_GetArg(2);
    acc_f_x = rcplib_TASK_GetArg(3);
    acc_f_y = rcplib_TASK_GetArg(4);
    acc_f_z = rcplib_TASK_GetArg(5);

    return(0);
}

ACC_StartPolling()

加速度センサー測定を周期的に開始するAPIです。

ACC_StartPolling(int32 interval, uint8 notify_event_id)
    interval : イベント通知周期 [msec]
        0      : 通知停止
        10以上 : 通知周期 <msec> 
    notyfy_event_id : 通知イベントID

    通知周期の最小値
     Highパフォーマンスモード時10[msec]
     Lowパフォーマンスモード時45[msec]
     ジャイロセンサーと両方を方利用する場合90[msec]

このAPIは非同期実行のAPIとなります。このためAPI実行など後に指定した周期毎に取得した値を通知するイベントが発生します。

ACC_Polling


加速度センサーの値の取り方

イベント発生後に取得したデータを取り出せます。
データの取得方法は、上記[ACC_GetDataOneShot()]の説明を参照ください。


周期取得のコード例
#incliude "sensorAPI.h"
   
// 内部非同期イベント
#define UNSYNC_EVENT_INIT 0
#define UNSYNC_EVENT_ACC_POLL 1
   
// mainループ処理
void main_loop() {
   
// 周期取得イベントの処理
    else if(event_id == UNSYNC_EVENT_ACC_POLL) {
        event_acc_poll(rcplib_TASK_GetArg(0), rcplib_TASK_GetArg(1),
                       rcplib_TASK_GetArg(2), rcplib_TASK_GetArg(3),
                       rcplib_TASK_GetArg(4), rcplib_TASK_GetArg(5));
    }
   
}

func any_func() {
    // 取得周期1000[msec], イベント通知番号1として開始する。
    ACC_StartPolling(1000, UNSYNC_EVENT_ACC_POLL);
    return(0);
}

// 周期取得イベントの処理
func event_acc_poll(int16 acc_x, int16 acc_y, int16 acc_z, float acc_f_x, float acc_f_y, float acc_f_z) {
   // 加速度センサーのデータは各種引数(acc_x~acc_f_z)から取得可能
   
    return(0);
}
周期取得停止のコード例
#incliude "sensorAPI.h"
   
func any_func() {
    // 周期取得を停止する
    ACC_StartPolling(0, 0);

    return(0);
}

複数タスクから利用時の注意事項

加速度センサーは複数のタスクから利用できますが、モードや動作条件の有効値は1つのみです。よって下記の優先度で動作します。

※加速度センサーが稼動している場合は、ダイナミックレンジ設定の変更はできません。


ジャイロセンサー

ジャイロセンサー機能の特徴

搭載しているジャイロセンサーはX,Y,Zの3軸があります。ジャイロセンサーは静止しているときは値は動かず、デバイスの回転を検出するとその瞬時的な値を出力します。これにより、端末がどの方向に回転したかが分かります。

GYR_axis


ジャイロセンサーの制御API

ジャイロセンサーを制御するAPIは以下があります。

API 内容
1 GYR_SetDeviceMeasure() パフォーマンスモード、ODRを変更する
2 GYR_SetDeviceRange ダイナミックレンジを変更する
3 GYR_GetDataOneshot() ジャイロセンサー測定値を一回取得する
4 GYR_StartPolling() ジャイロセンサー測定値を周期取得する

GYR_SetDeviceMeasure()

ジャイロセンサーのパフォーマンスモードを変更するAPIです。

GYR_SetDeviceMeasure(int8 performance, int8 odr)
    performance : パフォーマンスモード
        GYR_LOW_PERF : Lowパフォーマンス
        GYR_HIGH_PERF : Highパフォーマンス  推奨
    odr : 動作周波数
        GYRO_ODR1_013Hz : 13Hz
        GYRO_ODR2_026Hz : 26Hz
        GYRO_ODR3_052Hz : 52Hz
        GYRO_ODR4_104Hz : 104Hz
        GYRO_ODR5_208Hz : 208Hz
        ODRを複数タスクから指定した場合は最も高い設定値が適用されます

ジャイロセンサーのパフォーマンスモードはHighパフォーマンスに設定することを推奨します。Highパフォーマンスモードに設定することにより内部のノイズフィルターが働きます。Lowパフォーマンスはセンサーの消費電流を0.1mA減らすことが出来ますが、ACアダプタ駆動の環境下ではHighパフォーマンスモード固定でのご利用が適しています。

odrはジャイロセンサーの内部の測定周期となります。プログラムで取得したい周期以上の設定が必要となります。例えば10ms毎にジャイロセンサーの値を取得しようとした場合は104Hz以上を指定する必要があります。

GYR_SetDeviceRange()

ジャイロセンサーのダイナミックレンジを変更するAPIです。

GYR_SetDeviceRange(uint8 range) 
    range       : ダイナミックレンジの種類
         GYR_DRANGE_250  =  1 :±250[dps]
         GYR_DRANGE_500  =  2 :±500[dps]
         GYR_DRANGE_1000 =  4 :±1000[dps]
         GYR_DRANGE_2000 =  8 :±2000[dps]

    ダイナミックレンジは最新の設置値のみが有効になります
        ダイナミックレンジは動的に変更は出来ないため
        GYR_GetDataOneShot(),GYR_StartPolling()で測定を開始していない
        間のみ変更が可能となります

GYR_GetDataOneshot()

ジャイロセンサーの動作を開始し測定したデータを1回取得するAPIです。
周期取得動作は行いません。

GYR_GetDataOneshot(uint8 sync, int32 timeout, int32 interval) 
    sync      : 同期/非同期
        同期     EAPI_SYNC_RESULT
        非同期   イベントID <1254>
    timeout    : タイムアウト値 [msec]
    interval   : 何秒後に測定値を取得するか [msec]

    timeoutは同期実行時に指定時間データが取得出来なかった場合に
     APIからコンテキストが戻ります非同期実行時は値に意味は持ちません
    timeout > intervalで値を設定する必要があります

APIの同期/非同期の動作

API仕様の考え方は、前記ACC_GetDataOneShot()と同じであるため、動きの詳細はACC_GetDataOneShot()の項をご参照ください。


ジャイロセンサーの値の取り方

ジャイロセンサーの値は、タスク間のデータ引継ぎ用メモリに格納されています。
APIのrcplib_TASK_GetArg()を利用して取り出します。

メモリの番号 説明
rcplib_TASK_GetArg(0) int32 レジスタのX軸値 <-32768~+32767>
rcplib_TASK_GetArg(1) int32 レジスタのY軸値 <-32768~+32767>
rcplib_TASK_GetArg(2) int32 レジスタのZ軸値 <-32768~+32767>
rcplib_TASK_GetArg(3) float 角速度X軸値 [dps]<-2000.0~+2000.0>
rcplib_TASK_GetArg(4) float 角速度Y軸値 [dps]<-2000.0~+2000.0>
rcplib_TASK_GetArg(5) float 角速度Z軸値 [dps]<-2000.0~+2000.0>

※レジスタの軸値はセンサーICの出力するレジスタ値がそのまま入ります。
 角速度値はセンサータスクでdps単位変換した値が入ります。


同期実行のコード例
#incliude "sensorAPI.h"
   
func any_func() {
    // センサーデータを格納するための変数定義
    int16 gyr_x; int16 gyr_y; int16 gyr_z;
    float gyr_f_x; float gyr_f_y; float gyr_f_z;

    // timeout設定 1000[msec], 値を取得までの時間 100[msec]指定で一回取得する
    GYR_GetDataOneshot(EAPI_SYNC_RESULT, 1000, 100);

    // APIが終了した後、以下でデータを取得出来ます。
    gyr_x = rcplib_TASK_GetArg(0);
    gyr_y = rcplib_TASK_GetArg(1);
    gyr_z = rcplib_TASK_GetArg(2);
    gyr_f_x = rcplib_TASK_GetArg(3);
    gyr_f_y = rcplib_TASK_GetArg(4);
    gyr_f_z = rcplib_TASK_GetArg(5);

    return(0);
}

GYR_StartPolling()

ジャイロセンサー測定を周期的に開始するAPIです。

GYR_StartPolling(int32 interval, uint8 notify_event_id) 
    interval : イベント通知周期 [msec]
        0      : 通知停止
        10以上 : 通知周期 <msec> 
    notyfy_event_id : 通知イベントID

    通知周期の最大値
     Highパフォーマンスモード時10[msec]
     Lowパフォーマンスモード時45[msec]
     加速度センサーと両方を方利用する場合90[msec]

このAPIは非同期実行のAPIとなります。このためAPI実行など後に指定した周期毎に取得した値を通知するイベントが発生します。
非同期実行の動きは前記のACC_StartPolling()と同じになりますので、そちらに動作イメージ図がありますので、合わせてご参照ください。


ジャイロセンサーの値の取り方

イベント発生後に取得したデータを取り出せます。
データの取得方法は、上記[GYR_GetDataOneshot()]の説明を参照ください。


周期取得のコード例
#incliude "sensorAPI.h"
   
// 内部非同期イベント
#define UNSYNC_EVENT_INIT 0
#define UNSYNC_EVENT_GYR_POLL 1
   
// mainループ処理
void main_loop() {
   
// 周期取得イベントの処理
    else if(event_id == UNSYNC_EVENT_GYR_POLL) {
        event_gyr_poll(rcplib_TASK_GetArg(0), rcplib_TASK_GetArg(1),
                       rcplib_TASK_GetArg(2), rcplib_TASK_GetArg(3),
                       rcplib_TASK_GetArg(4), rcplib_TASK_GetArg(5));
    }
   
}

func any_func() {
    // 取得周期1000[msec], イベント通知番号1として開始する。
    GYR_StartPolling(1000, UNSYNC_EVENT_GYR_POLL);
    return(0);
}

// 周期取得イベントの処理
func event_gyr_poll(int16 gyr_x, int16 gyr_y, int16 gyr_z, float gyr_f_x, float gyr_f_y, float gyr_f_z) {
   // ジャイロセンサーのデータは各種引数(gyr_x~gyr_f_z)から取得可能
   
    return(0);
}
周期取得停止のコード例
#incliude "sensorAPI.h"
   
func any_func() {
    // 周期取得を停止する
    GYR_StartPolling(0, 0);

    return(0);
}

複数タスクから利用時の注意事項

ジャイロセンサーは複数のタスクから利用できますが、モードや動作条件の有効値は1つのみです。よって下記の優先度で動作します。

※ジャイロセンサーが稼動している場合は、ダイナミックレンジ設定の変更はできません。


振動検出

加速度センサーを用いた検出機能として、振動検出機能をAPIで提供しています。
振動検出機能を利用すると、本製品を設置した場所が振動したことを検出して動作を開始する等のアプリケーションに利用することが出来ます。(例えば車両に設置をして動き出したら位置情報を上げる等)

振動検出機能の特徴

振動検出機能は内蔵の加速度センサーICに振動のトリガとなる閾値を設定して、該当の振動を検出したら通知が入る仕組みをしています。このため振動が検出するまでの間はソフトウェアの動作リソースを減らすことが出来、待ち受けの消費電流を少なく出来ます。


振動検出の制御API

振動検出を制御するAPIは以下があります。

API 内容
1 ACC_SetVibrationMode() 振動検出を設定する

ACC_SetVibrationMode()

振動検出の有効化無効化を設定するAPIです。

ACC_SetVibrationMode(int8 sw, uint8 notify_event_id)
    sw  : 有効/無効
        有効 ACC_VIB_ENABLE  <1>
        無効 ACC_VIB_DISABLE <0>
    nofify_event_id 通知するイベントID <1254>

検出する振動の大きさの調整方法

検出する振動の大きさは、ACC_SetDeviceRange()で設定するダイナミックレンジで調整が出来ます。計算式は、[ダイナミックレンジ / 256]となります。
設定するダイナミックレンジと検出の大きさの関係は以下となります。

DynamicRange Define 検出値
±2[G] ACC_DRANGE_2 ±7[mG]
±4[G] ACC_DRANGE_4 ±15[mG]
±8[G] ACC_DRANGE_8 ±31[mG]
±16[G] ACC_DRANGE_16 ±52[mG]

※ダイナミックレンジの設定は最後に設定した値が優先されますので、振動検出以外で加速度センサーを利用する際の設定に影響されますのでご注意ください。

検出する周期の調整方法

検出する周期は、ACC_SetDeviceMeasure()で設定するODR周波数で設定が出来ます。
設定するODRと検出周期の関係は以下となります。

ODR Define 検出周期
2[Hz] ACC_ODR1_002Hz 500[ms]
13[Hz] ACC_ODR2_013Hz 76[ms]
26[Hz] ACC_ODR3_026Hz 38[ms]
52[Hz] ACC_ODR4_052Hz 19[ms]
104[Hz] ACC_ODR5_104Hz 9[ms]
208[Hz] ACC_ODR6_208Hz 4[ms]

※周波数を高くすることで検出頻度をあげられますが、この頻度で加速度センサーICからの割り込みが入りますので、ソフトウェアの動作リソースを消費します。52Hz以下で設定する事を推奨します。


振動検出のコード例
#include "sensorAPI.h"
#include "vibAPI.h"
   
// 内部非同期イベント
#define UNSYNC_EVENT_INIT 0
#define UNSYNC_EVENT_VIB_NOTIFY 1
   
// mainループ処理
void main_loop() {
   
    // 振動検出イベントの処理
    else if(event_id == UNSYNC_EVENT_VIB_NOTIFY) {
        event_vib_detected();
    }
   
}
   
func any_func() {

    // 振動検出を開始する
    // DynamicRange ±8G, ODR 52Hzを設定
    ACC_SetDeviceRange(ACC_DRANGE_8);
    ACC_SetDeviceMeasure(ACC_HIGH_PERF, ACC_ODR4_052Hz);
    // 振動検出 Enable
    ACC_SetVibrationMode(ACC_VIB_ENABLE, UNSYNC_EVENT_VIB );
    return(0);
}

// 振動検出イベントの処理
func event_vib_detected() {
    // 振動検出時の処理をここに記載

    return(0);
}

サンプルコードの解説

「0201_加速度センサで10msec間隔でのポーリング」

このサンプルコードでは起動後に10msec間隔で加速度センサーの値の読み取りを開始します。読み取った値は100サイクルごとにログに出力します。(10ms毎にログに出力すると出力が間に合わないため)。このサンプルでは読み取った値を表示するのみになりますが、10ms毎に取得した値は動きの解析などに利用できます。

「0203_加速度センサーからデータを取得(タイマー取得)」

このサンプルコードでは起動後に500ms周期のタイマーを起動し、そのタイマーの満了時に加速度センサーの値を取得して、ディスプレイとログに出力します。ここでの加速度センサーの値の取得方法は、ACC_GetDataOneShot()を利用しています。

「0202_ジャイロセンサーからデータを取得(イベント取得)」

このサンプルコードでは起動後にジャイロセンサーを稼働させて、500ms周期で計測した値をイベントとして通知させます。イベントが通知された場合にその測定値をディスプレイとログに出力をします。

「0204_振動を検出する」

このサンプルコードでは起動後に振動検出をダイナミックレンジ 9、 ODR 52Hzで仕掛けて振動を待ちます。該当の振動を検出した場合にディスプレイに「vib detect」の文字を表示するととともに、ログに振動検出した回数を出力します。

関連情報等

各サンプルコードについて動作確認を行っておりますが、全ての環境において動作を保証するものではありません。正しく動作することを確認の上でご利用ください。

対応機種:KC4-C-100A/KC4-C-101A