프로젝트

나도 메이커! 메이커스 여러분들의 작품/프로젝트를 공유하는 공간입니다.

컬러픽업 장갑 만들기

2014-08-27 17:33:07

개요



그래픽 편집툴인 Adobe Photoshop과 같은 프로그램에서는 '스포이드'라는 기능이 있는데요,
용액을 추출하는 실험도구인 '스포이드'처럼 원하는 색상에 커서를 가져다가
클릭만으로 해당 색정보를 추출하는 편리한 기능입니다.

하지만 물리적환경에서는 필요한 색을 사용하기 위해선 해당 색을 지닌 도구를 이용해야 합니다.
포토샵의 '스포이드' 기능처럼 원하는 색을 추출하여 해당 색을 구현하는 필기도구가 있다면 얼마나 편리할까요?

바로 그러한 발상에서 출발한 컨셉 디자인이 있습니다.



출처 : 컬러피커프로젝트 - designboom.com
이 프로젝트는 '박진수' 디자이너의 컨셉 디자인 'color picker pen' 입니다.



물리적 환경에서 색을 추출하여 해당 색 정보를 분석하고,
RGB(RED,GREEN,BLUE)잉크 카트리지에서 색을 조합하여 해당 색을 구현하는 원리 입니다.
아직까지 컨셉디자인이지만 상용화 된다면 많은 인기를 얻을것 같습니다.

이러한 기능을 구현하는 핵심적인 부품은 바로  '컬러센서' 입니다.
 
출처 : 컬러센서 - www.adafruit.com

이 센서의 원리는 포토다이오드에 청색,녹색,적색의 필터를 부착하거나 코팅하여
조사된 광원색에 대응하는 전압출력이나 주파수출력 또는 디지털 ,아날로그 신호로 출력되어 색 정보를 받아올수 있습니다.

이번 프로젝트에서는 이 컬러센서를 이용하여 색 추출 장갑을 만들어 보겠습니다.
이를 통해 컬러센서를 활용하는 법에대해 알아보고 주변 풍경의 색을 추출하여 자신만의 프로젝트에 응용해 보세요.
 

미리보기 동영상

부품목록

NO 부품명 수량 상세정보
1 Adafruit - FLORA or 아두이노 보드 1  
2 네오픽셀 RGB LED  1  
3 컬러센서 1  TCS34725 
4 점퍼케이블 or 와이어 7  
5 리튬이온 전지 1 3.7V Lipo 1000mA
6 인두기 1  
7 1  
8 헤더핀 14 선택사항
9 면 장갑 1  

부품명 FLORA 보드  컬러센서  네오픽셀 RGB LED   리튬이온 전지 점퍼케이블
부품사진          

품명 인두기 납  헤더핀 면 장갑
부품사진        



하드웨어 Making

회로도

브레드보드 레이아웃



본 프로젝트에서는 adafruit의 웨어러블 디바이스 보드인 'FLORA'를 이용하였으며,
기존 아두이노 보드에서도 정상 작동합니다.

배선연결 
Flora 보드를 이용할때 
  • 3.3v -> 3v 
  • GND -> GND
  • SDA -> SDA
  • SCL -> SCL
Arduino 보드를 이용할때
  • 5v -> VIN (red wire)
  • GND -> GND (black wire)
  • SDA -> analog4 
  • SCL -> analog5

출처 : 납땜한 모습 - adafruit.com

이렇게 모듈에 바로 납땜으로 연결하거나,

추후 다른 용도로 사용하기 위해서 헤더핀을 납땝하셔도 좋습니다.

소프트웨어 Coding

아래의 코드를 아두이노에 업로드 합니다.

#include <Wire.h>
#include "Adafruit_TCS34725.h"
#include <Adafruit_NeoPixel.h>
#include "Flora_Pianoglove.h"

#define CLEARTHRESHHOLD 2000





// RGB값을 '눈'이 인식가능한 감마값으로 변환합니다.
byte gammatable[256];



// 컬러센서에 사용된 TCS34725를 사용준비합니다.
Adafruit_TCS34725 tcs = Adafruit_TCS34725(TCS34725_INTEGRATIONTIME_50MS, TCS34725_GAIN_4X);
// 네오픽셀을 6번핀에 연결합니다.
Adafruit_NeoPixel strip = Adafruit_NeoPixel(1, 6, NEO_GRB + NEO_KHZ800);

 // TX만 사용합니다.

void setup() {
  
  Serial.begin(9600);


  //컬러센서가 준비되면, 시리얼모니터상에 found sensor를 전송합니다.
  if (tcs.begin()) {
    Serial.println("Found sensor");
  } 
  else {
    Serial.println("No TCS34725 found ... check your connections");
    while (1); 
  }

  //컬러 재생을 위해 초기화를 실행 합니다.
  strip.begin();
  strip.show(); // 모든 네오픽셀을 꺼짐 상태로 만듭니다.



  // 사람이 인지할수있는 감마값으로 색정보를 변홥 합니다.
  for (int i=0; i<256; i++) {
    float x = i;
    x /= 255;
    x = pow(x, 2.5);
    x *= 255;

    gammatable[i] = x;      

  }
}


