1.サウンドセンサ
サウンドセンサは、音の大きさを計測するセンサです。
ロボットにサウンドセンサを適当な位置に取り付けます。なるべくモータから離すと良いでしょう。
今回は、手をたたいて大きな音を鳴らすと、ロボットの動きが止まるプログラムを作ります。
今回新たに用いたAPIについて解説します。
閾値を小さくしずぎると、ロボットのモータの音などで閾値を超えてしまいます。
画面に音の大きさを表示させたりするといいかもしれません。
ロボットにサウンドセンサを適当な位置に取り付けます。なるべくモータから離すと良いでしょう。
今回は、手をたたいて大きな音を鳴らすと、ロボットの動きが止まるプログラムを作ります。
sound3.c
#include "kernel.h" #include "kernel_id.h" #include "ecrobot_interface.h" DeclareTask(Task1); /* Task1を宣言 */ void ecrobot_device_initialize(){ /* OSEK起動時の処理(モータ停止)*/ nxt_motor_set_speed(NXT_PORT_B,0,1); nxt_motor_set_speed(NXT_PORT_C,0,1); } void ecrobot_device_terminate(){ /* OSEK終了時の処理(モータ停止)*/ nxt_motor_set_speed(NXT_PORT_B,0,1); nxt_motor_set_speed(NXT_PORT_C,0,1); } #define PORT_SOUND NXT_PORT_S1 /* サウンドセンサポートのマクロ */ #define SOUNDthreshold 200 /* 閾値のマクロ */ void user_1ms_isr_type2(void){} TASK(Task1) { nxt_motor_set_speed(NXT_PORT_B,80,1); nxt_motor_set_speed(NXT_PORT_C,80,1); while(ecrobot_get_sound_sensor(PORT_SOUND) >= SOUNDthreshold){ /* 閾値より音が小さかったら真 */ systick_wait_ms(1); } nxt_motor_set_speed(NXT_PORT_B,0,1); nxt_motor_set_speed(NXT_PORT_C,0,1); display_string("THAT'S ALL !"); /* メッセージを表示する */ display_update(); TerminateTask(); /* 処理終了 */ } |
今回新たに用いたAPIについて解説します。
ecrobot_get_sound_sensor(PORT_SOUND)
サウンドセンサから音の大きさを取得する関数です。
引数は、センサポートの指定です。
分解能は10bitで値の範囲は0〜1023です。小さな値ほど大きな音を表します。
引数は、センサポートの指定です。
分解能は10bitで値の範囲は0〜1023です。小さな値ほど大きな音を表します。
閾値を小さくしずぎると、ロボットのモータの音などで閾値を超えてしまいます。
画面に音の大きさを表示させたりするといいかもしれません。
2.加速度センサ
オプション製品の加速度センサによって、加速度を計測できます。
また、重力により、センサの傾きを測ることも出来ます。
このセンサは3軸のセンサであるため、得られる値も3つになります。
このプログラムは、加速度センサからの値をそのまま画面に表示するプログラムです。
センサを地面に対して傾けたり、急に動かしたりすると、値が変化するのがわかると思います。
これと、次で説明するbluetoothを使えば、wiiリモコンのようにロボットを操縦することが出来るかもしれません。
加速度センサから値を取得するAPIについて解説します。
※S16型の変数・・・・符号付(signed)、16bitの変数
また、重力により、センサの傾きを測ることも出来ます。
このセンサは3軸のセンサであるため、得られる値も3つになります。
accel.c
#include "kernel.h" #include "kernel_id.h" #include "ecrobot_interface.h" DeclareTask(Task1); /* Task1を宣言 */ #define PORT_ACCEL NXT_PORT_S1 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_accel_sensor(PORT_ACCEL); } 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_accel_sensor(PORT_ACCEL); } void user_1ms_isr_type2(void){} TASK(Task1) { S16 ax_buf[3]; /* S16型の配列(長さ3)を定義 */ while(1){ display_clear(0); ecrobot_get_accel_sensor(PORT_ACCEL, ax_buf); /* 加速度センサから値を取得 */ display_goto_xy(0, 1); display_int(ax_buf[0], 0); display_goto_xy(0, 2); display_int(ax_buf[1], 0); display_goto_xy(0, 3); display_int(ax_buf[2], 0); display_update(); systick_wait_ms(10); } TerminateTask(); /* 処理終了 */ } |
このプログラムは、加速度センサからの値をそのまま画面に表示するプログラムです。
センサを地面に対して傾けたり、急に動かしたりすると、値が変化するのがわかると思います。
これと、次で説明するbluetoothを使えば、wiiリモコンのようにロボットを操縦することが出来るかもしれません。
加速度センサから値を取得するAPIについて解説します。
ecrobot_get_accel_sensor(PORT_ACCEL, ax_buf)
加速度データはx,y,zの3つのデータがあり、3つの配列によって値を取得します。
サンプルプログラムでは、ax_bufという配列を定義し、その中に加速度データを取り込んでいます。
一番目の引数がセンサポートの指定、2番目が値を代入する配列の指定です。
サンプルプログラムでは、ax_bufという配列を定義し、その中に加速度データを取り込んでいます。
一番目の引数がセンサポートの指定、2番目が値を代入する配列の指定です。
※S16型の変数・・・・符号付(signed)、16bitの変数
3.課題
サンプルプログラムを用いて各種センサの動作を確認せよ。