CMOS 카메라 Treva의 PC화상표시

AVR Project 조회 수 17268 추천 수 42 2003.09.22 10:31:47


http://www.paken.org:8080/aaf/treva/index.htmlipstack
CMOS 카메라 Treva의 PC화상표시

feel H용 이미지 캡쳐유닛 Treva를 범용 CPU로 접속합니다.
입력과 출력을 1가닥의 신호선으로 OK!가장 간단한? 이미지 센서입니다.
feel H용 이미지 캡쳐유닛 Treva로 자작회로에 접속해 보세요.
Treva에는 CMOS 이미지센서가 쓰이고 있습니다.
소형, 경량, 저소비 전력으로 그러나 대량생산 때문에 싼가격입니다.
(2000엔~3000엔정도로 인터넷에서도 저가로 출하하고 있습니다.)

Treva 인터페이스의 해석, MPU의 병렬포트로 접속, 화상의 읽기에 성공하였습니다.
Treva에서 촬영한 데이터는 직렬포트를 경유하여 PC에서 읽고,
RGB로 변환하였습니다. 원래 크기는 96 X 72 픽셀입니다.

■ Treva의 규격
카달로그와 실제로 측정한 데이터입니다.
본체크기 30 X 32 X 16(mm)
중량 약10g
촬상소자 1/4인치,10만 화소 CMOS 이미지센서 OV6630 (OmniVision사)
해상도 96 X 72 pixel
렌즈 고정촛점(30cm~∞) 각도:수평46° 수직 37° (실측치)
노출 자동제어(실내・실외의 촬영에 대응)
백색 발란스 자동조정
접속 플럭그  φ2.5mm 4핀 플러그  (이어폰-마이크단자)
전원 3V (3.3V에서 동작확인) 15~20mA
프레임속도 표준:약 3 프레임/초,최대:약 7.7 프레임/초
화상 포맷 16bit YUV 형식
가격 신품 3500엔 정도,중고 2000엔 정도(2001년9월月현재)

소비전류는 5mA@3.3V입니다. 전원전압이 바뀌면,
고속클럭을 넣으면, 변동되나 실측에서는 약 20mA 까지된 적이 있습니다.

■ MPU와의 접속
자르지 않고 분해하여 선을 잡아 당깁니다.
플라스틱을 자르지 않고도 힘으로 열립니다.
플러그에 연결된 4가닥의 전선이 나옵니다.

플러그에서 4색의 선은,기판의 패드에 접속되어 있습니다.
DOUT(황),CLK_IN(분홍),GND(흑),Vcc(적)입니다.

DOUT은 Treva의 직렬데이터 출력입니다. CPU의 입력포트에 접속합니다.
CLK_IN은 CPU에서 Treva로 공급하는 클럭입력입니다. CPU의 출력포트에 접속합니다.
Vcc는 3V (3.3V라도 문제없이 동작합니다)의 전원을 공급합니다.
GND는 전원의 접지입니다.

여기서 접속하는 CPU가 3V 혹은 3.3V 동작의 경우는 직결합니다.
5V 동작의 경우는 신호레벨의 변환을 하지 않으면 안됩니다.
Treva에서 CPU로 가는(DOUT)은 Treva가 3V를 출력하기 때문에,
CPU 포트가 TTL 레벨로 있으면 직결가능합니다.
이렇지 않은 경우는 입력이 TTL 레벨의 게이트 IC를 넣어야 좋습니다.

CPU→Treva방향(CLK_IN)에 있어서는  필히 5V→3V의 레벨변환이 필요합니다.
Open Collector의 게이트를 넣어 출력을 3V로 올리는 것이 간단합니다.
정전압 다이오드를 쓴다든지,TR 2개로 Push-Pull 회로를 만드는 방법도 있습니다.
또한,3V(3.3V)의 전원을 만드는 3단자 전압 안정기를 써도 간단합니다.

