로그인회원등록 내글장바구니주문조회현재접속자
 상품 검색








 게시판 검색





 
 
회원등록 비번분실


온라인 입금계좌
ㆍ기업은행
ㆍ219-043192-01-028
ㆍ이건영

      거래은행 바로가기
 
 Build your Project
PROJECT 자료실
작성자 leeky        
작성일 2006/03/07
첨부#1 tcs230m8.c+tcs230match.zip (1,220KB) (Down:123)
첨부#2 tcs230.pdf (116KB) (Down:35)
Link#1 (Down:23)
ㆍ추천: 3  ㆍ조회: 856   
  Mega8 칼라센서 TCS230 색상인식 장치
TCS230 센서기판을 구입하신 분들에게
이 자료는 TCS230의 작동원리와 인터페이스 방법을 설명하기 위한 자료입니다.
자신의 개인적인 소스를 만들기 위한 도움의 한 방법으로 1차 소스를 제공합니다.
 
소스에서 적색으로 표시된 부분은 V2 기판에 따라 변경된 부분입니다.  
TCS230 기판을 구입하더라도, 이 자료 이상의 소스를 요청하지 마십시요.
자신의 개인적인 소스는 자신이 공부하여, 자신의 노력으로 만들어야 합니다.
 
 
TAOS TCS230 ($4.7)이 몇개 있는 것으로, COLOR SENSOR를 만들어 보았습니다,
원래는 PIC로 된 MPU에  stamp basic이 미리 구워진 BS2라는 Basic 모듈에
parallax에서 제공하는 BS2 베이직으로 된 소스입니다, ($150 ~ $190)
.
이것을 ATmega-8을 사용하고, 언어는 C로 바꾸어 이식하였습니다.
사용한 C언어는 Image Craft 사의 ICC AVR 6.25C입니다.

TCS230은 TAOS의 64셀 포토 다이오드가  SOIC-8핀에 들어 있으며
최고 500KHz 출력으로 250,000:1의 다이나믹 레인지를 가지고 있는 광학 센서입니다.


TCS230은 Data_Out, Output_Enable 핀이 있으며,
/OE는 TCS230의 출력 데이터 Enable, Data_out은 내부의 V/F Converter 출력으로
선택된 색상(R,G,B,W 4색으로 각각 16개씩 내장)의 검출된 광도를 주파수로 출력합니다.

색상의 선택은 S3,S2, 출력 주파수 선택 S1, S0이 있습니다만, S1과 S0는 1:1로 고정하고,
펌웨어에서 TCS230의 출력주파수를 측정하는 주기를 변경하여 각 색상의 검출감도를 제어하고 있습니다. 
 
 
 
 
이번에 AVR로 포팅한 목적은, Bueno Systems에서 만든 tcs230match라는 소프트인데요,
색상검출 모듈의 신호를 받아서 색상을 표시합니다,
즉 색상검출 모듈의 색상신호를 수신해서, 색의 합성을 하여 화면에 표시하는 소프트입니다.

문제는 BS2로 만든 TCS230 Color Sensor 색상검출 모듈의 가격이 너무 비싸기도 하고,
이미 가지고 있던, mega8 칩과 tcs230을 연결하여, ICC AVR C로 만들어 보았습니다.
.
// tcs230 감도를 1:1 인 100%로 맞춘다.
// make scale =100%
void scale_100(void)

  // PORTB |= BIT(2);                // tcs230 gain control 
  // PORTB |= BIT(3);                 // s1,s0 =11 =100% 


