2010년 3월 31일 수요일

AVR에서 이미지 캡쳐하기 (OV7670)

다음은 AVR(ATmega32L)에서 카메라 모듈(OV7670)의 이미지 정보를 읽어온 소스 코드이다.

흔히들 AVR이 이미지를 캡쳐하는데 무리가 있다고들 하지만...

정지된 화상을 오랜시간에 걸쳐 촬영해도 무리가 없다면(정보가 크게 변하지 않는다는 가정하에)

AVR로도 나쁘지 않은 성능을 보인다고 할 수 있다.


void capture(void)
{
unsigned int y, r, h, photo_addr=0;

for(y = 0 ; y < 352 ; y++) {
while(isVSYNdown); // wait for HIGH
while(isVSYNup); // wait for LOW
for(r = 0 ; r < 144 ; r++) {
while(isHREFdown);
if( (y%2) == 1 ) { // use Y value
for(h = 0 ; h < y ; h++) {
while(isPCLKup);
while(isPCLKdown);
}
sei();
i2c_WriteByte(photo_addr++, PINY); // 외부 eeprom에 저장
cli(); // interrupt disable
}
while(isHREFup);
}
}
i2c_stop(); // STOP-signal send
}

일단 내부 저장공간에는 한계가 있기 때문에 외부 EEPROM으로 저장하였다(소스에서 확인가능)

또한 영상정보중 Y값만을 이용한 것을 볼 수 있다.

이렇게 해서... 약 6분동안 흑백이미지 한장을 얻었다.. ㅡㅡ;;

이미지 크기는 QCIF(176 X 144)이다.
<촬영한 이미지>

Op Amp Circuit Collection

Op-Amp 구성시 회로에 대해 헷갈리는 경우가 많다.

고맙게도 NI에서 관련된 회로 구성을 문서화 해 두었다.

Op-amp 구성시 참조하면 큰 도움이 될 듯하다 ^^

문서의 일부분만 발췌하였다.


링크를 참조하도록 하자.

2010년 3월 30일 화요일

[매트랩] 이미지 처리 관련 명령어 정리

* 매트랩 이미지 처리 관련 명령어를 간단히 정리하고자 한다.(추가 할 예정)

* 이미지 파일 읽기
>>A=imread('test.tif');

* 이미지 파일 화면 출력
>>imshow('test.tif');

* Histogram Equalization : 픽셀값들이 좁은 영역에 몰려있을 경우 평탄화 시킴
>>histeq(A);


* Intensity Adjust : 중요도가 낮은 부분(상당히 밝은/어두운 부분)을 특정 값에서 saturation 시키고 남은 영역을 높은 bitrate로 표현한다.

>>imadjust(A);


* 이미지파일 생성

>>imwrite(A,'temp.png');

% A라는 배열을 temp.png 파일로 저장한다.


* 이미지파일의 히스토그램 보기

>>imhist(A);

% 이미지를 A 배열로 읽은후 사용함.


* 이미지파일 정보 출력

>>imfinfo('test.tif')

% 마지막에 세미콜론을 붙이지 않은 이유는, 세미콜론을 붙이면 출력이 되지 않고 ans로 저장만 되기 때문이다.



[Line-tracer] 햇살 2006

순서가 뒤바뀐 느낌이지만 소스코드를 먼저 올리고 프로젝트 관련 설명을 올리게 되었다...ㅡ.ㅡ

2006년 전역이후 처음으로 학교를 다니면서 의욕이 불타던 시기의 작품이다.

지금보면 허접하지만 굉장히 여러번 다듬은 차체다!!

어쨋거나... 전체적인 틀을 모르고 소스만 접하면 이해가 어려우므로

차근차근 하나씩 설명하도록 할 예정이다.(휴...)

당시 제작했던 차체이다.

외관이 허접하기는 하지만

꽤나 빠른 주행을 보여주었다.(직선에서만ㅎ)

당시 금상 수상~ ^^V


그럼 간단히 구조도를 보도록 하자.

위 그림은 라인트레이서의 가장 간단한 구조도라고 생각한다.

우선 발광센서와 수광센서를 통해 라인을 인식하고(센서인터럽트 소스 참조)

