본문 바로가기
카테고리 없음

아두이노(Arduino) 아날로그 입력과 출력(Part1. 부저와 초음파 센서 응용)

by 드린이 2023. 2. 18.

안녕하세요!! 드린이입니다 ::))

지난 포스팅을 통해서 아두이노(Arduino)의 디지털 출력을 이용하여 초음파 센서 거리측정기를 만들어 보았습니다. 오늘은 아날로그 출력을 이용하여 부저(스피커) 예제를 실습하고 부저와 초음파 센서의 결합으로 진정한 후방감지기를 만들어 보도록 하겠습니다.

 

아날로그 입력과 출력

아두이노(Arduino)에서는 0 ~ 13번의 디지털 핀에서는 디지털 신호의 입력과 출력이 모두 가능했지만, 아날로그 신호는 입력과 출력이 서로 다른 핀에서 가능합니다. 아날로그 신호의 입력은 A0~A5의 총 6개에서 가능합니다. 아날로그 신호의 출력은 기존 디지털 핀의 핀 번호 옆에 ‘~’ 표시가 되어있는 PWM 핀에서 가능합니다. PWM 핀은 3번, 5번, 6번, 9번, 10번, 11번입니다.

 

PWM

Duty Cycle

PWM은 Pulse Width Modulation의 약자로 진동의 폭을 조절한다는 뜻입니다. 디지털 신호의 Duty Cycle을 조절하여 마치 아날로그 신호가 출력되는 것처럼 출력하는 것입니다. 여기서 Duty Cycle은 디지털 신호의 High와 Low의 비율을 뜻합니다.

 

아래의 그림과 같이 부저와 UNO 보드를 연결하고 코드를 입력합니다.

부저 출력 연결도

void setup() {
  pinMode(5, OUTPUT);                                // 5번핀을 출력모드로 설정
}

void loop() {
  tone(5, 1046.5);                                             //도
  delay(200); noTone(5); delay(200);
  tone(5, 1244.5);                                             //레
  delay(200); noTone(5); delay(200);
  tone(5, 1318.5);                                             //미
  delay(200); noTone(5); delay(200);
  tone(5, 1397.0);                                             //파
  delay(200); noTone(5); delay(200);
}

 

코드 입력을 완료하고 UNO 보드에 업로드 하면, 도, 레, 미, 파 가 순차적으로 부저를 통해 출력되는 것을 확인할 수 있습니다.

주파수 음계


여기서 처음 나온 함수를 보면
- tone(핀 번호, 주파수) 또는 tone(핀 번호, 주파수, 시간) : 주파수 신호를 출력하여 소리 설정 함수
  * 핀번호 : 주파수를 출력할 PWM 핀번호 입력
  * 주파수 : 31~65535 범위의 주파수(Hz) 설정
  * 시간 : 밀리초 단위의 출력 시간 입력(1000 = 1초)


참고로 부저의 종류는 능동 부저(Active Buzzer)와 수동 부저(Passive Buzzer)가 있습니다. 능동 부저의 경우 내장 회로가 있어 외부에서 전원만 인가하면 소리가 출력되고 수동 부저에 비해 소리는 크지만 음질은 다소 떨어지는 특성이 있습니다. 수동 부저의 경우 내장 회로가 없어 외부에서 원하는 주파수의 신호를 입력하여 소리를 출력하고 능동형과 비교해 소리는 작지만 음질이 우수합니다.

능동 부저와 수동 부저

 

후방감지기

이제 오늘 포스팅의 목표인 자동차의 후방감지기와 똑같은 거리에 따라 다른 소리가 출력되는 후방 감지기를 만들기 위하여 아래의 그림과 같이 부저, 초음파 센서와 UNO 보드를 연결하고 코드를 입력합니다.

후방 감지기 연결도

 

int trig = 2;                  // trig에 2를 대입
int echo = 3;                  // echo에 3을 대입
int distance;

void setup() {
  Serial.begin(9600);                   // 시리얼통신 시작, 통신속도는 9600
  pinMode(trig, OUTPUT);          // trig(2)핀을 출력모드로 설정
  pinMode(echo, INPUT);            //  echo(3)핀을 입력모드로 설정
  pinMode(5, OUTPUT);
}
void loop() {
  digitalWrite(trig, HIGH);                    //trig핀에 HIGH신호를 출력
  delayMicroseconds(10);                   // 10마이크로초 동안 대기
  digitalWrite(trig, LOW);                    // trig 핀에 LOW(0V)신호를 출력
  distance = pulseIn(echo, HIGH) * 34 / 2 / 1000;
  Serial.print(distance);                       // distance를 시리얼 모니터에 출력
  Serial.println("cm");                           // 문자열 cm을 시리얼 모니터에 출력
  delay(100);

  if(distance<10){
    tone(5,261.6);
    delay(20); noTone(5); delay(20);
  }
 
  else if(distance<30){
    tone(5,261.6);
    delay(40); noTone(5); delay(40);
  }

  else if(distance<50){
    tone(5,261.6);
    delay(60); noTone(5); delay(60);
  }

else if(distance<70){
    tone(5,261.6);
    delay(80); noTone(5); delay(80);
  }

else if(distance<90){
    tone(5,261.6);
    delay(100); noTone(5); delay(100);
  }

else{
    noTone(5);
  }
}

 

코드 입력을 완료하고 UNO 보드에 업로드 하면, 거리에 따라서 소리의 주기가 달라지는 모습을 볼 수 있습니다. 마치 자동차의 후방감지와 같이 거리가 가까울수록 소리의 주기가 짧아지는 모습입니다. 코드를 보면 이전의 초음파 센서의 것에서 측정된 거리에 따라 소리의 주기를 조절하기 위하여 if 문을 조금 추가했을 뿐입니다.

 

오늘은 아두이노(Arduino)의 초음파 센서와 부저를 이용하여 거리 측정기를 만드는 예제에 대해서 알아보았습니다. 다음 포스팅에서는 더 쉽고 간단한 예제를 가지고 돌아오도록 하겠습니다.

 

감사합니다::))