Edited at

TOPPERS/EV3RTでEV3の超音波センサーを使ってみる

More than 1 year has passed since last update.

TOPPERS/EV3RT環境でC言語を使って、EV3基本セット付属の超音波センサーを使ってみます。環境開発の記事はこちら


EV3超音波センサーの特徴

EV3超音波センサーは、センサーから3cm~250cmの間にある物体までの距離を、誤差±1cmで計測してくれます。

Usonic-sensor.png

これが超音波センサーです。使用中は正面の目玉のようなパーツが赤色に発光します。

このセンサーは、正面から向かって左側から超音波を発信し、右側で超音波を受信します。

左側から発信された超音波が物体に反射して、戻ってきたものを右側で受信して距離を測定しているのです。

そのため、もし他に超音波を発信している物があり、その超音波を受信してしまうと、距離が正しく計測できません。

また、このセンサーは超音波の受信機能のみの利用が可能になっています。

この機能を使えば、開けた場所でゴール地点に超音波発振器を設置し、そこに向かって進むロボットとかも作れそうですね。

今回は、物体までの距離を測って表示するだけのアプリ(sonic-test)を作成しようと思います。


超音波センサーと本体の接続

connect.png

上の画像のように接続しました。センサーポート1に超音波センサーをつなぎます。

今回はLCDと超音波センサーがあればアプリを作れるので、他のセンサーやモーターは必要ありません。


ソースコード

以下ソースコードになります。センサーとセンサーポートを接続した後無限ループに入り、LCDに測定距離を表示し続けます。


app.c


/**
******************************************************************************
** ファイル名 : 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();
}



動作確認

distance-test.png

こんな感じで、測定対象とセンサーの間をメジャーで測定しました。

result.png

精度はかなりいいみたいです。