7.音を鳴らす TOPへ 9.その他のセンサの使用

8.超音波センサの使用


1.超音波センサの取り付け

超音波センサは、発信した超音波が物体に反射して戻ってくるまでの時間から、その物体までの距離を計測するセンサです。
NXTの超音波センサの超音波の周波数は、最も一般的に使われている 40 kHz です。
組立書の20(p.28-29)にしたがって、超音波センサをNXTの上部に取り付け、センサーポート4に接続します。
なお、超音波を用いた距離計測装置をソナー(sonar)といい、超音波センサをソナーセンサということもあります。

2.超音波センサを使用する

以下は、0.1秒毎に距離測定を行うプログラムです。
sonar.c
#include "kernel.h"
#include "kernel_id.h"
#include "ecrobot_interface.h"

DeclareTask(Task1);                             /* Task1を宣言 */

#define SONAR_PORT NXT_PORT_S4

void ecrobot_device_initialize(){               /* OSEK起動時の処理(モータ停止)*/
        nxt_motor_set_speed(NXT_PORT_B,0,1);
        nxt_motor_set_speed(NXT_PORT_C,0,1);
        ecrobot_init_sonar_sensor(SONAR_PORT);  /* 超音波センサの初期化/計測開始 */
}

void ecrobot_device_terminate(){                /* OSEK終了時の処理(モータ停止)*/
        nxt_motor_set_speed(NXT_PORT_B,0,1);
        nxt_motor_set_speed(NXT_PORT_C,0,1);
        ecrobot_term_sonar_sensor(SONAR_PORT); /* 超音波センサ計測を終了 */
}

void user_1ms_isr_type2(void){}

TASK(Task1)
{
        int uss1;

       	display_clear(0);

        while(1){

                uss1=ecrobot_get_sonar_sensor(SONAR_PORT);      /* 超音波センサから値を取得 */
                display_goto_xy(0, 1);
                display_string("uss=");
                display_int(uss1, 3);
                display_update();

                systick_wait_ms(100); // 最低50msec の wait が必要

        }

        TerminateTask();                                        /* 処理終了 */
}


超音波センサから値を取得するAPIについて解説します。

ecrobot_init_sonar_sensor(SONAR_PORT)
SONAR_PORTの超音波センサを初期化し、計測を開始します。計測は40msec 程度の間隔で行われます。
ecrobot_term_sonar_sensor(SONAR_PORT)
SONAR_PORTの超音波センサを計測を中止します。
ecrobot_get_sonar_sensor(SONAR_PORT)
SONAR_PORTの超音波センサの計測データを取得します。得られる数値の単位は、センチメートルです。戻り値は -1 から 255。-1 は測定設定未設定状態を意味します。エコー(反射波)を捉えることができなかった場合は 255 を戻します。

超音波センサの計測には時間を要するため、このAPIでデータ(計測値)を取得するには、前回値の取得から 50msec 以上の間隔を空ける必要があります。


3.課題

1.サンプルプログラムの動作を確認せよ。
2.超音波センサの測定限界(上限と下限)を計測せよ。
3. 超音波センサを使って、前方物体との距離を45cmに保つようにせよ。
【走行パターン】
計測値が指定距離より大きくなれば前進、小さくなれば後退するようにする。
または、
計測値と指定距離との差に比例させて、モータの前進・後退のduty値を変更する。(比例制御)
	//比例制御のプログラム例(一部)

	int err, duty;
	int dist_ref = 45 ;// 目標距離[cm]
	int Kp = 10 ; //比例ゲイン
	
	err = ecrobot_get_sonar_sensor(SONAR_PORT) - dist_ref;
	duty = Kp * err;
	if( duty > 100) duty = 100; // 最大値100
	if( duty < -100) duty = -100; //最小値 -100
	nxt_motor_set_speed( NXT_PORT_B, duty, 1);
	nxt_motor_set_speed( NXT_PORT_C, duty, 1);



7.音を鳴らす TOPへ 9.その他のセンサ