2017年5月10日

  • C
  • EV3技術情報
  • ソフトウェア

IRセンサーの利用方法③-Remote(遠隔)モード

EV3RTパッケージ β7ではEV3のIRセンサーとビーコンが制御できるようになりました。

 

(2017/04/27現在、EV3RTパッケージはβ7が最新です。)
EV3RTパッケージのダウンロードはこちら
http://dev.toppers.jp/trac_user/ev3pf/wiki/Download#ダウンロード

 

ここではRemote(遠隔)モードの利用方法を紹介します。
Distance(接近度)モードの利用方法はこちらを、
Seek(ビーコン)モードの利用方法はこちらをご覧ください。

 

Remote(遠隔)モードでは、IRセンサーでビーコンのどのボタンが押されたかを検知します。

 

IRセンサーでビーコンのどのボタンが押されたかを検知する関数は以下のとおりです。

関数ir_remote_t ev3_infrared_sensor_get_remote ( sensor_port_t port )
引数port:センサーポート
戻り値全て(4つ)のチャンネルのボタン入力パターン。戻り値は構造体ir_remote_tに格納します。
解説IRセンサーでIRビーコンのボタン入力を検出します。
不正なセンサーポートを指定した場合0を返します。

 

戻り値を格納する構造体は以下のとおりです。

構造体ir_remote_t
フィールドuint8_t channel [4]:全て(4つ)のチャンネルのボタン入力のパターン

 

ビーコンの各ボタンは以下のように定義されています。

#define IR_RED_UP_BUTTON 1
#define IR_RED_DOWN_BUTTON 2
#define IR_BLUE_UP_BUTTON 4
#define IR_BLUE_DOWN_BUTTON 8
#define IR_BEACON_BUTTON 16

 

以下のプログラムはビーコンのどのボタンが押されたかを検知して、結果を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_remote_t ir_remote_val;
 int ch = 0;
 char ch_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( "Beacon:" , 0 , 40 );
 ev3_lcd_draw_string( "Red_up:" , 0 , 50 );
 ev3_lcd_draw_string( "Red_dn:" , 0 , 60 );
 ev3_lcd_draw_string( "Blu_up:" , 0 , 70 );
 ev3_lcd_draw_string( "Blu_dn:" , 0 , 80 );

 

 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_remote_val = ev3_infrared_sensor_get_remote(ir_sensor);
  // 選択されたチャンネルの情報をEV3の画面に表示
  sprintf(ch_str, "%d", ch + 1);
  ev3_lcd_draw_string( ch_str , 20 , 30 ); // チャンネル
  ev3_lcd_draw_string( ((ir_remote_val.channel[ch] & IR_BEACON_BUTTON)  ? "on " : "off") , 50 , 40 ); // ビーコンボタン(上図⑤)
  ev3_lcd_draw_string( ((ir_remote_val.channel[ch] & IR_RED_UP_BUTTON) ? "on " : "off") , 50 , 50 ); // 赤上ボタン(上図①)
  ev3_lcd_draw_string( ((ir_remote_val.channel[ch] & IR_RED_DOWN_BUTTON) ? "on " : "off") , 50 , 60 ); // 赤下ボタン(上図②)
  ev3_lcd_draw_string( ((ir_remote_val.channel[ch] & IR_BLUE_UP_BUTTON) ? "on " : "off") , 50 , 70 ); // 青上ボタン(上図③)
  ev3_lcd_draw_string( ((ir_remote_val.channel[ch] & IR_BLUE_DOWN_BUTTON) ? "on " : "off") , 50 , 80 ); // 青下ボタン(上図④)

 

  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現在)

SPIKE