Panasonic사의 feel H에는 잭이 있는데, 잭은 매우 싸게 구입됩니다.
"KX-HS100"을 근처의 오트파츠 카메라에서 1개 100엔으로 구입하였습니다.
2001년 9월 현재,점두에는 KX-HF300 , KX-HS110의 목합이 전시되어 있는데,
(잭이 붙어 있는것을 확인),오랫만에 입수가능한 상태가 계속되고 있습니다.

잭의 핀 배치는 위와 같다. 잭은 표면실장형입니다.
기판에 접착하여 쓰는것이라고 생각합니다.
잭은 핀 배치가 틀린 경우도 있습니다. 확인하여 주십시요.

■ 데이터의 취급

데이터를 읽으려면 CPU에서 CLK_IN을 101010...으로 클럭을 줍니다.(그림에서 위의 파형).
그리하면 DOUT에서 직렬 데이터가 출력됩니다. (그림에서  아래의 파형).
그림에서 알수 있듯이,입상 에지로 DOUT의 데이터를 1bit 로 읽으면 OK입니다.
CLOCK 주파수는 표준(feel H 에서 출력)으로 약500KHz 이므로,
1.7MHz 정도까지는 정상으로 동작하는 것을 확인 하였습니다.
늦은 것은 얼마나 늦어도 되는지(10kHz 까지) 작동하는 것을 확인하였습니다.
보내는 데이터 포맷의 해석은 아래와 같이 판명되었습니다.
(jellyfish씨, yama씨로 부터 자세한 데이터를 제공받았습니다, 감사합니다)

프레임과 프레임 사이에서 DOUT은 '1'로 됩니다.
영상 데이터의 앞에 가변길이의 데이터 정보가 붙습니다. (256 비트정도).
0과 1이 몇회를 반복합니다.
(주어진 클럭의 주파수에 의해 횟수가 부정확하게 변화합니다),
이후, 아래와 같이 계속됩니다. (16진으로 표현),
AA 55                            : 동기코드(더미)
FF D8                            : 프레임 시작표시
1C                               : 헤더의 바이트수 (28바이트)
F0                               : 모델타입 (여기서는 카메라)
F1                               : 버전코드 + 번호 (여기서는 1)
00 60                            : 1줄의 화소수 (96화소)
00 48                            : 줄의 수 (78라인)
81                               : 8 =밝기단계, 1= YUV타입
31                               : 3 =UYVY 데이터 출력, 1 =MSB스타트
20                               : 2 =(4.2.2)타입, 0 =비압축 데이터
4B 43 23 38 42 50 2E 2E          : 메이커 정보
00 00 00 00 00 00 00 00          : 사용자 정보
AA 55                            : 동기코드(더미)

헤더의 마지막부분의 AA 55 직후부터 영상 데이터의 출력이 시작됩니다.
(AA,55를 시작코드로 인식 하토록 프로그램한다.)
화상데이터를 끝내는 End Mark는 FF D9로 들어옵니다.
데이터는 MSB(최상위 비트)부터 순서데로 보내집니다.
16비트로 1화소의 데이터가 됩니다.

다음과 같은 수순으로 화상을 읽기좋게 됩니다.
오랫만에 연속으로 1 이 들어옵니다.
동기코드 AA55FF를 확인하여, 계속되는 29바이트의 데이터를 무시,
(혹은 2 대신에, 65비트 연속된 0 을 기다리며, 후속되는 2 바이트를 무시)
96 X 72 X 16 비트분의 화상 데이터를 읽는다.
500KHz의 클럭을 공급하면, 1초에 3장의 화상을 촬영할 수 있습니다.
클럭 주파수를 올리면, 최대 1.6Mhz 정도까지 정상으로 동작합니다.
이때는 1초에 7장 정도의 화상을 촬영하는 것이 가능합니다.

■ 프로그램의 예
/* 1 비트를 읽는 처리 */
int
read_bit ()
{
  int i, a;

  PDTRA = PDTRA & ~0x0040;  /* CLK = 0 */
  for(i=0; i<42; i++);      /* 대기 42는 500kHz 발생용  */
  a = PDTRA & 0x0080;       /* 입상에서 DOUT을 읽음 */
  PDTRA = PDTRA | 0x0040;   /* CLK = 1 */
  for(i=0; i<42; i++);      /* 대기 42는 500kHz 발새용  */
  if(a)
    return 1;
  else
    return 0;
}

