BASIC4MCU | 센서 | 초음파센서 | 초음파센서 2개 - 회전 선풍기
페이지 정보
작성자 키트 작성일2017-08-23 14:45 조회2,007회 댓글0건본문
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
|
#include<mega128.h>
#include<delay.h>
//
#define trig1 PORTA.0 // srf04-1 트리거
#define echo1 PINA.1 // srf04-1 에코
//
#define trig2 PORTA.2 // srf04-2 트리거
#define echo2 PINA.3 // srf04-2 에코
//
unsigned char mode,step=0;
unsigned int cnt1,cnt2;
//
void srf04(){
trig1=1; delay_us(10); trig1=0; //트리거1
while(!echo1); TCNT1=0; TCCR1B=2;
while( echo1); TCCR1B=0;
cnt1=TCNT1/116;
delay_ms(50);
//
trig2=1; delay_us(10); trig2=0; //트리거2
while(!echo2); TCNT1=0; TCCR1B=2;
while( echo2); TCCR1B=0;
cnt2=TCNT1/116;
delay_ms(50);
//
if (cnt1<100){ OCR0=cnt1; mode=1; } // 0도
else if(cnt2<100){ OCR0=cnt2; mode=2; } //90도
else { OCR0=0; mode=0; } //서보 회전, DC팬 정지
}
//
void main(void){
DDRA=0x05; // 초음파센서
DDRB=0x10; // DC팬
DDRE=0x08; // RC서보모터
TCCR0=0x6A; // DC팬, 8비트 fast pwm 모드
TCCR3A=0x82; TCCR3B=0x1A; OCR3AH=3000>>8; OCR3AL=3000&0xFF; ICR3H=39999>>8; ICR3L=39999&0xFF; // RC서보
while(1){
srf04();
//
if (mode==1){ OCR3AH=3000>>8; OCR3AL=3000&0xFF; step=0; } // 0도
else if(mode==2){ OCR3AH=4600>>8; OCR3AL=4600&0xFF; step=1; } // 90도
else{ //mode==0
if(step==0){ OCR3AH=3000>>8; OCR3AL=3000&0xFF; step=1; delay_ms(400); } // 0도
if(step==1){ OCR3AH=4600>>8; OCR3AL=4600&0xFF; step=2; delay_ms(400); } // 90도
if(step==2){ OCR3AH=3000>>8; OCR3AL=3000&0xFF; step=3; delay_ms(400); } // 0도
if(step==3){ OCR3AH=1400>>8; OCR3AL=1400&0xFF; step=0; delay_ms(400); } //-90도
}
}
}
|
cs |
//
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
|
#define F_CPU 16000000UL // 16 MHz
#include <avr/io.h>
#include <util/delay.h>
//
#define trig1_1 PORTA|=1 // PA0, srf04-1 트리거
#define trig1_0 PORTA&=~1 // PA0, srf04-1 트리거
#define echo1 (PINA&2) // PA1, srf04-1 에코
//
#define trig2_1 PORTA|=4 // PA2, srf04-2 트리거
#define trig2_0 PORTA&=~4 // PA2, srf04-2 트리거
#define echo2 (PINA&8) // PA3, srf04-2 에코
//
unsigned char mode,step=0;
unsigned int cnt1,cnt2;
//
void srf04(){
trig1_1; _delay_us(10); trig1_0; //트리거1
while(!echo1); TCNT1=0; TCCR1B=2;
while( echo1); TCCR1B=0; cnt1=TCNT1/116;
_delay_ms(50);
//
trig2=1; _delay_us(10); trig2=0; //트리거2
while(!echo2); TCNT1=0; TCCR1B=2;
while( echo2); TCCR1B=0; cnt2=TCNT1/116;
_delay_ms(50);
//
if (cnt1<100){ OCR0=cnt1; mode=1; } // 0도
else if(cnt2<100){ OCR0=cnt2; mode=2; } //90도
else { OCR0=0; mode=0; } //서보 회전, DC팬 정지
}
//
int main(void){
DDRA=0x05; // 초음파센서
DDRB=0x10; // DC팬
DDRE=0x08; // RC서보모터
TCCR0=0x6A; // DC팬, 8비트 fast pwm 모드
TCCR3A=0x82; TCCR3B=0x1A; OCR3AH=3000>>8; OCR3AL=3000&0xFF; ICR3H=39999>>8; ICR3L=39999&0xFF; // RC서보
while(1){
srf04();
//
if (mode==1){ OCR3AH=3000>>8; OCR3AL=3000&0xFF; step=0; } // 0도
else if(mode==2){ OCR3AH=4600>>8; OCR3AL=4600&0xFF; step=1; } // 90도
else{ //mode==0
if(step==0){ OCR3AH=3000>>8; OCR3AL=3000&0xFF; step=1; _delay_ms(400); } // 0도
if(step==1){ OCR3AH=4600>>8; OCR3AL=4600&0xFF; step=2; _delay_ms(400); } // 90도
if(step==2){ OCR3AH=3000>>8; OCR3AL=3000&0xFF; step=3; _delay_ms(400); } // 0도
if(step==3){ OCR3AH=1400>>8; OCR3AL=1400&0xFF; step=0; _delay_ms(400); } //-90도
}
}
}
|
cs |
//
RC서보는 700us~2300us 범위로 회전합니다.
//
사람이 디텍트 되지 않았을 때에 RC서보는 계속 회전합니다.
회전 시 이동 후 정지하는 시간이 길면 delay_ms(400); 딜레이 시간을 줄이세요
//
거리가 멀면 DC팬 속도 증가 거리가 가까워지면 DC팬 속도 감소
//
DC팬은 PB4에 연결합니다
댓글 0
조회수 2,007등록된 댓글이 없습니다.