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);