[아두이노] [강좌] 24. tone()/noTone() 함수 (1) - 함수 설명
(이번 강좌에서는 그림이나 사진이 하나도 없길래 그냥 넣어 봄)
이번 시간에는 아두이노에서 편리한 기능으로 제공하는 tone() 함수와 noTone() 함수에 대해 알아보자. tone() 함수는 아두이노가 얼마나 친절한지 보여주는 대표적인 함수이다.
tone() 함수는 지정한 핀으로 50% 듀티비의 PWM 파형을 출력하는 함수이다. 그럼 analogWrite() 함수와 뭐가 다른가? 바로, 주파수를 조절할 수 있다는 점이다.
(듀티비를 조절할 수 없으니, 엄밀히 따지면 PWM 파형은 아니군.)
analogWrite() 함수의 경우 듀티비를 조절할 수 있었지만 주파수는 약 490Hz 또는 980Hz로 고정되어 있었다. 그래서 모터 등을 제어하기 위해 사용된다고도 했었고. (너무 오래 되서 기억이 가물가물..)
그런데 펄스 신호로 제어되는 모듈 중에는 듀티비를 이용해 제어하는 방법 말고 주파수 변화에 의해 제어되는 모듈도 있다. 대표적인 것이 바로 부저(Buzzer). 주파수에 따라 부저음의 높낮이가 달라진다. 음파와 같은 원리지.
듀티비와 주파수의 개념이 헷갈리면 안된다. 주파수는 1초에 몇 번의 파형(HIGH,LOW를 한 번 반복하는)이 만들어지는가를 뜻하고, 듀티비는 한 주기 내에서 HIGH의 비율을 나타낸다.
어려운 내용이 아니므로 일단 함수 설명부터 보자.
tone(pin, frequency)
tone(pin, frequency, duration)
매개 변수
pin : 파형을 출력할 핀 번호
frequency : 출력할 파형의 주파수(Hz 단위)
duration : 출력 시간(밀리초 단위). 지정하지 않으면 noTone() 함수가 호출될 때까지 출력됨. |
쉽다. 이렇게 쉬울 수가.
핀 번호랑 주파수만 정해주면 된다. 심지어 출력 시간까지 정할 수 있다. 너무 친절해서 눈물이. ㅜㅜ
tone() 함수에는 아두이노의 모든 핀을 사용할 수 있다. frequency 값은 31 이하로는 설정할 수 없고, frequency 변수의 타입이 unsigned int 형이라 최대 65535Hz까지밖에 설정할 수 없다. 음, 이만큼 크게는 실제로 써 본 적이 없어서 정확한 주파수가 나올 지 모르겠지만, 나오니까 unsigned int 형으로 정해뒀겠지?
duration 값은 지정할 수도 있고, 지정하지 않을 수도 있다. 지정하지 않을 경우에도 noTone() 함수를 이용해서 출력을 중단할 수 있지만, 실제로 사용하다 보면 알 것이다. 출력 시간을 결정할 수 있다는 것이 얼마나 편리한 기능인지를. ㅋㅋㅋㅋㅋㅋ
(200ms 부저 울리고 300ms 쉬고, 다시 울리고를 10번 반복하는 기능을 만들 때, 시리얼 통신을 위해 delay() 함수를 쓸 수 없을 때, 출력 시간을 설정할 수 없다면 얼마나 복잡한 소스가 탄생할 지 생각하기만 해도 무섭ㅜㅜ)
noTone(pin)
매개 변수
pin : 파형 출력을 중단할 핀 번호. |
noTone() 함수는 파형 출력을 중단시킨다. 매개 변수의 pin 번호는 반드시 tone() 함수로 파형이 출력 중인 번호여야 한다. 안 그러면 아무 동작도 안 함.
참 편리한 tone() 함수지만 한가지 아쉬운 점은 있다. 바로 여러 핀을 동시에 사용할 수 없다는 것. 즉 부저 2개 이상을 동시에 소리 나게 할 수 없다는 것이다.
2개 이상 사용할 수는 있다. 단, 동시가 아니라 연속해서 사용할 수 밖에 없다. 음? 뭔가 헷갈리노.
예를 들어,
tone(11, 500); delay(1000); noTone(11); tone(12, 500); delay(1000); noTone(12); |
이렇게는 가능하지만,
tone(11, 500); tone(12, 500); delay(1000); noTone(11); noTone(12); |
이렇게는 사용할 수 없다는 것이다.
아두이노 홈페이지의 tone()에 대한 설명을 보면 여러 개의 핀으로 tone() 함수를 이용해 파형을 출력하고 싶다면, 출력되던 핀에 noTone() 함수로 출력을 멈춘 후 다음 핀으로 파형을 출력할 수 있다고 되어 있다.
만일 위 경우처럼 noTone() 함수로 출력을 중단하지 않고 다시 tone() 함수를 사용하게 된다면 나중에 사용된 tone() 함수는 무시된다. 즉, 11번 핀으로밖에 파형이 출력되지 않는다는 말.
또 아두이노 메가(Mega 2560/ADK) 이 외의 보드에서는 tone() 함수를 사용할 경우 3번 핀과 11번 핀을 analogWrite() 함수에 사용할 수 없다. tone() 함수는 타이머를 이용해 파형을 출력하는데, 우노(Uno) 등 대부분의 아두이노 보드에서는 3번과 11번 핀으로 PWM을 출력하기 위해 사용하는 타이머와 tone() 함수에서 사용하는 타이머가 같기 때문. 메가는 타이머가 많아서 서로 방해하지 않는다.
tone() 함수에서 duration 값을 지정했고, 지정한 시간이 지나 파형 출력이 중단되었다면 다시 noTone() 함수로 파형 출력을 중단하지 않아도 다른 핀으로 파형을 출력할 수 있다.
아. 간만에 이렇게 쉽고, 짧고, 간단한 강좌가. ㅜㅜ
다음 강좌에서는 tone() 함수와 noTone() 함수를 이용해서 부저로 멜로디를 출력하는 실습을 함께 진행해보자.
부저가 없다면… 어쩌지?? ;;;
에라, 그래도 실습해보자! 바바이.