// tcs230의 센서를 적색으로 선택
// tcs230 select red color
void sel_red(void)
{
  // PORTB &= ~BIT(4);                // tcs230 s2 =0
  // PORTB &= ~BIT(5);                // tcs230 s3 =0 
  PORTD &= ~BIT(5);                // tcs230 s2 =0 
  PORTD &= ~BIT(6);                // tcs230 s3 =0


// tcs230의 센서를 녹색으로 선택
// tcs230 select green color
void sel_green(void)
{
  // PORTB |= BIT(4);                 // tcs230 s2 =1
  // PORTB |= BIT(5);                 // tcs230 s3 =1 
  PORTD |= BIT(5);                 // tcs230 s2 =1
  PORTD |= BIT(6);                 // tcs230 s3 =1


// tcs230의 센서를 청색으로 선택
// tcs230 select blue color
void sel_blue(void)
{
  // PORTB &= ~BIT(4);                // tcs230 s2 =0
  // PORTB |= BIT(5);                  // tcs230 s3 =1 
  PORTD &= ~BIT(5);                // tcs230 s2 =0
  PORTD |= BIT(6);                  // tcs230 s3 =1


// tcs230의 센서를 백색(필터가 없음)으로 선택
// tcs230 select clear color
void sel_clear(void)
{
  // PORTB |= BIT(4);                  // tcs230 s2 =1
  // PORTB &= ~BIT(5);                // tcs230 s3 =0 
  PORTD |= BIT(5);                  // tcs230 s2 =1
  PORTD &= ~BIT(6);                // tcs230 s3 =0


// 선택된 색상으로 tcs230 출력주파수을 측정한다.
// 펄스의 측정시간은 int 변수 priod로 제어한다.
// measurement for frequency
void get_freq(void)
{
  unsigned int t;
  unsigned int i;

  // PORTB &= ~BIT(1);       // tcs230 output =enable 
  PORTD &= ~BIT(4);       // tcs230 output =enable 
  delay_ms(10);               // delay for tcs230 v/f conv
  t =period;                     // time = period * 1 ms
  pulse =0x0000;              // reset pulse
.  
  flag_1ms =0;                // reset timer 1ms        
  do
  {
  }        while (flag_1ms ==0);
  flag_1ms =0;                // sycronous to timer 1ms        
.
  for (i=0; i <t; i++)
  {
    while (flag_1ms ==0)     // not yet 1ms?
    {                
      if ((PINB &0x01) ==0)  // pulse =0 ?
      {
        flag_low =1;                // low pulsed                
      }
.
      else if (flag_low ==1)  // pulse =1 ?
      {
        flag_low =0;                 // reset low pulsed
        pulse++;                  // count up @(period * ms)
      }
    }        
    flag_1ms =0;                // reset 1ms timer                  
  }
  freq =pulse;                 // save measured pulse
  // PORTB |= BIT(1);                // tcs230 output =disable 
  PORTD |= BIT(4);                // tcs230 output =disable
}
.
적색 센서의 주파수를 읽어서 상한과 하한을 제한한다.
// read red frequency from tcs230
void get_red(void)
{
  sel_red();
  period =r_period;          // measure period
  get_freq();                  // freq from tcs230 by period
  count =freq;                // save freq

  if (count <6)
  {
    red =0;
  }
  
  if (count >255)
  {
    red =255;
  }
}
.
녹색 센서의 주파수를 읽어서 상한과 하한을 제한한다.
// read green frequency from tcs230
void get_green(void)
{
  sel_green();
  period =g_period;          // measure period
  get_freq();          // freq from tcs230 by period
  count =freq;          // save freq
.  
  if (count <6)
  {
    green =0;
  }
.  
  if (count >255)
  {
    green =255;
  }
}
.
청색 센서의 주파수를 읽어서 상한과 하한을 제한한다.
// read blue frequency from tcs230
void get_blue(void)
{
  sel_blue();
  period =b_period;          // measure period
  get_freq();          // freq from tcs230 by period
  count =freq;          // save freq
.  
  if (count <6)
  {
    blue =0;             // limit lower
  }
.  
  if (count >255)
  {
    blue =255;           // limit upper
  }
}
.
자동으로 출력이 FS가깝게 많이 나오도록 주파수 측정주기를 조정한다.
// find max value for bisection method to coverage on freq
// start with limit 0 ~ 255
// try no more than N times (range is 2^N)
void bi_sect(void)
{
  while(1)
  {        
    n++;
    if (n >12)           // bi_sect =12            
    {
      if (x >253)
      {
        flag_err =1;          // error
      }
      break;          // exit to main
    }
.
    // bisect limits
    x =upper_limit -lower_limit;
    x =(x/2) +lower_limit;
    period =x;           // save frequncy period
    get_freq();         // get freq from tcs230 by period
    count =freq;         // save frequency
.
    if (x >10)
    {
      if (count ==0)
      {
         upper_limit =x;  // modify upper limit
         continue;
      }
   }
.
   if (count <6)
   {
     lower_limit =x;          // modify lower limit
     continue;
   }
.       
    count =count -6;          // remove dark offset
    if (count ==255)    // max value for white            
    {
    if (x >253)
      {
        flag_err =1;          // error
      }
      break;          // exit to main
    }
.
    if (count >255)
    {
      upper_limit =x;    // modify upper limit
    }
.
    if (count <255)
    {
      lower_limit =x;          // modify lower limit
    }
  }        
}
.
주기는 0~255 ms으로 Fixed Ballance에서 R =230, G =220, B =190으로
사용한 백색LED의 특성과 TCS230의 White Ballance를 포함하여 맞추었고,
감도조절은 adc7에서 읽은 POT의 위치 값을 0~255로 각 색상의 측정주기에 반영하였습니다. 

// ADC7 초기화 
// ADC initialize
// Conversion time: 104uS
void adc_init(void)
{
 ADCSR = 0x00;       //disable adc
 ADMUX = 0x07;       //select adc input 7 only
 ACSR  = 0x80;
 ADCSR = 0xEF;
}

ADC7 변환종료 인터럽트 (선택된 ADC 변환값을 읽는다)
#pragma interrupt_handler adc_isr:15
void adc_isr(void)
{
  gain =ADCL;
  gain |=(int)ADCH << 8;


감도를 교정한다.
void gain_adj(void)
{  
  unsigned int calc;        
  gain_ref =gain >>2;   // 1024/max to 255/max 
 
  calc = gain_ref *red_ref;
  calc = calc /100;            // (ref * gain)/100
  if (calc >255)
  {
    calc =255;             // limit gain =255
  }
  r_period =(int)calc; 
 
  calc = gain_ref *green_ref;
  calc = calc /100;            // (green * gain)/100
  if (calc >255)
  {
    calc =255;             // limit gain =255
  }
  g_period =(int)calc; 
 
  calc = gain_ref *blue_ref;
  calc = calc /100;            // (blue * gain)/100
  if (calc >255)
  {
    calc =255;             // limit gain =255
  }
  b_period =(int)calc;


작동 모드는 Fixed White Ballance와 Calibrated White Ballance 로 2가지이며
리셋후에는 고정된 감도인 Fixed Ballance로 작동합니다.
이후 Calibrate 버튼으로 백색을 교정하면, RGB의 3개 출력이 같아 지도록,
주파수 측정용 주기(period)를 RGB 모두를 자동으로 설정합니다.
Calibrated 출력은 Reset에 의하여 Fixed 모드로 복귀됩니다.
.
적색의 감도를 적정값이 되도록 계산한다.
// read color reference from red of tcs230
void get_red_ref(void)
{
  sel_red();                 // select red color
  upper_limit =255;        // color range =max
  lower_limit =0;           // lower limit =0
  n =0;                       // start 2^n =0
  bi_sect();                  // bisect 2^n
  freq_adj();                // fine frequency adjust
  red_ref =x;               // frequency adjusted
}
.
녹색의 감도를 적정값이 되도록 계산한다.
// read color reference from green of tcs230
void get_green_ref(void)
{
  sel_green();              // select green color
  upper_limit =255;        // color range =max
  lower_limit =0;           // lower limit =0
  n =0;                       // start 2^n =0
  bi_sect();                  // bisect 2^n
  freq_adj();                // fine frequency adjust
  green_ref =x;            // frequency adjusted


청색의 감도를 적정값이 되도록 계산한다.
// read color reference from blue of tcs230
void get_blue_ref(void)
{
  sel_blue();                 // select blue color
  upper_limit =255;        // color range =max
  lower_limit =0;           // lower limit =0
  n =0;                       // start 2^n =0
  bi_sect();                  // bisect 2^n
  freq_adj();                // fine frequency adjust
  blue_ref =x;              // frequency adjusted


ADC7에 연결된 POT의 각도를 출력 조절용으로 사용한다.
void calibate(void)  
{
  // if ((PIND & 0x80) ==0)         // auto calibration ? 
  if ((PIND & 0x04) ==0)         // auto calibration ? 
  {
    // uart_puts("TCS230 White Calibration Start !");
    // uart_cr();                       // end of line 
 
    get_red_ref();                 // read red color reference
    // uart_puts("Rref ");
    // int_4asc(red_ref);             // int to 4ascii conversion
    // tx_4asc();  
    // uart_cr(' '); 
 
    get_green_ref();               // read green color reference
    // uart_puts("Gref ");
    // int_4asc(green_ref);           // int to 4ascii conversion
    // tx_4asc();  
    // uart_cr(' '); 
 
    get_blue_ref();                // read blue color reference
    // uart_puts("Bref ");
    // int_4asc(blue_ref);            // int to 4ascii conversion
    // tx_4asc();  
    // uart_cr();                       // end of line 
 
    flag_cal =1;                    // flag calibrated        
  } 
 
  else if (flag_cal ==0)
  {
    red_ref =230;
    green_ref =220;
    blue_ref =190;           // fixed color ballance
  }


tcs230match는 RS232C의 통신포트로 BS2 모듈에서 TCS230의 신호를 받는 소프트웨어입니다.
tcs230match는 연결된 이후에는 데이터를 보내지 않고, ASCII String으로 데이터를 받기만 합니다.
통신포맷은 9600,N,8,1이고, 별 다른 프로토콜은 없습니다,
 
// 직렬통신 포트의 초기화
// UART0 initialisation
// char size: 8 bit, parity: Disabled
#define F_OSC 16000000            // oscillator-frequency in Hz
#define BAUD_RATE 4800            // x2 =9600
#define BAUD_CALC ((F_OSC)/((BAUD_RATE)*16l)-1)
void uart0_init(void)
{
  UCSRB = 0x00; //disable while setting baud rate
  UCSRA = 0x02; //double baud rate
.
  // 0x86 = asynchronous 8N1
  UCSRC = (1<<URSEL)|(3<<UCSZ0);
.
  // set baud rate
  UBRRH =BAUD_CALC >>8;
  UBRRL =BAUD_CALC; 
 
  // 0x90 = Enable receiver and transmitter; enable RX interrupt
  UCSRB = (1<<RXEN)|(1<<TXEN)|(1<<RXCIE);


// 직렬통신 수신처리 (인터럽트를 사용)
#pragma interrupt_handler uart0_rx_isr:12
void uart0_rx_isr(void)
{
//uart has received a character in UDR
  rxd_buf =UDR;
  flag_rxd =1;


// 직렬통신 송신처리 (인터럽트 처리 안함)
// wait until UDR ready
void uart_putc(unsigned char tx_byte)
{
  while(!(UCSRA & (1 << UDRE)));
  UDR = tx_byte;    // send character


// 문자열 송신
// loop until *str != NULL
// c has a null code at end of string
void uart_puts (char *str)
{
  while (*str)
  {
    uart_putc(*str);
    str++;
  }
}

// cr 송신
// terminate sent string!!!
void uart_cr(void)
{
  while(!(UCSRA & (1 << UDRE)));
  UDR = 0x0d;


// 정수 2 바이트를 4 바이트 ascii 숫자로 변환하여 rgb_buf[]에 저장
void int_4asc(unsigned int val)
{
  unsigned int bcd;
  unsigned int rem;
.
  rgb_buf[0] =0x30;
  rgb_buf[1] =0x30;
  rgb_buf[2] =0x30;
  rgb_buf[3] =0x30;              // init 4 ascii buffer
.
  bcd =val;                         //get int (2 byte)
  rem =val;                         //get int (2 byte)
.
  if (rem >999)
  {
    bcd =(bcd /1000);              // get 1000's
    rem =(rem %1000);             // bcd -(1000 *n)
    rgb_buf[0] =(bcd +0x30);     // save 1000's
  }
.
  if (rem >99)
  {
    bcd =(rem /100);               // get 100's
    rem =(rem %100);              // bcd -(100 *n)
    rgb_buf[1] =(bcd +0x30);     // save 100's
  }
.
  if (rem >9)
  {
    bcd =(rem /10);                // get 10's
    rem =(rem %10);               // bcd -(10 *n)
    rgb_buf[2] =(bcd +0x30);    // save 10's
  }
  rgb_buf[3] =(rem +0x30);      // save 1's
}
.
저장된 4바이트 ascii를 송신 (최상위가 0이면 하위 3자리만 송신)
void tx_4asc(void)
{
  if (rgb_buf[0] =='0')
  {          
    uart_putc(rgb_buf[1]);
    uart_putc(rgb_buf[2]);
    uart_putc(rgb_buf[3]);
  }
.
  else
  {
    uart_putc(rgb_buf[0]);
    uart_putc(rgb_buf[1]);
    uart_putc(rgb_buf[2]);
    uart_putc(rgb_buf[3]);
  }        
}  
.
프로그램의 흐름은 메인 루틴에서 호출하는 보조함수의 기능을 보면 알 수 있듯이
보편적인 MPU의 처리순서를 보여주고 있습니다.
리셋으로 작동되는 주함수 main()은 포트 초기화를 시작으로,
ADC, 타이머0, UART 순으로 모든 하드웨어의 초기화를 끝내면,
오프닝 메세지를 Serial 포트로 송신하고, 측정과 출력을 하는 반복루틴으로 들어 갑니다.
.
// 읽어 들일 사전정의(header 어셈블러의 inc와 같음) 화일과 SRAM에 배치하는 광역변수들의 선언
// Target : M8
// Crystal: 16.000Mhz
.
#include <iom8v.h>
#include <macros.h>
.
unsigned char rxd_buf;
unsigned int gain;                    // result of adc mux7
unsigned int gain_ref;
unsigned char r_period;
unsigned char g_period;
unsigned char b_period;
 . 
// TCS230 sensor interface
unsigned char n;                   // nibble temp
unsigned char x;                  // byte temp
.
unsigned char delay;                       // measurement delay
unsigned char period;                       // frequency reference
unsigned int pulse;                    // 2000 pulse/1ms from capture
unsigned int freq;                  // frequency from tcs230
unsigned int count;                     // temp of freq.
.
unsigned int red;                    // red sensor value
unsigned int green;                    // green sensor value
unsigned int blue;                    // blue sensor value
unsigned int clear;                    // clear sensor value
.
unsigned char upper_limit;           // white referenced
unsigned char lower_limit;           // white referenced
.
unsigned char red_ref;           // red count/white
unsigned char green_ref;           // green count/white
unsigned char blue_ref;           // blue count/white
unsigned char rgb_buf[4];           // color value
.
// system flag for timer & serial
unsigned char flag_1ms;
unsigned char flag_adc;          // end of adc conversion
unsigned char flag_rxd;          // serial received
unsigned char flag_err;          // overflow error
unsigned char flag_low;          // freq pulsed low
unsigned char flag_cal;          // calibrated
.
// mega8 mpu의 입출력 포트를 초기화
void port_init(void)
{
  // PORTB = 0xFF;
  // DDRB  = 0x3E;                   // 0011 1110 <--lsb is freq. input 
  PORTB = 0xFF;
  DDRB  = 0x3E;        // 0011 1110 <--lsb is freq. input 


  // PORTC = 0x7F;
  // DDRC  = 0x3F;                   // 0011 1111 
  PORTC = 0x7F;                         // PC7은 ADC7로
  DDRC  = 0x3F;        // 0011 1111

 
  // PORTD = 0xFF;
  // DDRD  = 0x7C;                   // 0111 1100
  PORTD = 0xFF;
  DDRD  = 0x7C;        // 0111 1100


// tcs230 처리용 변수들의 초기화
void variable_init(void)
{
  // variables init
  red =0;                            // red sensor value
  green =0;                 // green sensor value
  blue =0;                            // blue sensor value
  clear =0;                            // clear sensor value 
 
  // white variables init
  count =0x0000;                 // white referenced
  upper_limit =0x0000;   // white referenced
  lower_limit =0x0000;   // white referenced 
 
  red_ref =0x00;              // red count/white
  green_ref =0x00;            // green count/white
  blue_ref =0x00;             // blue count/white


// 측정된 결과를 PC측 소프트웨어의 포맷에 맞추어 송신
//void itoa(char *string, unsigned int value, int base);
void tx_color(void)
{
  uart_putc('R');
  int_4asc(red);
  tx_4asc();
  uart_putc(' ');

  uart_putc('G');
  int_4asc(green);
  tx_4asc();
  uart_putc(' '); 
 
  uart_putc('B');
  int_4asc(blue);
  tx_4asc();
  uart_cr();


// 주함수의 시작 (MPU가 리셋되면 여기부터 시작된다)
void main(void)
{
  CLI();                     //disable all interrupts
  port_init();
  adc_init();               // 10 bit adc #7 (free run)
  timer0_init();            // init 1ms timer
  uart0_init();             // init serial port 
   
  MCUCR = 0x00;
  GICR  = 0x00;
  SEI();                     // re-enable interrupts 
 
  uart_cr();
  // uart_puts("TCS230 Color Identifying System Ver1.0"); 
  uart_puts("TCS230 Color Identifying System Ver2.0"); 
  uart_cr(); 
   
  variable_init();                // variables init for tcs230
  scale_100();                   // make scale =100% 

// 주함수의 무한반복 처리의 시작 (리셋될 때 까지 무한 반복한다)
  while(1)
  {
    calibrate();                   // calibrate mode ?
    gain_adj();                   // period =(ref * gain)/100         
 
    get_red();                   // get red data
    red =count;                  // save red freq. 
 
    get_green();                 // get green data
    green =count;                // save green freq. 
 
    get_blue();                   // get blue data
    blue =count;                  // save blue freq. 
 
    tx_color();                    // tx color data to serial
    delay =(1000 -(red_ref +green_ref +blue_ref));
    delay_ms(delay);
  }


반복루틴은 감도조정 -> R측정 -> G측정 -> 검출값 송신 ->대기의 순서로 작동합니다.
마지막으로 측정간격은 주파수 측정방식에서는 감도가 높을 때 측정시간이 길어지므로,
최대감도일때 r=255ms, g=255ms, b=255ms이므로, 전체 처리시간 1000 ms에서
측정시간을 포함하여 남은시간을 계산하여 delay_ms()에서 지연시간이 처리됩니다.
.
// 타이머0 초기화 1ms 마다 인터럽트를 발생한다
//TIMER0 initialisation - prescale:64
// WGM: Normal
// desired value: 1000uSec
// actual value: 1000.000uSec (0.0%)
void timer0_init(void)
{
TCCR0 = 0x00;           //stop
TCNT0 = 0x06;           //set count 

TCCR0 = 0x03;           //start timer
TIMSK |= 0x01;           //timer interrupt sources


// 타이머0 인터럽트 처리 (타이머를 reload하고 1ms 타이머 프래그를 세트한다)
#pragma interrupt_handler timer0_ovf_isr:10
void timer0_ovf_isr(void)
{
  TCNT0 = 0x06;           //reload counter value
  TCCR0 = 0x03;           //timer0 =pck0/32 =1/64
  flag_1ms =1;             // flag_1ms =1
}
.
// 1~65535ms 지연루틴
void delay_ms(int dly)
{
  unsigned int i; 
 
  for (i=0; i <dly; i++)
  {
    while (flag_1ms ==0)        // 1ms =0 ?
    {
    }
    flag_1ms =0;                  // 1ms =0                  
  }


이상 설명한 소스 tcs230m8.c 및 tcs230m8.hex 화일은 tcs230match.exe와 함께 첨부화일로 올라 있습니다.
다음은 소프트웨어를 수정없이 사용할 수 있도록 tcs230 색상 자동검사 장치의 시험결과 입니다. 

백색의 RGB 검출값과 색상표시 (감도를 조절하여 FS에 가깝게 230~240 정도에 맞춘다)
 
 
분홍색의 RGB 검출값과 색상표시
 
 
노란색의 RGB 검출값과 색상표시
 
 
녹색의 RGB 검출값과 색상표시
 
 
청색의 RGB 검출값과 색상표시
 
 
V1.0의 제작
센서작동표시용 SMD LED를 CAP 타입의 고휘도 백색 LED로 바꾸고,
백색 종이를 센서에 대고, 센서의 출력값이 크게 되도록 백색 LED의 취부각도를 45도로 조절한다음,
감도조정 POT를 돌려서 센서의 RGB 출력이 FS에 가까이 되도록 맞춘다,
.
감도조절은 AVR의 10 BIT ADC(adc mux 7)에 5K ohm의 POT를 연결하여,
이 값으로 TCS230의 출력주파수 측정용 주기를 조절하였습니다.
또한 남는 포트(portd 7)에 TACT SW를 연결하여, 측정시 주위 조명이 바뀌었을 때,
버튼을 누르면 언제라도 RGB의 출력값이 FS이 되도록 White Ballance를 맞추도록 하였습니다. 

ADC6와 ADC7은 M8에서 유일하게 아날로그 입력 전용핀인데요,
TCS230 칼라센서 응용에서는 ADC7을 감도조정용 5K ~ 10K 가변저항(P1)을 연결하였습니다.
피사체 조명용 백색 led는 3mm 제품을 4개 직렬저항 4개와 함께 전원에 직접 연결한다.

U1 TCS230은 SO8 SMD 패키지를 사용하여 작은 기판에 독립하여 조립,
배선이나 2.54mm 간격의 한줄 콘넥터로 MPU 기판에 수직으로 결합이 되도록 하였습니다.
즉 MPU 기판을 수평으로 놓으면 센서의 검출방향이 전방으로 가도록 설계하였습니다.

 
센서 연결방법
TCS230 1번은 S0 =VCC
TCS230 2번은 S1 =VCC
TCS230 3번은 /OE =PB1
TCS230 4번은 GND
TCS230 5번은 +5V
TCS230 6번은 OUT =PB0
TCS230 7번은 S2 =PB4
TCS230 8번은 S3 =PB5
.
TAOS 칼라센서 TCS230을 사용한 색상인식 장치의 회로도 V1.0 (MPU는 ATmega8, USB는 FT232BM을 사용) 
  
6핀 ISP 콘넥터를 USB 인터페이스와 함께 PCB에 추가하였습니다.
ISP 1번은 PB4/MISO (MISO)
ISP 2번은 +5V (VCC)
ISP 3번은 PB5/SCK (SCK)
ISP 4번은 PB3/MOSI (MOSI)
ISP 5번은 /RST (RESET)
ISP 6번은 GND (GND)

최종적으로 개발된 V2.0 제품의 사진 
  
 
MPU는 Mega8-16AI를 사용하고 있고, USB 인터페이스는 FT232BM을 사용하고 잇습니다.
또한 TCS230 칼라센서와 조명용 백색 LED 4개는 밑면에 장착되어 있습니다.
좌측의 SW는 자동백색조정과 리셋이며,  POT는 검출 감도조정입니다.
우측상단의 적색SW는 전원스위치이며, 우측 중앙에 USB 콘넥터를 장착하였습니다. 

V2 에서 변경된 포트
#define bal_led    7      // PD7 = Ballanced indicator        
#define tcs230_s3  6     // PD6 = 10/clear, 11/green
#define tcs230_s2  5     // PD5 = 00/red, 01/blue
#define tcs230_oe  4      // PD4 = /output enable
#define white_led  3      // PD3 = white LED control
#define cal_sw 2      // PD2 = calibrate switch

#define freq_input 0      // PB0 =frequency input
#define sens_adj 7       // PC7 =sensitivity adjust

이 자료의 일부 혹은 전부, 그리고 이 글을 인용하여 개조한 결과물의 무단복제 및 무단배포를 모두 금합니다.
단 아래와 같이 원저자와 참조 사이트를 글과 함꼐 게시하는 조건으로 허용합니다.
You do not use this code for commercial purpose. This code is free for study only .

원저자 : http://avrtools.co.kr/
참조 : http://www.taosinc.com/
참조 : http://www.parallax.com/
참조 : http://www.ftdichip.com/
참조 : http://www.atmel.com/

이 자료의 무단 복제, 배포 및 사이트 링크없는 무단게시를 일절 금합니다.

 AVRTOOLS™
   
윗글 ODB-II 엔진 스캐너 PC 인터페이스 제작
아래글 74HC595를 사용한 소형 8x24 LED 전광판의 제어
    N         제목    글쓴이 작성일 조회 추천
14 가변-정전압,정전류-직류전원의 제작 avrtools™ 2011/08/08 (월) 231 0
13 전력제어기기는 USB 포트를 절연하자 avrtools™ 2011/07/03 (일) 180 0
12 Arduino IDE에서 AVRISP-mkII 사용방법 avrtools™ 2010/10/22 (금) 184 0
11 AVR studio용 USBasp to AVR-ISP 제작 avrtools™ 2009/10/22 (목) 305 0
10 ATmega8 AVRISP-mkII의 제작 avrtools™ 2009/09/30 (수) 428 0
9 VGA CAM C328R 카메라 모듈의 제작 avrtools™ 2009/08/12 (수) 211 0
8 ODB-II 엔진 스캐너 PC 인터페이스 제작 avrtools™ 2008/10/04 (토) 492 0
7 Mega8 칼라센서 TCS230 색상인식 장치 leeky 2006/03/07 (화) 856 3
6 74HC595를 사용한 소형 8x24 LED 전광판의 제어 [3] leeky 2006/05/02 (화) 1340 3
5 ATmega8을 사용한 EM4095 RFID Reader의 제작 [1] leeky 2007/02/04 (일) 758 0
4 13.56MHz ISO-15693 RFID 태그 읽기장치 제작 [5] leeky 2007/03/15 (목) 642 0
3 AVR 프로그래머 AVR910-ISP 제작 [1] leeky 2006/08/06 (일) 1099 0
2 USB AVR-ISP의 제작과 펌웨어 Upgrade leeky 2006/03/07 (화) 1345 8
1 JTAG ICE의 제작과 펌웨어 업그레이드 leeky 2006/03/07 (화) 1026 3
1

바구니 : 0
 보관함 : 0
오늘뷰 : 0
HOME   |   회사소개   |   제휴안내   |   회사위치   |   서비스이용 약관   |   개인정보 보호정책   |   사이트맵
17015 경기도 용인시 기흥구 동백중앙로16번길 16-25, 508호. 전화 : 031-282-3310
사업자 등록번호 : 697-47-00075 / 대표 : 이건영 / 업태 : 제조업 / 종목 : LED조명, LED전원, 제어장치.
개인정보 관리책임자 : 홈페이지 관리자 . Copyright ⓒ2016 아크레즈 (ACLEDS INC.)
HOME TOP PREVNEXT 0 0 0