2017年5月10日
- C
- EV3技術情報
- ソフトウェア
IRセンサーの利用方法②-Seek(ビーコン)モード
EV3RTパッケージ β7ではEV3のIRセンサーとビーコンが制御できるようになりました。
(2017/04/27現在、EV3RTパッケージはβ7が最新です。)
EV3RTパッケージのダウンロードはこちら
http://dev.toppers.jp/trac_user/ev3pf/wiki/Download#ダウンロード
ここではSeek(ビーコン)モードの利用方法を紹介します。 Distance(接近度)モードの利用方法はこちらを、 Remote(遠隔)モードの利用方法はこちらをご覧ください。
Seek(ビーコン)モードでは、IRセンサーでビーコンの距離と方位を測定します。
IRセンサーでビーコンの距離と方位を測定する関数は以下のとおりです。
関数 | ir_seek_t ev3_infrared_sensor_seek ( sensor_port_t port ) |
引数 | port:センサーポート |
戻り値 | 全て(4つ)のチャンネルの方位と距離。戻り値は構造体ir_seek_tに格納します。 |
解説 | IRセンサーでIRビーコンの方位と距離を測定します。 不正なセンサーポートを指定した場合、0の方位と-128の距離を返します。 |
戻り値を格納する構造体は以下のとおりです。
構造体 | ir_seek_t |
フィールド | int8_t heading [4]:全て(4つ)のチャンネルの方位(-25~25) int8_t distance [4]:全て(4つ)のチャンネルの距離 (0~100または-128) |
以下のプログラムはビーコンの距離と方位を測定してEV3の画面に表示します。
測定する
#include "ev3api.h"
#include "app.h"
#if defined(BUILD_MODULE)
#include "module_cfg.h"
#else
#include "kernel_cfg.h"
#endif
// センサーのポートを設定
#define ir_sensor EV3_PORT_4
// 待機時間の設定 [msec]
const uint32_t WAIT_TIME_MS = 100;
void run_task(intptr_t unused)
{
// IRビーコンの各チャンネルの方位と距離をLCDに表示する。
ir_seek_t ir_seek_val;
int ch = 0;
char ch_str[20];
char h_str[20];
char d_str[20];
ev3_lcd_draw_string( "Channel select: " , 0 , 0 );
ev3_lcd_draw_string( "up:1 right:2 down:3 left:4" , 0 , 10 );
ev3_lcd_draw_string( "CH:" , 0 , 30 );
ev3_lcd_draw_string( "Heading:" , 0 , 40 );
ev3_lcd_draw_string( "Distance:" , 0 , 50 );
while (!ev3_button_is_pressed(ENTER_BUTTON)) {
// ビーコンのチャンネルをEV3のボタンで切り替える
// 上:1CH、右:2CH、下:3CH、左:4CH
if (ev3_button_is_pressed(UP_BUTTON)){
ch = 0;
} else if (ev3_button_is_pressed(RIGHT_BUTTON)) {
ch = 1;
} else if (ev3_button_is_pressed(DOWN_BUTTON)) {
ch = 2;
} else if (ev3_button_is_pressed(LEFT_BUTTON)) {
ch = 3;
}
// ビーコンの距離と方位を取得
ir_seek_val = ev3_infrared_sensor_seek(ir_sensor);
// 選択されたチャンネルの情報をEV3の画面に表示
sprintf(ch_str, "%d", ch + 1);
sprintf(h_str , "%d ", ir_seek_val.heading[ch] );
sprintf(d_str , "%d ", ir_seek_val.distance[ch]);
ev3_lcd_draw_string( ch_str , 20 , 30 ); // チャンネル
ev3_lcd_draw_string( h_str , 60 , 40 ); // 方位
ev3_lcd_draw_string( d_str , 60 , 50 ); // 距離
tslp_tsk(WAIT_TIME_MS);
}
}
void main_task(intptr_t unused) {
// センサーの設定
ev3_sensor_config( ir_sensor , INFRARED_SENSOR );
// run_taskを開始する
act_tsk(RUN_TASK);
}
※サンプルプログラムは一例として紹介しています。誤り等が含まれていた場合はご了承ください。
(2017/04/27現在)