TOPPERS/EV3RT環境でC言語を使って、EV3基本セット付属の超音波センサーを使ってみます。環境開発の記事はこちら
#EV3超音波センサーの特徴
EV3超音波センサーは、センサーから3cm~250cmの間にある物体までの距離を、誤差±1cmで計測してくれます。
これが超音波センサーです。使用中は正面の目玉のようなパーツが赤色に発光します。
このセンサーは、正面から向かって左側から超音波を発信し、右側で超音波を受信します。
左側から発信された超音波が物体に反射して、戻ってきたものを右側で受信して距離を測定しているのです。
そのため、もし他に超音波を発信している物があり、その超音波を受信してしまうと、距離が正しく計測できません。
また、このセンサーは超音波の受信機能のみの利用が可能になっています。
この機能を使えば、開けた場所でゴール地点に超音波発振器を設置し、そこに向かって進むロボットとかも作れそうですね。
今回は、物体までの距離を測って表示するだけのアプリ(sonic-test)を作成しようと思います。
#超音波センサーと本体の接続
上の画像のように接続しました。センサーポート1に超音波センサーをつなぎます。
今回はLCDと超音波センサーがあればアプリを作れるので、他のセンサーやモーターは必要ありません。
#ソースコード
以下ソースコードになります。センサーとセンサーポートを接続した後無限ループに入り、LCDに測定距離を表示し続けます。
/**
******************************************************************************
** ファイル名 : app.c
** 説明 : 距離を測定する
******************************************************************************
**/
#include "ev3api.h"
#include "app.h"
#include "stdlib.h"
#if defined(BUILD_MODULE)
#include "module_cfg.h"
#else
#include "kernel_cfg.h"
#endif
#define DEBUG
#ifdef DEBUG
#define _debug(x) (x)
#else
#define _debug(x)
#endif
/* センサーの設定 */
static const sensor_port_t
ultrasonic_sensor = EV3_PORT_1;
/* メインタスク */
void main_task(intptr_t unused)
{
/* 反射光値格納用の変数 */
static int distance = 0;
char distance_buffer[30];
/* ループに入る前にセンサーとセンサーポートを接続する */
ev3_sensor_config (ultrasonic_sensor, ULTRASONIC_SENSOR);
//ev3_lcd_set_font (EV3_FONT_MEDIUM);
/* 接続が完了したら合図として本体LEDをオレンジ色に変える */
ev3_led_set_color(LED_ORANGE);
/* ループの中に入る */
while(1)
{ /* 距離を測定して表示し続ける */
/* 反射値を測って変数に格納 */
distance = ev3_ultrasonic_sensor_get_distance(ultrasonic_sensor);
/* 文字配列に読み取った値を格納する */
sprintf(distance_buffer, "DISTANCE:%d ",distance);
/* 正面ディスプレイに文字配列の中身を描写させる */
ev3_lcd_draw_string(distance_buffer, 0,10);
}
ext_tsk();
}
#動作確認
こんな感じで、測定対象とセンサーの間をメジャーで測定しました。
精度はかなりいいみたいです。