ST-7L, EL-7L(적외선 수광, 발광 다이오드)를 이용한 적외선 센서 테스트.
아래 사진에서 보는것과 같이 우리가 만든 모듈은 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에 값을 표시함.
}
}


관리자만 볼 수 있는 댓글입니다.
회로도라 할것도 없습니다.
발광부는 바로 VCC - 저항 - 발광센서 - GND 연결하시면 되구요,
......................┌ 103 캐패시터 - MCU의 ADC핀
수광부는 VCC - 수광센서 ┤.............│
....................470옴.........47K옴
......................└.....GND..... ┘
이렇게 연결하심 됩니다.ㅋㅋ