本製品には内蔵センサーとして加速度センサーとジャイロセンサーを搭載しています。ここでは内蔵センサーをレシピ言語から制御する方法を紹介します。
内蔵センサーである加速度センサーとジャイロセンサーの機能の特徴を以下に示します。
加速度センサーはX,Y,Zの3軸あります。加速度センサーは端末が動いた瞬時的な値に加えて、常に重力方向に力を受けていることにより傾きの値の変化で端末の姿勢が分かります。
加速度センサーを制御するAPIは以下があります。
API | 内容 | |
---|---|---|
1 | ACC_SetDeviceMeasure() | パフォーマンスモードとODRを変更する |
2 | ACC_SetDeviceRange | ダイナミックレンジを変更する |
3 | ACC_GetDataOneShot() | 加速度センサー測定値を一回取得する |
4 | ACC_StartPolling() | 加速度センサー測定値を周期取得する |
加速度センサーのパフォーマンスモードと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以上を指定する必要があります。
加速度センサーのダイナミックレンジを変更する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()で測定を開始していない
間のみ変更が可能となります。
加速度センサーの動作を開始し測定したデータを1回取得するAPIです。
周期取得動作は行いません。
重力方向を検出して傾きや姿勢を知る場合などにこのAPIが有用です。
ACC_GetDataOneShot(uint8 sync, int32 timeout, int32 interval)
sync : 同期/非同期
同期 :EAPI_SYNC_RESULT
非同期 :イベントID <1〜254>
timeout : タイムアウト値 [msec]
interval : 何秒後に測定値を取得するか [msec]
※timeoutは同期実行時に指定時間データが取得出来なかった場合に
APIからコンテキストが戻ります。非同期実行時は値に意味は持ちません。
※timeout > intervalで値を設定する必要があります。
APIは同期及び非同期で実行することが出来ます。同期実行の場合はセンサーの値が取得出来るまでコンテキストがAPIに移ります。この場合APIから処理が戻って来たタイミングで値が取得出来るので、一連の流れとして処理を記述する時に有用です。非同期での実行の場合は、値が取得出来たタイミングでイベントが発生しますので、タスクの処理と並列で値の取得を行いたいケースに有用です。
加速度センサーの値は、タスク間のデータ引継ぎ用メモリに格納されています。
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);
}
加速度センサー測定を周期的に開始する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_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軸があります。ジャイロセンサーは静止しているときは値は動かず、デバイスの回転を検出するとその瞬時的な値を出力します。これにより、端末がどの方向に回転したかが分かります。
ジャイロセンサーを制御するAPIは以下があります。
API | 内容 | |
---|---|---|
1 | GYR_SetDeviceMeasure() | パフォーマンスモード、ODRを変更する |
2 | GYR_SetDeviceRange | ダイナミックレンジを変更する |
3 | GYR_GetDataOneshot() | ジャイロセンサー測定値を一回取得する |
4 | GYR_StartPolling() | ジャイロセンサー測定値を周期取得する |
ジャイロセンサーのパフォーマンスモードを変更する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以上を指定する必要があります。
ジャイロセンサーのダイナミックレンジを変更する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()で測定を開始していない
間のみ変更が可能となります。
ジャイロセンサーの動作を開始し測定したデータを1回取得するAPIです。
周期取得動作は行いません。
GYR_GetDataOneshot(uint8 sync, int32 timeout, int32 interval)
sync : 同期/非同期
同期 :EAPI_SYNC_RESULT
非同期 :イベントID <1〜254>
timeout : タイムアウト値 [msec]
interval : 何秒後に測定値を取得するか [msec]
※timeoutは同期実行時に指定時間データが取得出来なかった場合に
APIからコンテキストが戻ります。非同期実行時は値に意味は持ちません。
※timeout > intervalで値を設定する必要があります。
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);
}
ジャイロセンサー測定を周期的に開始する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 | 内容 | |
---|---|---|
1 | ACC_SetVibrationMode() | 振動検出を設定する |
振動検出の有効化無効化を設定するAPIです。
ACC_SetVibrationMode(int8 sw, uint8 notify_event_id)
sw : 有効/無効
有効 :ACC_VIB_ENABLE <1>
無効 :ACC_VIB_DISABLE <0>
nofify_event_id :通知するイベントID <1〜254>
検出する振動の大きさは、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);
}
このサンプルコードでは起動後に10msec間隔で加速度センサーの値の読み取りを開始します。読み取った値は100サイクルごとにログに出力します。(10ms毎にログに出力すると出力が間に合わないため)。このサンプルでは読み取った値を表示するのみになりますが、10ms毎に取得した値は動きの解析などに利用できます。
このサンプルコードでは起動後に500ms周期のタイマーを起動し、そのタイマーの満了時に加速度センサーの値を取得して、ディスプレイとログに出力します。ここでの加速度センサーの値の取得方法は、ACC_GetDataOneShot()を利用しています。
このサンプルコードでは起動後にジャイロセンサーを稼働させて、500ms周期で計測した値をイベントとして通知させます。イベントが通知された場合にその測定値をディスプレイとログに出力をします。
このサンプルコードでは起動後に振動検出をダイナミックレンジ 9、 ODR 52Hzで仕掛けて振動を待ちます。該当の振動を検出した場合にディスプレイに「vib detect」の文字を表示するととともに、ログに振動検出した回数を出力します。
各サンプルコードについて動作確認を行っておりますが、全ての環境において動作を保証するものではありません。正しく動作することを確認の上でご利用ください。
対応機種:KC4-C-100A/KC4-C-101A