TOPPERS/EV3RT環境でC言語を使って、EV3基本セット付属のカラーセンサーを使ってみます。環境開発の記事はこちら
#EV3用カラーセンサーの特徴
EV3カラーセンサーは、8つの異なる色(無色,黒,青,緑,黄,赤,白,茶)を区別します。 また、光の強度を検出することにより、光センサーとして機能します。(物体の輝度を測って、暗い色なら値が低く、明るい色なら値が高くなります。)
計測可能距離は1mm~18mmほどで、計測対象のRGB Raw値を測ることもできます。
#カラーセンサーと本体の接続
上の画像のように接続しました。カラーセンサーをセンサーポート1に接続しています。今回はカラーセンサーと本体LCDさえあれば動作確認ができるので、他のものは接続しません。
#ソースコードを書く
今回は、対象の反射光の強さと色を測定するアプリ(color-test)を作成しようと思います。
以下がソースコードになります。
/**
******************************************************************************
** ファイル名 : 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();
}
#動作確認
測定対象を用意しました。(私が普段使っているパソコンと作業のお供のチョコレートです)これで輝度と色を測ってみようと思います。
このような結果になりました(画像見づらくてゴメンナサイ...)
チョコレートのパッケージの青い部分と黒い部分、パソコンの赤を正しく認識できています。
色の計測は、対象物から距離がありすぎると正しく動作せず、"Unknown"となるようです。
また、輝度値に関しては、白に近い(明るい)色ほど高く、黒に近い(暗い)色ほど低くなるようです。反射光を読み取っているだけあって、金属光沢がある部分を測定したら、なかなか高い値が出ました。(以下の画像は、ラズパイ3のLANポートを測定した結果です。カラーは合ってませんね....)