1.超音波センサの取り付け
超音波センサは、発信した超音波が物体に反射して戻ってくるまでの時間から、その物体までの距離を計測するセンサです。
NXTの超音波センサの超音波の周波数は、最も一般的に使われている 40 kHz です。
組立書の20(p.28-29)にしたがって、超音波センサをNXTの上部に取り付け、センサーポート4に接続します。
なお、超音波を用いた距離計測装置をソナー(sonar)といい、超音波センサをソナーセンサということもあります。
NXTの超音波センサの超音波の周波数は、最も一般的に使われている 40 kHz です。
組立書の20(p.28-29)にしたがって、超音波センサをNXTの上部に取り付け、センサーポート4に接続します。
なお、超音波を用いた距離計測装置をソナー(sonar)といい、超音波センサをソナーセンサということもあります。
2.超音波センサを使用する
以下は、0.1秒毎に距離測定を行うプログラムです。
sonar.c
超音波センサから値を取得するAPIについて解説します。
超音波センサの計測には時間を要するため、このAPIでデータ(計測値)を取得するには、前回値の取得から 50msec 以上の間隔を空ける必要があります。
#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に保つようにせよ。
【走行パターン】
2.超音波センサの測定限界(上限と下限)を計測せよ。
3. 超音波センサを使って、前方物体との距離を45cmに保つようにせよ。
【走行パターン】
計測値が指定距離より大きくなれば前進、小さくなれば後退するようにする。
または、
計測値と指定距離との差に比例させて、モータの前進・後退のduty値を変更する。(比例制御)
または、
計測値と指定距離との差に比例させて、モータの前進・後退の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);