엔코더 값을 통해 얻은 속도값을 가지고 PID제어를 하게 되며, 그 값으로 DC모터를 제어하게 된다.
(PID제어 소스 참조)

서보모터는 센서를 통해 얻은 값으로 차체를 운전하게 된다.

[Line Tracer] 지능형 모형차 경진대회 2008 - PID 제어부

지난번에 올린 센서 인터럽트와 함께 사용되는 이벤트 이다.

대회당시에는 1kHz로 동작하도록 하였는데, 나름 최적의 제어주기라고 생각한다(ㅡㅡ;;)근거는... 마땅하지 않지만...

지난번과 마찬가지로 중요한 부분엔 모두 주석이 있으므로 크게 문제가 없을 것이라고 생각한다.



void Timer_OnInterrupt(void)
{
  //DC Motor
  long P, I, D;
  int PID;

//  Debug_Pin_PutVal(1); // 디버그용으로 사용

  Light_Sensor_PutVal(1); // 발광 센서 켜기

  //엔코더 값 읽기 현재는 A상만 읽음.
  encCnt = Enc_A_GetCounterValue();
//  Enc_A_ResetCounter();
 
//  LineView_PutVal(time_ms);
LineView_PutVal(0x16);
  motor.kp = P_VALUE;
  motor.ki = I_VALUE;
  motor.kd = D_VALUE;

  motor.error = USER_SPEED - encCnt;
  motor.errorIntegral += motor.error;
 
  if (motor.errorIntegral > 255)
      motor.errorIntegral = 255;
  else if (motor.errorIntegral < -255)
      motor.errorIntegral = -255;

  P = motor.error * motor.kp;
  I = motor.errorIntegral * motor.ki;
  D = (motor.error - motor.errorBefore) * motor.kd;

  PID = P;
  PID += I;
  PID += D;

  motor.errorBefore = motor.error;

  if (PID > 255)
    PID = 255;
  else if (PID < -255)
    PID = -255;
  if(PID > 0 )
  {
    (void) Motor_B_Disable();
    (void) Motor_A_Enable();  
  (void) Motor_A_SetRatio8(255 - PID);
  }
  else
  {
    (void) Motor_A_Disable();
    (void) Motor_B_Enable();
    (void) Motor_B_SetRatio8(255 + PID);
  }
  //  delay(0x0014);
  (void)Sensor_Start();  
}

2010년 3월 29일 월요일

[Line Tracer] 지능형 모형차 경진대회 2008 - 센서 인터럽트

2008년도 지능형 모형차 경진대회에 참가했던 소스를 공개합니다...

엔코더가 고장나는 바람에 예선주행을 잘 달렸음에도 불구하고... 본선에서 좌절을 맛보았지만...

라인트레이서를 처음 접하시는 분이라면 큰 도움이 될 것 같네요.

원하시는 분이 계시다면 하드웨어 관련 자료도 포스팅 하도록 하겠습니다 ^^

참 MCU는 MC9S12DP256B입니다.

댓글 많이 달아주세요~
소스코드1차 - 센서 인터럽트 부분

