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

TOPPERS/EV3RT環境でC言語を使って、EV3基本セット付属のカラーセンサーを使ってみます。[環境開発の記事はこちら](http://qiita.com/tkzw102/items/93dd959cccf2efc8d4a6)

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

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

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

![conect.png](https://qiita-image-store.s3.amazonaws.com/0/152243/bdce3c7f-6e0e-a9a3-3bdf-90a3a870d934.png)

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

#ソースコードを書く

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

```C: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](https://qiita-image-store.s3.amazonaws.com/0/152243/2be65600-3ab7-a05c-976b-47bb68942748.png)

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

![blue.png](https://qiita-image-store.s3.amazonaws.com/0/152243/3a178af0-2545-436e-4830-a2c626e2d866.png)

![black.png](https://qiita-image-store.s3.amazonaws.com/0/152243/ca55bba5-e038-604d-eacd-c79402159dd6.png)

![red.png](https://qiita-image-store.s3.amazonaws.com/0/152243/ffae2e04-e51a-e6ad-4b6f-7b64ea92ee58.png)

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

![iron.png](https://qiita-image-store.s3.amazonaws.com/0/152243/dcf9d676-d167-07d1-109d-833ec14612d2.png)