5
3

More than 5 years have passed since last update.

TOPPERS/EV3RTでEV3のカラーセンサーを使ってみる

Last updated at Posted at 2017-02-14

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

EV3用カラーセンサーの特徴

EV3カラーセンサーは、8つの異なる色(無色,黒,青,緑,黄,赤,白,茶)を区別します。 また、光の強度を検出することにより、光センサーとして機能します。(物体の輝度を測って、暗い色なら値が低く、明るい色なら値が高くなります。)
計測可能距離は1mm~18mmほどで、計測対象のRGB Raw値を測ることもできます。

カラーセンサーと本体の接続

conect.png

上の画像のように接続しました。カラーセンサーをセンサーポート1に接続しています。今回はカラーセンサーと本体LCDさえあれば動作確認ができるので、他のものは接続しません。

ソースコードを書く

今回は、対象の反射光の強さと色を測定するアプリ(color-test)を作成しようと思います。
以下がソースコードになります。

main.c

/**
 ******************************************************************************
 ** ファイル名   : main.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
/* 検知色の対応付けのためのマクロ定義 */
#define UNKNOWN 0
#define BLACK 1
#define BLUE 2
#define GREEN 3
#define YELLOW 4
#define RED 5
#define WHITE 6
#define BROWN 7

/* センサーの設定 */
static const sensor_port_t
    color_sensor = EV3_PORT_1;

/* メインタスク */
void main_task(intptr_t unused)
{
    /* 反射光値格納用の変数 */
    static int reflect = 0;
    static int color_id = 0;
    char color_buffer[30];

    /* ループに入る前にセンサーとセンサーポートを接続する */
    ev3_sensor_config (color_sensor, COLOR_SENSOR);
    //ev3_lcd_set_font (EV3_FONT_MEDIUM);
    /* 接続が完了したら合図として本体LEDをオレンジ色に変える */
    ev3_led_set_color(LED_ORANGE); 

    /* ループの中に入る */
    while(1)
    {   /* 反射値と色を測定して表示し続ける */
        /* 反射値を測って変数に格納 */
        reflect = ev3_color_sensor_get_reflect(color_sensor);
        /* 色を読み取って変数に格納 */
        color_id = ev3_color_sensor_get_color(color_sensor);
        /* 読み取った色ごとに処理分け */
        /* それぞれの処理の中では、反射値を読み取った色を含む情報を文字配列に格納している */
        switch(color_id){
            case UNKNOWN:
                sprintf(color_buffer, "REFLECT:%d      COLOR:Unknown            ",reflect);
            break;
            case BLACK:
                sprintf(color_buffer, "REFLECT:%d      COLOR:Black              ",reflect);
            break;
            case BLUE:
                sprintf(color_buffer, "REFLECT:%d      COLOR:Blue               ",reflect);
            break;
            case GREEN:
                sprintf(color_buffer, "REFLECT:%d      COLOR:Green              ",reflect);
            break;
            case YELLOW:
                sprintf(color_buffer, "REFLECT:%d      COLOR:Yellow             ",reflect);
            break;
            case RED:
                sprintf(color_buffer, "REFLECT:%d      COLOR:Red                ",reflect);
            break;
            case WHITE:
                sprintf(color_buffer, "REFLECT:%d      COLOR:White              ",reflect);
            break;
            case BROWN:
                sprintf(color_buffer, "REFLECT:%d      COLOR:Brown              ",reflect);    
            break;
        }
        /* 正面ディスプレイに文字配列の中身を描写させる */
        ev3_lcd_draw_string(color_buffer, 0,10);

    }
    ext_tsk();
}


動作確認

target.png

測定対象を用意しました。(私が普段使っているパソコンと作業のお供のチョコレートです)これで輝度と色を測ってみようと思います。

blue.png

black.png

red.png

このような結果になりました(画像見づらくてゴメンナサイ...)
チョコレートのパッケージの青い部分と黒い部分、パソコンの赤を正しく認識できています。
色の計測は、対象物から距離がありすぎると正しく動作せず、"Unknown"となるようです。
また、輝度値に関しては、白に近い(明るい)色ほど高く、黒に近い(暗い)色ほど低くなるようです。反射光を読み取っているだけあって、金属光沢がある部分を測定したら、なかなか高い値が出ました。(以下の画像は、ラズパイ3のLANポートを測定した結果です。カラーは合ってませんね....)

iron.png

5
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
5
3