void Sensor_OnEnd(void)
{
  byte i;
  byte key_down=0;
  int tmp_SensorMin;
  signed int ErrLine;

  // Sensor and Servo
  (void)Sensor_GetValue8(SensorVal); // 현재 센서값 읽기
  Light_Sensor_PutVal(0); // 발광 센서 끄기
  (void)Sensor_Stop(); // ADC Stop

for(i = 6 ; i > -1 ; i--)
   SensorRatio[i] = ( (SensorVal[i] - SensorMin[i]) * 100 /  (SensorMax[i] - SensorMin[i]) );  //센서별 변화량 구하기

  // 가장 작은 센서값 & 센서 찾기
  tmp_SensorMin = SensorRatio[3];
 
  tmp_SensorMin_Pin_Prev = tmp_SensorMin_Pin; // 이전 라인값 기억
  for(i = 6 ; i > -1 ; i--)
  {
    if(SensorRatio[6 - i] > 100) // 변화률이 100이상이면 100으로 함
      SensorRatio[6 - i] = 100;
    else if(SensorRatio[6 - i] < 0) // 변화률이 0이하이면 0으로 함
      SensorRatio[6 - i] = 0;
    if(SensorRatio[6 - i] <= tmp_SensorMin) // 가장 작은 SensorRatio찾기
    {
      tmp_SensorMin_Pin = 6 - i;
      tmp_SensorMin = SensorRatio[6 - i];
    }
  }
 
  // 라인을 찾은 센서가 갑자기 변하는 경우 보정  
  ErrLine = tmp_SensorMin_Pin_Prev - tmp_SensorMin_Pin;
  if(ErrLine > 3 || ErrLine < -3) //이전 라인값과 4이상 차이나면 오류로 판단
    tmp_SensorMin_Pin = tmp_SensorMin_Pin_Prev;
 
  if(tmp_SensorMin_Pin == 0 || tmp_SensorMin_Pin == 1)
    cnt_Left++;
  else if(tmp_SensorMin_Pin == 5 || tmp_SensorMin_Pin == 6)
    cnt_Right++;
  else
  {
    cnt_Left = 0;
    cnt_Right = 0;
  }
 
  key_down = Sensor_InitSW_GetVal();
  Direct(200,1);

 
  // 라인별 제어?
  switch(tmp_SensorMin_Pin)
  {
      case 0 :
      case 6 :
        Position = (3 - tmp_SensorMin_Pin) * 100;  // 300 200 100 0 -100 -200 -300
          Direct(Position, tmp_SensorMin_Pin);
          break;
      case 1 :
      case 5 :
        Position = (3 - tmp_SensorMin_Pin) * 120;  // 300 240 100 0 -100 -240 -300
        Position += ( (SensorRatio[tmp_SensorMin_Pin + 1] - SensorRatio[tmp_SensorMin_Pin - 1]) * 13 / 10 ); //13/10의 가중치
          Direct(Position, tmp_SensorMin_Pin);
          break;
      case 2 :
      case 3 :
      case 4 :
      Position = (3 - tmp_SensorMin_Pin) * 100;  // 300 200 100 0 -100 -200 -300
        Position += ( (SensorRatio[tmp_SensorMin_Pin + 1] - SensorRatio[tmp_SensorMin_Pin - 1]) * 128 / 100); //128/100의 가중치
          Direct(Position, tmp_SensorMin_Pin);
          break;
     default :
          break;
  }
  LineView_PutVal(0xAA); //8421 8421
  time_ms++; //ms단위 시간 증가
//  Debug_Pin_PutVal(0);  // use to debug
}

* 주석이 많아서 쉽게 이해하실 수 있을꺼라 생각하지만... 어디까지나 주관적인 생각이므로
  궁금한게 있으시다면 답글이나 메일 남겨주세요^^

TMS320 Second-Generation Digital Signal Processors

* TMS320 Specification

80-ns Instruction Cycle Time
544 Words of On-Chip Data RAM
• 4K Words of On-Chip Secure Program EPROM (TMS320E25)
• 4K Words of On-Chip Program ROM (TMS320C25)
128K Words of Data/Program Space
32-Bit ALU/Accumulator
16 × 16-Bit Multiplier With a 32-Bit Product
• Block Moves for Data/Program Management
• Repeat Instructions for Efficient Use of Program Space
Serial Port for Direct Codec Interface
• Synchronization Input for Synchronous Multiprocessor Configurations
• Wait States for Communication to Slow Off-Chip Memories/Peripherals
On-Chip Timer for Control Operations
Single 5-V Supply
• Packaging: 68-Pin PGA, PLCC, and CER-QUAD
• 68-to-28 Pin Conversion Adapter Socket for EPROM Programming
• Commercial and Military Versions Available
• NMOS Technology:
— TMS32020 . . . . . . . . . 200-ns cycle time
• CMOS Technology:
— TMS320C25 . . . . . . . . 100-ns cycle time
— TMS320E25 . . . . . . . . 100-ns cycle time
— TMS320C25-50 . . . . . . 80-ns cycle time

[Datasheet] TMS320.pdf (www.Alldatasheet.com)

2010년 3월 27일 토요일

Time-Code Receiver (시간 신호 수신기)

앞서 포스트한 내용중에 WaveCeptor 시계가 있었다.

 

이 시계에서 사용하는 칩인지는 알 수 없지만

 

이 기능을 사용해 볼 수 있는 칩을 소개하고자 한다.

 

TEMIC사에서 제작한 U4224B 칩이다.