/* 메인루틴 */
void
start_main (void)
{
  unsigned char data[96*72*2+100];
  .....

  while(1){
    /* PC에서 문자 s를 보내면 화상입력을 시작 */
    while( scif_getc() != 's' )
      read_bit();
    /* 100 비트 연속 1을 유지 */
    i = 0;
    while(i<100){
      if( read_bit() == 1) i++;
      else i = 0;
    }

    /* 연속으로 65 비트를 '0'을 검출 */
    i = 0;
    while(i<65){
      if( read_bit() == 0) i++;
      else i = 0;
    }

    /* 계속된 2바이트의 데이터를 무시 */
    for( i=0; i<2*8; i++ )
      read_bit();      // 읽기만 하고 처리안함
    
    /* 여기부터 화상데이터 읽기시작 */
    for( k=0; k < 96*72*2; k++){    //데이터 바이트수 =96(가로) *72(세로) *2 (16비트/1화소)
      d = 0;    
      for (i=0; i<8; i++){    //8비트(1바이트) 반복 루틴
        d <<= 1;
        if(read_bit())
          d |= 0x1;
      }
      data[k] = d;
    }
    /* 읽은 화상 데이터를 PC로 전송 */
    for( k=0; k < 96*72*2; k++){
      scif_putc(data[k]);
    }
  }
}

■ 시작코드를 보는 쪽.
    .....
    /* 시작코드 '0xaa55ff'를 대기 */
    magic = 0;
    while((magic & 0xffffff) != 0xaa55ff){
      magic <<= 1;
      if(read_bit())
        magic |= 0x1;
    }
    /* 계속해서 29 바이트의 데이터를 무시 */
    for( i=0; i<29*8; i++ )
      read_bit();
    .....

■ 화면 포맷
읽어낸 화상데이터를 해석해 보면,
변칙적인 YUV 형식의 포맷이다 (OV6630의 데이터 시트를 참조).
이전의 설명과 같다. 1화소마다 16 비트의 데이터로 구성되어 있으므로.
전반의 8비트는 색도값이다. 후반의 8비트는 휘도값(Y)이다.
짝수위치의 화소는 V, 홀수위치의 화소는 U가 들어 있습니다.
다시 말하면 VYUYVYUYVYUY....로 계속됩니다.
1 pic-cell(화소)의 데이터 구성은 16bit로
15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0
색정보는 U, 혹은 V, 휘도값은 Y.
그레이스케일(흑백) 화상은 96 X 72 pixel의 해상도를  가지고 있으며,
컬러정보로는 48 X 72 pixel의 해상도 밖에 안됩니다.

아래의 식은 YUV에서 RGB로 변환을 합니다.
R = (U - 128) + Y
G = 0.98*Y - 0.53*(U - 128) - 0.19*(V - 128)
B = (V - 128) + Y

또는
R = 1.40*(U - 128) + Y
G = 1.02*Y - 0.750*(U - 128) - 0.336*(V - 128)
B = 1.77*(V - 128) + Y

어느 식을 쓰는가로 색의 혼합이 달라집니다.
첫번째의 식이 정답인것 같으며,
2번째 식은 주변이 어두워도 잘 찍히는 느낌입니다.

■ 프로그램의 예
  unsigned char img[96*72*2];
  /* PPM 형식 (UNIX 에서 쓰는 화상데이터 정보의 출력 */
  printf( "P6\n" );
  printf( "96 72 255 " );

  .....(img[] 에 화상 데이터를 저장).....

  for(i=0; i<72; i++){
    for(j=0; j<96; j++){
      p = (i*96 + j)*2;
      Y =  img[p+1];
      if( j % 2 == 0){
        V =  img[p];
        U =  img[p+2];
      }else{
        V =  img[p-2];
        U =  img[p];
      }

      U = U - 128.0;
      V = V - 128.0;

      red = U + Y ;
      green = 0.98*Y - 0.53*U - 0.19*V;
      blue = V + Y;

      if( red > 255 ) red = 255;
      if( red < 0 ) red = 0;
      if( green > 255 ) green = 255;
      if( green < 0 ) green = 0;
      if( blue > 255 ) blue = 255;
      if( blue < 0 ) blue = 0;

      /* RGB 화상을 출력 */
      printf( "%c",  (unsigned char)red );
      printf( "%c",  (unsigned char)green );
      printf( "%c",  (unsigned char)blue );
    }
  }