void loop() {
  uint16_t clear, red, green, blue;

  tcs.setInterrupt(false);      // LED를 켭니다.

  delay(60);  //50밀리초동안 읽습니다.

  tcs.getRawData(&red, &green, &blue, &clear);

  tcs.setInterrupt(true);  // LED를 끕니다.

  //충분한 색정보를 불러올 수 있는 대상이 없을 경우
  if (clear < CLEARTHRESHHOLD) {
    strip.setPixelColor(0, strip.Color(0, 0, 0)); // LED를 끕니다.
    strip.show();
    return;
  }

  //  Serial.print("C:\t"); Serial.print(clear);
  //  Serial.print("\tR:\t"); Serial.print(red);
  //  Serial.print("\tG:\t"); Serial.print(green);
  //  Serial.print("\tB:\t"); Serial.print(blue);

  // 시각화를 위해 hex code를 계산합니다.
  uint32_t sum = red;
  sum += green;
  sum += blue;
  sum = clear;
  float r, g, b;
  r = red; 
  r /= sum;
  g = green; 
  g /= sum;
  b = blue; 
  b /= sum;
  r *= 256; 
  g *= 256; 
  b *= 256;
  if (r > 255) r = 255;
  if (g > 255) g = 255;
  if (b > 255) b = 255;

  //  Serial.print("\t");
  //  Serial.print((int)r, HEX); Serial.print((int)g, HEX); Serial.print((int)b, HEX); 
  //  Serial.println();



  float remove, normalize;
  if ((b < g) && (b < r)) {
    remove = b;
    normalize = max(r-b, g-b);
  } 
  else if ((g < b) && (g < r)) {
    remove = g;
    normalize = max(r-g, b-g);
  } 
  else {
    remove = r;
    normalize = max(b-r, g-r);
  }
  //작은 소수를 제거합니다.
  float rednorm = r - remove;
  float greennorm = g - remove;
  float bluenorm = b - remove;
  // 가장 높은수를 정상화 합니다.
  rednorm /= normalize;
  greennorm /= normalize;
  bluenorm /= normalize;

  //  Serial.println();
  strip.setPixelColor(0, strip.Color(gammatable[(int)r], gammatable[(int)g], gammatable[(int)b]));
  strip.show();

  //  Serial.print(rednorm); Serial.print(", "); 
  //  Serial.print(greennorm); Serial.print(", "); 
  //  Serial.print(bluenorm); Serial.print(" "); 
  //  Serial.println();

}




RgbColor HsvToRgb(HsvColor hsv){
  
  RgbColor rgb;
  unsigned char region, remainder, p, q, t;

  if (hsv.s == 0)
  {
    rgb.r = hsv.v;
    rgb.g = hsv.v;
    rgb.b = hsv.v;
    return rgb;
  }

  region = hsv.h / 43;
  remainder = (hsv.h - (region * 43)) * 6; 

  p = (hsv.v * (255 - hsv.s)) >> 8;
  q = (hsv.v * (255 - ((hsv.s * remainder) >> 8))) >> 8;
  t = (hsv.v * (255 - ((hsv.s * (255 - remainder)) >> 8))) >> 8;

  switch (region)
  {
  case 0:
    rgb.r = hsv.v; 
    rgb.g = t; 
    rgb.b = p;
    break;
  case 1:
    rgb.r = q; 
    rgb.g = hsv.v; 
    rgb.b = p;
    break;
  case 2:
    rgb.r = p; 
    rgb.g = hsv.v; 
    rgb.b = t;
    break;
  case 3:
    rgb.r = p; 
    rgb.g = q; 
    rgb.b = hsv.v;
    break;
  case 4:
    rgb.r = t; 
    rgb.g = p; 
    rgb.b = hsv.v;
    break;
  default:
    rgb.r = hsv.v; 
    rgb.g = p; 
    rgb.b = q;
    break;
  }

  return rgb;
}


HsvColor RgbToHsv(RgbColor rgb){
  
  HsvColor hsv;
  unsigned char rgbMin, rgbMax;

  rgbMin = rgb.r < rgb.g ? (rgb.r < rgb.b ? rgb.r : rgb.b) : 
  (rgb.g < rgb.b ? rgb.g : rgb.b);
  rgbMax = rgb.r > rgb.g ? (rgb.r > rgb.b ? rgb.r : rgb.b) : 
  (rgb.g > rgb.b ? rgb.g : rgb.b);

  hsv.v = rgbMax;
  if (hsv.v == 0)
  {
    hsv.h = 0;
    hsv.s = 0;
    return hsv;
  }

  hsv.s = 255 * long(rgbMax - rgbMin) / hsv.v;
  if (hsv.s == 0)
  {
    hsv.h = 0;
    return hsv;
  }

  if (rgbMax == rgb.r)
    hsv.h = 0 + 43 * (rgb.g - rgb.b) / (rgbMax - rgbMin);
  else if (rgbMax == rgb.g)
    hsv.h = 85 + 43 * (rgb.b - rgb.r) / (rgbMax - rgbMin);
  else
    hsv.h = 171 + 43 * (rgb.r - rgb.g) / (rgbMax - rgbMin);

  return hsv;
}




소프트웨어 & 하드웨어 설명


1. 스케치 설명

이 프로젝트 코드를 실행하기 위해서는 라이브러리 설치가 필요합니다.

-Neopixel Library
-Flora_Pianoglove
-TCS34725 Library

각각의 라이브러리파일을 다운받아 압축해제하여 Arduino>libraries 폴더에 넣어주세요.
설치후 아두이노 개발환경을 종료후 다시 실행하여 주세요.



기술문서

  • 부품목록
  • 회로도
  • 브레드보드 레이아웃
  • 스케치

hihyo

아두이노,중급,웨어러블,플로라,컬러센서,네오픽셀,컬러픽업