* 특 징

1. 타임코드의 경우 40k~80kHz에 해당하는 신호이기 때문에 이 신호에 특화되었다.

2. 시계에도 사용될 수 있으므로 매우 적은 전력을 소모한다.

3. 시리얼 출력으로 데이터를 받아 볼 수 있다.


** 데이터시트를 보면 간단한 회로가 제시되어 있다.

** 주요도시의 타임코드 해석방법도 제시되어 있다.

 

[Datasheet] : U4224B.pdf

 

 

2010년 3월 26일 금요일

전파 시계(WAVE CEPTOR) 및 활용 방안

Wave Ceptor (전파시계)

  - 라디오 전파를 통해 전달되는 시간 데이트를 이용하여 자동으로 시간을 동기화 하는 시계.

  - 카시오 제품중에 있으나, 시보를 통해 시간을 동기화 하는 시계를 통틀어 말하는 고유명사인지는 잘 모르겠다.

 

  1. 오차 : 10만년에 1초의 오차를 가지는 cesium 원자시계가 가리키는 표준시간.

  2. TV, 라디오의 시보로 사용되는 표준시간을 실은 전파를 받아

자동으로 시간수정을 하여 정확한 시간 표시

  3. 전 세계 주요 지역에서도 수신이 가능하여 자동으로 현지 시간으로 바뀜.

보통 하루 3회(새벽 2, 4, 6시)자동으로 수신되며, 언제든지 버튼을 눌러서 수동수신도 가능.

계절, 날씨나 지역적인 차이로 전파 수신이 잘 안될 경우에는 일반 quartz로 작동 (월 오차 ±20 초 이내)

 

전파 수신 기능

  1. 일본 수신 전파 : JJY, 주파수 : 40kHz/60kHz (후쿠시마 / 큐슈 양 방송국 대응 모델)

  2. 북미 수신 전파 : WWVB 주파수 : 60kHz

  3. 유럽 지역 수신 전파 : MSF/DCF77 주파수 : 60kHz/77.5kHz

 

수신 기능 대응 도시

  * 도쿄, 서울, 타이 페이, (북경) (홍콩) - 일본의 표준 전파 JJY40 * JJY60
  * (호놀룰루) (앵커리지), 밴쿠버, LA, 에드먼턴, 덴버, 멕시코 시, 위니펙, 시카고, 마이애미,

     토론토, 뉴욕, 핼리팩스, 세인트 존스 - 미국의 표준 전파 WWVB
  * 리스본, 런던, 마드리드, 파리, 로마, 베를린, 스톡홀름, 아테네, (모스크바)

     - 영국의 표준 전파 MSF, 독일 표준 전파 DCF77
  ※ () 내의 각 도시는 조건이 좋은 경우에 받을 수 있다.

 

활용 방안

  - 국내에서도 수신이 가능하다고 하니 시간 동기화를 시켜볼 수 있겠다.

 

참고 링크 : 뉴스 - [기업] 카시오, 초정밀전파시계 `웨이브 셉터` 국내런칭

                 뉴스 - 방송 시보로 자동으로 시간 맞춰주는 기술 개발

                 위키 - http://en.wikipedia.org/wiki/Casio_Wave_Ceptor

 

2010년 3월 24일 수요일

프로젝터 6대로 지구를 만들다, 스트럭트 스튜디오의 Media Globe

 

스트럭트 스튜디오는 전시 및 이벤트에 초점을 맞추고 있는 디자인 에이전시이다. 5명이 함께 설립한, 스트럭트 스튜디오는 오스트리아 비엔나에 위치해 있으며 인터렉티브 디자인, 제너레이티브 디자인, 모션 디자인, 무대 디자인, 그래픽 디자인을 사업영역으로 하고 있다.

 

최근 vimeo나 해외 디자이 웹진, 블로그에서 미디어 디자인과 관련된 작업들이 자주 소개되고 있다. 모니터 안에 갖혀있던 것이 설치 미술이나 인테리어, 심지어는 건물 외관에 까지 적용되면서 창의력을 배가시키고 있기 때문이다. 신기술의 프로젝터가 개발되고 3D 그래픽 기술이 비약적으로 발전하면서, 컴퓨터로 구현한 가상공간을 현실에 맵핑하는 미디어 디자인의 오늘을 보게된 것이다.

