ST-7L, EL-7L(적외선 수광, 발광 다이오드)를 이용한 적외선 센서 테스트.


  '임베디드 시스템 설계' 시간에 만든 '적외선 센서를 이용한 근접 거리 테스트'라는 거창한 이름을 달고 제작되어진 이 모듈은, 원래 책에서 배낀것으로(ㅡㅡ;;) 3쌍의 수발광 다이오드에 물체가 접근하면 AVR로 출력을 내보내는 역할을 한다.

  아래 사진에서 보는것과 같이 우리가 만든 모듈은 3쌍의 적외선 센서와 1개의 FND, 그리고 센서에 물체 감지시 소리를 낼수있는 스피커 모듈(사진의 왼쪽아래)을 달아 제작을 하였다.
사용자 삽입 이미지

웬지 허접하다...ㅡㅡ;;


  이 모듈을 이용해 첫번째 센서, 2번째 센서, 3번째 센서의 각 값을 받아 3비트의 2진수처럼 인식해 이를 10진수로 변환해 FND에 출력한다.  예를들어 1번째, 2번째 센서에 감지가 되었다면 011이 되어 FND에 3이 출력되고, 2, 3번째 센서에 감지가 되었다면 110이 되어  6이 출력된다 4번째 센서 하나에만 감지되면 4가 출력된다.
  센서에 물체가 감지되면 200ms에 한번씩 '삑' 하는 소리가 나도록 프로그래밍 되었으며, 감지된 값을 10진수로 변환해 RS-232를 통해 전송하는 코드도 포함되어 있다.  전체 소스는 아래와 같다.
#include <avr/io.h>

//delay 정의. us와 ms.
void delay_us(unsigned char time_us) {
  register unsigned char i;
  for(i = 0; i < time_us; i++) {
   asm volatile("PUSH R0 ");   
   asm volatile("POP  R0 ");
   asm volatile("PUSH R0 ");
   asm volatile("POP  R0 ");
   asm volatile("PUSH R0 ");
   asm volatile("POP  R0 ");  }}

void delay_ms(unsigned int time_ms) {
  register unsigned int i;
  for(i = 0; i < time_ms; i++) {
   delay_us(250);
   delay_us(250);
   delay_us(250);
   delay_us(250);  }}

// FND number 정의
#define NUMBER_0  0b11000000
#define NUMBER_1  0b11111001
#define NUMBER_2  0b10100100
#define NUMBER_3  0b10110000
#define NUMBER_4  0b10011001
#define NUMBER_5  0b10010010
#define NUMBER_6  0b10000010
#define NUMBER_7  0b11011000
#define NUMBER_8  0b10000000
#define NUMBER_9  0b10010000

#define CR 0x0D //rs232통신에서 줄의 맨 앞
#define LF 0x0A //rs232통신에서 다음줄로 개행
#define BAUD_57600    0x10 //속도에 대한 값 define

//rs232 함수
void uart_init(unsigned int baud_rate) {
  UCSRA= 0X00; 
  UCSRB= 0X98; 
  UCSRC= 0X86; 
  UBRRH= 0x00; 
  UBRRL= baud_rate;}

void tx_char(char data) {
  while(!(UCSRA & 0x20));
  UDR= data;}

char get_char(void) {
  while(!(UCSRA & 0x80));
  return UDR;}

void tx_string(char *string) {
  while(*string !='\0') {
    if(*string =='\n') {
   tx_char(CR);      
      tx_char(LF);
    }
 else { tx_char(*string); }
 string++;  }}

//메인함수.
int main(void) {      

DDRC=0xFF;
DDRB=0xFF;
DDRD=0x00;            //포트 초기화. 0x00은 입력, 0xFF는 출력.
DDRA=0xFF;
PORTA=0x00;
volatile unsigned char input;
uart_init(BAUD_57600);
 while(1){
  input=~PIND&0b00010101; //input에 portD에 들어오는값에 0x15 를 AND연산해 값을 반전하여 입력.
  int i;

  switch(input){
   case 0b00010101 : {
    PORTB= NUMBER_7;  //PORTB엔 FND 연결되어있음.  FND에 7을 출력함.
    tx_string("7\n");  // RS232로 7이라는 숫자를 보내고 개행.
     for(i=0;i<5;i++){
      PORTD=0b00100000;  delay_ms(3);   //for문 안의 내용은 부저를 울리는 소스.
      PORTD=0b00000000;  delay_ms(2);
     }
     break;
   }
   case 0b00010100 : {
    PORTB= NUMBER_6;
    tx_string("6\n");
     for(i=0;i<5;i++){
      PORTD=0b00100000;   delay_ms(3);
      PORTD=0b00000000;  delay_ms(2);
     }
     break;
   }
   case 0b00000101 : {
    PORTB= NUMBER_5;
    tx_string("5\n");
     for(i=0;i<5;i++){
      PORTD=0b00100000;  delay_ms(3);
      PORTD=0b00000000;  delay_ms(2);
     }
     break;
   }
   case 0b00000100 : {
    PORTB= NUMBER_4;
    tx_string("4\n");
     for(i=0;i<5;i++){
      PORTD=0b00100000;  delay_ms(3);
      PORTD=0b00000000;  delay_ms(2);
     }
    break;
   }
   case 0b00010001 : {
    PORTB= NUMBER_3;
    tx_string("3\n");
     for(i=0;i<5;i++){
      PORTD=0b00100000;  delay_ms(3);
      PORTD=0b00000000;  delay_ms(2);
     }
    break;
   }
   case 0b00010000 : {
    PORTB= NUMBER_2;
    tx_string("2\n");
     for(i=0;i<5;i++){
      PORTD=0b00100000;  delay_ms(3);
      PORTD=0b00000000;  delay_ms(2);
     }
    break;
   }
   case 0b00000001 : {
    PORTB= NUMBER_1;
    tx_string("1\n");
     for(i=0;i<5;i++){
      PORTD=0b00100000;  delay_ms(3);
      PORTD=0b00000000;  delay_ms(2);
     }
    break;
   }
   default : {PORTB= NUMBER_0;  break;} //위 사항에 모두 해당되지 않을경우 0을 출력함.
  }
  delay_ms(200); //FND에 일정시간 숫자가 표시되게 하기 위해 200ms동안 fnd에 값을 표시함.
 }
}

이 모듈이 어떻게 동작하는지는 아래 동영상을 확인하시라~


"우리조 사람들 반성해라. 인간적으로 한거 없으면 발표라도 하던가, 발표도 안하겠다고 끝까지 뻐기더라.. 내가 모듈 만들고 코딩하고... 너네들 한거 뭐있냐...  "
2009/06/14 01:26 2009/06/14 01:26


ㄹㅔㅈㅕ
하드웨어/AVR 2009/06/14 01:26

트랙백 주소 : http://seoltang.com/trackback/334

댓글을 달아 주세요

  1. 비밀방문자 2009/09/23 11:44  수정/삭제  댓글쓰기

    관리자만 볼 수 있는 댓글입니다.

    • ㄹㅔㅈㅕ 2009/10/01 16:31  수정/삭제

      회로도라 할것도 없습니다.
      발광부는 바로 VCC - 저항 - 발광센서 - GND 연결하시면 되구요,

      ......................┌ 103 캐패시터 - MCU의 ADC핀
      수광부는 VCC - 수광센서 ┤.............│
      ....................470옴.........47K옴
      ......................└.....GND..... ┘

      이렇게 연결하심 됩니다.ㅋㅋ

[ SG, SB ] Powerd by Textcube, designed by criuce
rss