위의 소스는 UNIX에서 쓰는 PPM 포맷의 화상을 출력하고 있습니다.
대단히 간단한 포맷으로 Windows에서 읽고 쓰기는 소프트도 있습니다.
이 포맷은 PPM/PGM/PBM 형식의 화상으로 하십시요.
http://www.paken.org:8080/linux/linux-tips/ppm-images.html

■ PC 직렬포트로 접속

PC의 직렬포트와 접속하는 방법입니다.
Treva를 빨리 시험하는 것이 아닙니다.
자세한 기사를 참조해 주십시요.
회로도에서 전원은 USB에서 얻고,
3단자 전압안정기로 3.3볼트로 만듭니다.

화상을 읽기 위한 샘플프로그램을 바꾸었으므로,
참고로 보시기 바랍니다.

linux-sample.tar.gz (Linux用)
http://www.paken.org:8080/aaf/treva/linux-sample.tar.gz
win-sample.lzh (Windows用)
http://www.paken.org:8080/aaf/treva/win-sample.lzh
<- 받아서 풀면 오류가 있습니다, 받지 마세요.

■ 제한사항
이것은 극히 간단하게 화상을 읽는 것이 가능합니다.
(세계에서 가장 간단한 영상소자인가?)
그러나 화상인식에 쓰는 것은 조금 부족한 점이 있습니다.
아래사항을 고려하고 채용하는 것이 좋지 않을까 생각합니다
엄밀한 촬영 타이밍은 제어되지 않습니다.
백색보정,노출시간은 자동으로 됩니다.
30cm 이하의 근거리는 だと핀을 ぼけ합니다.
20cm의 거리라도 위와 같은 사진정도는 촬영됩니다.
원거리는 초7콤마 정도밖에 촬영되지 않습니다.
이러한 제한을 제외하면 충분히 매력적이라 생각합니다.
마지막으로 이것뿐 입니까? 내년의 로봇대회에서 빨리 쓰려는 사람이 있다면,
간단하게 접속이 되므로, 로봇에 탑재하려면,
Web카메라로 하고 싶으면, 들고 다니는 PDA에 접속하는 등,
응용범위는 넓다고 생각합니다.
설명에서 부족한점이 있는지 지적하여 줍십시요,
응요예의 Report나 추가정보도 환영합니다.
메일이나 게시판을 이용해 주십시요.

■ USB로 Treva를 접속
http://www02.so-net.ne.jp/~takeyama/usb/usbcamera.shtml
Treva + PIC + USBN9603という構成でUSBカメラを実現されています. ホスト側のプログラムはPython! 5V→3Vの変換をトランジスタ1個で 済ませているのもすばらしいです.

■ C8051F300용 bluetooth 모듈제어
C8051F300용 bluetooth 모듈제어 (14K바이트 LZH 압축)
http://www.asahi-net.or.jp/~qx5k-iskw/robot/blue/treservo.lzh
PC용 bluetooth 모듈제어 (1.2M바이트 LZH 압축)
http://www.asahi-net.or.jp/~qx5k-iskw/robot/blue/tresvopc.lzh

■ Treva on TINI
http://www.tini.org/src/ichiro/treva/html/
TINI로 Treva를 접속하고 있습니다. TTL로 레벨 변환을 하고 있을 뿐입니다.
간단하고 좋습니다. 교세라 feelH 이미지 센서 Treva를 TINI에 태웁니다.

소스는 이곳에서
http://www.tini.org/src/ichiro/treva/src
바이나리(camera.tini는 1.1beta2)는 이곳에서
http://www.tini.org/src/ichiro/treva/bin
회로도는 이곳에서
http://www.tini.org/src/ichiro/treva/html/treva_sch.jpg