스트럭트 스튜디오, 이들의 작업을 보면 꿈을 현실로 만들고 있다는 생각 마저 든다. 모니터 틀 밖으로 빠져나온, ‘영상’ 은 공간을 비현실적(?)으로 바꿔 놓는다. 프로젝터 6대로 구현한 지구를 감상해 보자.

“미디어 글로브(The Media Globe)” 는 직경 3.8미터의 구체 설치물과 6개의 프로젝터, 4대의 컴퓨터로 만들어졌다. 6개의 프로젝터는 구체의 상하, 사방에서 영상을 쏜다. 6개 프로젝터의 영상은 입체적으로 겹치면서 구체의 표피를 만들어내는데, 컴퓨터 3D로 만든 지구를 실제 이벤트 공간에 설치될 구체의 크기와 프로젝터와의 거리, 방향을 고려, 프로젝터별로 분리하고 이렇게 추출해 낸 각각의 영상을 실체 이벤트장의 구체에 투사하여 재조합 하게 된다.

관객은 눈 앞의 백색 구체가 지구로 매핑되는 것을 목격하게 된다. 컴퓨터로 만들어낸, 가상의 지구가 현실을 매핑하는 셈이다.

strukt02.jpgstrukt02.jpgstrukt04.jpgstrukt01.png

원본 출처 : [strukt]

 

출처 : [leopon]  |  작성자 : leopon

 

2010년 3월 23일 화요일

Smart Cruise Control

스마트 크루즈 컨트롤(Smart Cruise Control)은 앞 차와의 차간거리를 자동으로 맞춰 주는 획기적인 시스템으로 국산차로는 지난 1월 출시된 제네시스에 처음 옵션으로 달려 나옴으로써 실용화가 되었다.

 


현대 제네시스

 

기본적으로 스마트 크루즈 컨트롤 시스템은 차량 앞에 레이더 센서를 부착하고 적외선을 발사하여 앞 차에 반사된 후 되돌아오는 시간을 측정하여 앞 차와의 거리를 측정한 다음 이 데이터로 차량의 속도를 적절이 제어하여(이 제어는 가속이 될 수도 있도 제동이 될 수도 있다) 일정한 차간거리를 유지하는 것이 기본 원리이다. 이제 국내에서는 막 실용화가 되어가고 있는 최첨단 장비이며 가격도 비싸다. 참고로 제네시스의 옵션 가격은 다음과 같다.



제네시스의 옵션 가격

쓸데없는 짓일지 모르지만 스마트 크루즈 컨트롤의 가격을 계산해 보기로 하겠다.

일단 옵션 사항으로 보아 스마트 크루즈 컨트롤이 들어가면 전방 카메라는 기본으로 필요하다고 생각된다. DIS AV, 전방 카메라, SCC를 추가하면 640만원. DIS AV만 추가하면 460만원이다. 결국 전방 카메라와 SCC 180만원이라는 가격이 나온다.

 

글 초반부터 갑자기 가격을 운운하여 원래 주제에서 좀 벗어난 감이 있는데, 스마트 크루즈 컨트롤이 작동하는 원리를 그림으로 보도록 하겠다.



스마트 크루즈 컨트롤의 작동 원리

 

위 그림은 메르세데스 벤츠가 장착하고 있는 스마트 크루즈 컨트롤을 보여 주고 있는데, 벤츠는 이 장비를 디스트로닉(Distronic)이라고 부른다. 녹색 화살표가 차량에서 쏘는 적외선이고 붉은색 화살표가 반사된 앞 차량에서 되돌아오는 적외선이다. 적외선의 반사시간을 모듈이 계산하여 앞 차와의 거리를 알아내고, 차속과 엔진 회전수 등 다른 정보들과 조합하여 스로틀과 브레이크를 적절하게 조절한다.

 

제네시스에 탑재된 크루즈 컨트롤도 작동원리는 같다.





제네시스에 적용된 스마트 크루즈 컨트롤


스위치 조작방법

