BASIC4MCU | 질문게시판 | ATMEGA 128 초음파 센서 거리에 따른 부저 작동 질문드립니다.
페이지 정보
작성자 충전공 작성일2023-12-02 18:41 조회17,480회 댓글7건본문
안녕하세요 초음파센서 측정거리에 따른 피에조 센서 작동에 대한 코드입니다. 카페에서 예제를 참고하면서 작성했습니다.
똑같은 조건에서 아두이노 보드로 활용했을 때는 제어가 잘 되는데 ATMEGA128 보드를 사용하니 부저에서 계속 소리가 나는 것을 보아 코드에 오류가 있는 것 같아 질문드립니다. 항상 감사드립니다!
#define F_CPU 16000000UL // CPU 클럭 주파수 설정
#include <avr/io.h>
#include <util/delay.h>
#define TRIG_PORT PORTC
#define TRIG_PIN PC0
#define ECHO_PORT PORTC
#define ECHO_PIN PC1
#define SOUND_PORT PORTD
#define SOUND_PIN PD0
void setting ();
void setting() {
DDRC |= (1 << TRIG_PIN); // Trig 핀을 출력으로 설정
DDRC &= ~(1 << ECHO_PIN); // Echo 핀을 입력으로 설정
DDRD |= (1 << SOUND_PIN); // 소리 출력 핀을 출력으로 설정
}
void generateSound();
void generateSound() {
PORTD |= (1 << SOUND_PIN); // 소리 출력 핀을 High로 설정
_delay_ms(0.1); // 소리를 유지하는 시간 시끄러워서 짧게 설정
PORTD &= ~(1 << SOUND_PIN);// 소리 출력 핀을 Low로 설정
}
uint16_t measureDistance();
uint16_t measureDistance() {
PORTC |= (1 << TRIG_PIN);
_delay_us(10);
PORTC &= ~(1 << TRIG_PIN);
while (!(PINC & (1 << ECHO_PIN))); // Echo가 High가 될 때까지 대기
uint16_t startTime = TCNT1; // Echo 핀이 High가 된 시간을 저장
while (PINC & (1 << ECHO_PIN)); // Echo가 Low가 될 때까지 대기
uint16_t endTime = TCNT1; // Echo 핀이 Low가 된 시간을 저장
uint16_t duration = endTime - startTime;
return (duration * 34) / (2 * 1000); // 거리를 센티미터로 반환
}
int main(void) {
setting ();
while (1) {
uint16_t distance = measureDistance();
if (distance < 30) {
generateSound();
_delay_ms(2000); // 소리를 일정 시간 동안 유지
}
}
return 0;
}
댓글 7
조회수 17,480master님의 댓글
master 작성일
int main(void) {
setting ();
while (1) {
uint16_t distance = measureDistance();
if (distance < 30) {
generateSound();
_delay_ms(2000); // 소리를 일정 시간 동안 유지
}
_delay_ms(100); // 트리거 딜레이
}
return 0;
}
트리거 딜레이 추가했습니다.
소리가 계속 들리는 것이 아니고, 거의 들리지 않을텐데요?
조건에 맞는다고 해도 0.1초 켜지고 2초 꺼진 상태로 있습니다.
충전공님의 댓글
충전공 작성일제가 질문을 난해하게 드린 것 같아 죄송합니다. 초음파 센서에서 측정한 거리와 상관없이 계속 피에조에서 소리가 난다는 의미로 질문한 것이었습니다. 바쁘실텐데 정말 죄송합니다
master님의 댓글
master 작성일
void generateSound() {
PORTD |= (1 << SOUND_PIN); _delay_us(100); PORTD &= ~(1 << SOUND_PIN);
}
0.1ms를 100us로 변경 했습니다만
소리가 100us동안 달랑 펄스 1개 출력하고나서 2000ms동안 정지 상태로 있는데
소리가 나올리가 있을까요?
부저 연결에 문제가 있겠죠
다른핀에 연결했든, 부논리로 동작하든...
사람귀로 펄스 1개를 들을 수 있을 거라는 생각은 안듭니다.
충전공님의 댓글
충전공 작성일친절한 답변 감사드립니다 !! 혹시 실례가 안된다면 거리 측정하는 코드에는 문제가 없는지 여쭤봐도 되겠습니까??? 적외선 센서로 버저를 울리게 했을 때는 잘 작동해서 그렇습니다.... ㅠㅠ 번거롭게 해드려 정말 죄송하고 항상 감사드립니다
master님의 댓글
master 작성일타이머 설정도 없고.. 좋은 예제로 공부하셔야 합니다.
master님의 댓글
master 작성일
#define F_CPU 16000000UL
#include <avr/io.h>
#include <util/delay.h>
//
uint16_t distance;
//
void generateSound(){ // 500us*1000=500ms동안 소리 발생 // 1kHz
int i; for(i=0;i<1000;i++){ PORTD^=1; _delay_us(500); }
}
//
void measureDistance(){
PORTC|=1; _delay_us(10); PORTC&=~1;
while(!(PINC&2)); TCCR1B=2; TCNT1=0;
while( PINC&2 ); TCCR1B=0; distance=TCNT1;
distance=distance/116; // 거리를 센티미터로
}
//
int main() {
DDRC=1; // TRIG_PIN PC0 // ECHO_PIN PC1
DDRD=1; // SOUND_PIN PD0
while(1){
measureDistance();
if(distance<30)generateSound();
_delay_ms(100);
}
return 0;
}
충전공님의 댓글
충전공 작성일답변 감사드립니다.. 그런데 잘 작동되지가 않네요.. ㅠㅠ 이건 제가 따로 더 공부를 열심히 해서 해결해보겠습니다!!