■ AVR STK500
http://stk500.hp.infoseek.co.jp/index.html
AVR의 STK500으로 Treva를 접속하여,
에지추출 등의 영상처리를 하고 있습니다.

■ TINI로 라이브 카메라
http://kobayasy.com/tini/
TINI로 Treva를 접속하여 라이브로 카메라를 실현하고 있습니다.

■ Treva 기판키트
http://strawberry-linux.com/diy/treva/
20mm ×20mm로 컴팩트합니다.3φ의 고정구멍도 보이는데,
장치에 고정하거나, 로보트에 고정하는 용도입니다.

■ 마지막으로,
해석이 가능한 좋은지는 미지수 이므로 Treva를 구하고,
기초자료에 있어서 이시까와씨에게 다시 감사합니다.
이시까와씨의 데이터는 가능한 조목조목 해석을 하고 있습니다.
헤더에 대한 정보를 준 jellyfish씨에도 감사를 드립니다.
틀린 것을 고치고,화질의 개선을 해주었습니다.
Copyright © 2001-2003 KOMORIYA Takeru (update: 11/25, 2002)

번역 : ipstack@ipstack.co.kr


List of Articles
번호 제목 글쓴이 날짜 조회 수

AVR Project PIC Based Serial Port Servo Controller file

http://www.digitalnemesis.com/ash/projects/picservo/ ◆ PIC Based Serial Port Servo Controller By Ashley Roll Ever wanted to use Servos in a robotics project? This project uses a PIC microcontroller and...

AVR 강좌 RS-232 란 무엇인가? file

RS-232 란 무엇인가...

AVR 강좌 하드웨어 기초 file [1]

윤덕용 새 페이지 1 외부 자료 Link 작성자 Thinking in C++, 2nd ed. Volume 1 Bruce Eckel Thinking in C++, 2nd ed. Volume 2 ...

AVR Project FT245AM을 사용한 USB 인터페이스 설계 file

http://www.eix.co.uk/Ethernet/USB/ FT245AM을 사용한 USB 인터페이스 설계 USb는 생각보다 빠르다. USB는 PC의 저속에서 중속의 주변장치에서 새로운 방법을 제공한다. 새로운 USB 표준은 RS232C와 비교하면 보다 ...

AVR Project VHF 무선 데이터 수신기 file

http://jaichi.virtualave.net/avr-prog-e.htm 새 페이지 1 VHF 무선 데이터 수신기 ■ 회로: 이 수신기는 증폭도과 함께 크리스털 세트보다 작습니다. 작동전압 범위는 3V 에서 5V입니다. 나의 책상위에서는 2.5V이하로 작동합니다....

AVR Project VHF 무선 데이터 송신기 file

http://users.cableaz.com/~cappels/dproj/LCRFLINK/TRRxmtr/TRFxmtr.htm 새 페이지 1 산뜻한 생각으로 대략 접근하는 무전원의 송신기를 그렸다. 쓰기 시작하기 전에. 디커플링 캐패시터를 너무 크게 만들지 않도록 주의하라 그래서, ...

AVR Project AVR 6디지트 50MHz 주파수 카운터 file

http://www.myplace.nu/avr/countermeasures/index.htm AVR 6디지트 50MHz 주파수 카운터 ■ 개요 이것은 필요에 충족하는 또 다른 프로젝트이다. 나는 TTL 칩들을 이용해 간단히 주파수 카운터를 조립한적이 있다. 그것은...

AVR Tool AVR JTAG ICE file

Description: The Atmel AVR® JTAG ICE is an In-circuit Emulator for Atmel's megaAVR® Flash microcontrollers with 16K or more program memory. The JTAG ICE talks to the On-Chip debug module on the...

AVR Project PIC 전자식 그림간판의 제작(AVR로 응용가능) file

http://www.interq.or.jp/japan/se-inoue/e_pic6_2.htm 16F84A의 전자식 그림간판 메세지는 오른쪽에서 왼쪽으로 흐르며 표시한다. 128 개의 LED를 이 기판에 사용하였다. 이 장치의 소프트웨어는 다음과 같은 기술을 사용하...