스마트 크루즈 컨트롤은 벤츠나 현대 외에도 이미 많은 회사가 실용화를 시키고 있는 단계이다. 일본 도요타 자동차에서는 자사의 렉서스 LS 460에 이 장치를 부착하고 있으며, 다이나믹 레이더 크루즈 컨트롤 (Dynamic Rader Cruise Control)이라고 부르고 있다. 그 외에 아우디나 재규어, 볼보 등 유럽 메이커도 이 장치를 자사의 자동차에 채용하고 있다.



볼보의 ACC(Adaptive Cruise Control)


필자는 스마트 크루즈 컨트롤을 실제로 사용해 보지는 않았지만 상당히 편리할 것이라고 생각된다. 예를 들면 교통 체증이 심한 곳에서 가다 서다를 반복할 경우 차간거리만 맞추어 놓으면 브레이크나 액셀 페달의 조작 없이 차가 자기 혼자서 거리를 맞추어 가며 가다 서다 해주는 것이다. 운전자는 전방의 돌발 상황에만 집중하면 된다. 돌발 상황이 발생했을 때만 브레이크 페달을 밟아주면 스마트 크루즈 컨트롤이 해제되면서 운전자가 차를 직접 컨트롤할 수 있다.

 

근래에는 스마트 크루즈 컨트롤 외에도 자동차의 안전한 주행을 위한 여러 가지 기술이 많이 개발되고 있고, 이미 개발된 기술들도 날로 점점 발전해 가고 있다. 그러나 발전된 기술이 사고를 무조건 막아 줄 것이라는 안일한 생각은 버리고, 항상 안전하게 운전하는 습관을 들인다면, 교통 사고의 위험성은 더욱 줄어들 것이다.

 

출처 : [아우토모빌리]  | 작성자 : Ferrariboy

햅틱(Haptic) 기술

햅틱(Haptic) 기술

 

햅틱(Haptic)은 그리스어로 만지다(touch)라는 뜻을 가진 “Haptesthai”에서 유래하는데, 햅틱 기술은 터치(touch)를 기반으로 한 정보의 인지와 장치 조작에 관한 연구 분야를 일컫는다. 일반적으로 피부가 물체 표면에 닿았을 때 느끼는 촉감(tactile feedback)과 관절과 근육의 움직임이 방해될 때 느껴지는 근 감각적인 힘(kinesthetic force)의 두 가지 힘을 합쳐서 햅틱이라고 지칭한다.

 

햅틱기술은 초창기에는 주로 로보틱스 분야에서 많이 활용되었으며, 그후 1990년에 들어서는 컴퓨터 그래픽스, 가상현실 분야로 연구분야가 확대되고 있다.

 

 

착용형 컴퓨터를 위한 햅틱 기술

착용형 컴퓨터 혹은 모바일 컴퓨터의 경우 컴퓨터 성능은 향상되는 반면 크기는 점점 작아지고 있는 추세이다.

작아진 크기로 인해 휴대하기가 용이해진 반면 HCI(Human Computer Interactioin) 측면에서는 기존의 데스크톱 컴퓨터와는 다른 입출력 방법이 요구되고 있다.

 

사용자가 걷거나 움직이고 있는 상황에서도 끊김없이 컴퓨터와 상호작용 할 수 있도록 이동성을 보장하는 사용자 인터페이스 기술로 햅틱 기술이 활용될 가능성이 높다.

 

단순한 햅틱 기술은 휴대폰의 진동 모터를 이용한 알림 기능을 들 수 있다.

사용자의 주의를 환기시키기 위한 단순한 진동에서부터 최근에는 발신자를 구분하여 다양한 패턴의 진동음을 낼 수 있는 진동 모터도 소개되고 있다.

 

마우스에 축각인터페이스를 추가한 시청각 장애인을 위한 햅틱기술 개발 또한 매우 활발하게 전개되고 있다.

 

 

 

 

햅틱 신호를 착용형 컴퓨터에 이용하는 가장 간단한 응용으로는 신체의 특정 부위를 진동시켜 방향 정보를 제공하는 것인데, 위치기반서비스(LBS)와 연계하여 햅틱 신호를 좀 더 세밀하게 디자인 할 경우 방향 정보 외에 건물의 형태, 가게 종류, 계단의 개수, 방의 위치 등의 다양한 형태의 정보도 표현할 수 있을 것으로 예상된다.

삼성전자 대학생 Idea 경진대회

link : http://www.samsungidea.com/