AVR Project AVR JTAG 에뮬레이터의 제작 file

http://avr.openchip.org/bootice/index.html ■ BootICE(아트멜 AVR JTAG ICE와 호환)를 만들자 아직도 JTAG ICE를 많은 돈을 주고 구입하십니까? 여기에 완전하게 호환되는 BootICE의 완전한 설계(회로도,기판,소...

AVR Tool AVR Studio V4.07 설정방법 및 디버거 사용방법 file

http://www.atmel.com/ipstack AVR Studio V4.07 설정방법 및 디버거 사용방법 (1) 다음 사이트를 방문하여 AvrStudioV4.07을 받는다. http://www.atmel.com/dyn/products/tools_card.asp?tool_id=2725 그림과 같은 CD모양의...

AVR Project CMOS 카메라 Treva의 PC화상표시 file

http://www.paken.org:8080/aaf/treva/index.htmlipstack CMOS 카메라 Treva의 PC화상표시 feel H용 이미지 캡쳐유닛 Treva를 범용 CPU로 접속합니다. 입력과 출력을 1가닥의 신호선으로 OK!가장 간단한? 이미지 센서입니...

AVR Project AT90S2313 디지털 용량계 file

http://elm-chan.org/works/cmc/report.htmlipstackAT90S2313 디지털 용량계 이것은 용량을 빨리 측정하는 간단한 용량계이다. 용량의 측정 원리는 임피던스 브릿지나 딥메터처럼 용량을 한번에 측정한다. 요즈음의 표준 용량계는 Cx에...

AVR Project AVR로 만드는 3채널 다이오드 온도계 file

http://elm-chan.org/works/temp3/report_j.html 다이오드로 온도를 측정하는 3채널 온도계의 제작 고정도 써미스터를 사용하여 무조정으로 ±0.5℃の 온도정도를 실현을 하였습니다만, 최근의 프로세서는 다이온도를 직접 모니터하...

AVR Project Treva or DMR-C1 Serial Camera Interface file [3]

http://homepage3.nifty.com/mujirushi/ews/dmrc1/ipstackTreva Serial Camera Interface 이 페이지에는 독자적으로 해석한 내용이 포함되어 있으므로, 반드시 내용을 보증하는 것이 아닙니다. 이용에 있어서는 자기책임으로 하여 주시기...

AVR Project Treva를 Blutooth에 연결한 무선이동 카메라 file

http://www.asahi-net.or.jp/~qx5k-iskw/robot/blue.htmlipstack ■ Treva를 Blutooth에 연결한 무선이동 카메라 모듈의 VCC, VCC_IO, ON단자에 3.3V를 공급하고, TxD, RxD를 PC의 직렬포트에 접속합니다. 이제 모듈을 ...

AVR Project AVR90S2313과 Treva 카메라 file

http://stk500.hp.infoseek.co.jp/treva.htmlipstack 최근 마이콤등으로 움직이는 방법이 증가하고 있는 FeelH용 CMOS 카메라인 Treva입니다. STK500에는 부속된 2선식 케이블로 Vcc-GND, SCK-DO의 형태입니다. Treva와 STK500의 ...

AVR Project AT90S2313을 사용한 IR to USB 모듈 file

http://www.cesko.host.sk/IgorPlugUSB/IgorPlug-USB (AVR)_eng.htm Universal USB interface & USB Infrared Interface with microprocessor AT90S2313-10 : 마이크로 콘트롤러로 USB를 완성 : IgorPlug-USB (AVR) 이기사의 ...

AVR 강좌 AVR Mega128 퓨즈비트 설정방법 file

http://www.tns-tech.co.kr128 퓨즈비트 설정방법...

AVR Project AVR Mega8을 사용한 PID제어 소스 file

http://www.circuitcellar.com/library/print/1002/eady147/index.htm LCD에 보이는 것은 실제 조리기의 온도와 음식3개의 온도이다. 압전 경보기가 꺼져 있으면, 조리기의 온도는 5° 간격으로 180° 에서 400°F이다. 음...