본문 바로가기
대한상공회의소 스마트팩토리 교육/IoT 디바이스 개발

[IoT 디바이스 개발] 아두이노«수업-3» : 피에조(Piezo) 부저 (tone 함수 / noTone 함수 / delayMicroseconds 함수)

by 나는영하 2022. 1. 27.

※ 주의사항 

본 블로그는 수업 내용을 바탕으로 제가 이해한 부분을 정리한 블로그입니다.
본 내용을 참고로만 보시고, 틀린 부분이 있다면 지적 부탁드립니다!

감사합니다😁

 

안녕하세요!!

오늘은 아래와 같은 내용을 확인해보겠습니다.

 

피에조(Piezo) 부저 결선 및 사용

tone 함수

noTone 함수

delayMicroseconds 함수


1.  피에조 부저(Piezo Buzzer) 결선

 1-1. 피에조 부저

피에조 부저(좌) / 결선사진(우)

피에조 부저의 결선법은 상대적으로 단순합니다.

좌측 그림과같이 피에조의 Pin은 2개가 있는데 하나는 (+) 나머지 한개는 (-)로 극성이 나뉩니다.

그리고 (+)는 아두이노의 5V(-)는 Digital I/O Pin에 결선시켜주면 됩니다.

그리고 (-)에 결선한 핀은 pinMode를 통해 OUTPUT으로 설정해주면 됩니다.

 

 1-2. 소리와 주파수, 주기 관계

- 공기 중에서 일어나는 진동으로 인한 현상인 '소리'는 진동의 '주파수'에 따라 다양한 종류의 소리를 발생합니다.

- 주파수에 따라서 음의 높이(피치)가 다릅니다. 기본적으로 피아노의 라(A)음은 진동수 440Hz에 해당합니다.

음계와 주파수(좌) / 라(A)음의 신호와 주기(주파수) 관계(우)

- 주기는 펄스가 같은 신호로 반복하는데 걸리는 시간을 뜻하고 주파수의 역수에 해당합니다.

- 주파수가 440Hz인 라(A)음의 주기는 1/440 = 0.002272s = 2272.73µs 입니다.

- 아두이노 보드의 디지털 입출력 핀을 사용하여 한주기에 약 2272.73µs이고
440번 반복하는 신호를 내보내면 라(A)음을 피에조 부저에서 출력할 수 있습니다.

 


 

2.  피에조 부저를 사용해서 표준 라(A)음 내기

 2-1. 표준 피치 라(A)음 내기

 1) 코드 설명

Line 8 : 440Hz(진동수)를 가지는 라(A)음을 내기 위해 440번 반복하는 반복문 사용

Line 9~10 : HIGH 신호를 1136µs 만큼 10번 핀으로 출력
※ delayMicroseconds() 함수는 delay 함수 와는 다르게 기본 단위가 µs(마이크로 세크) 입니다.

Line 11~12 : LOW 신호를 1136µs 만큼 10번 핀으로 출력

 

2-2. '도레미파솔라시' 출력 하기 (tone 함수 미사용)

- 펄스의 HIGH와 LOW의 지속시간(µ초) = ( 1 / 음의 주파수(Hz) * 1,000,000) / 2

- 배열에 도~시까지의 주파수를 저장해서 for문을 통해 음계 출력


 

3.  tone / noTone 함수를 사용해서 부저 출력하기

 3-1. '도레미파솔라시' 출력하기 (tone / noTone 함수 사용)

 1) 코드

 

 2) 사용함수

pinMode(), delay(), tone(), noTone()
- tone() :
출력 pin에 frequency를 가진 구형파를 duration 동안 출력합니다.
// tone(pin, frequency, duration) → duration 생략 가능

만약 duration을 생략했을때는 noTone을 호출할때 까지 계속 구형파를 출력하게 됩니다.

- noTone() : tone에 의해 생성된 구형파의 출력을 정지합니다. // noTone(pin)

 

 3-2. "반짝반짝 작은별" 연주하기

 1) 참고사항

- char형 문자열(mName[])을 만들어서 그 안에다 계이름을 넣습니다.

- 12행에서 sizeof(mName)을 통해 전체 계이름의 갯수를 확인하고 13행에서 전체 계이름 횟수만큼 반복합니다.

 

 3-3. 4개의 PushButton을 사용해서 '도레미파' 키보드 만들기

- Switch 입력 Pin : 3, 4, 5, 6

 1) 코드 설명

Line 14 : PushButton의 신호값을 'val' 변수에 저장 합니다

Line 15 : val에 저장한 값이 0 초과인 경우 즉, 푸시 버튼이 눌렸을 경우 아래 문장을 수행합니다.

Line 16 : 피에조 부저에 해당 계이름을 출력합니다.

Line 17 : while 문을 통해 푸시버튼이 1이 아닌 경우 즉, 버튼을 땠을 경우 아래 문장을 수행합니다.

Line 18 : 피에조 부저의 출력을 멈춥니다.


 

4.  가변저항을 사용해서 박자 조절하기

가변저항 부착 사진 및 소스코드

- 가변저항을 GND, Analog 5번 Pin, 5V에 각각 연결 후 analogRead() 함수를 통해 가변저항의 값을 value 라는 변수에 0~1024사이로 받습니다.

- 가변저항의 값을 tone 함수의 주기값에 속하는 3번째 파라메터에다 넣어줍니다.

- 가변저항의 값에 따라 '도레미파솔라시도'의 지속시간이 달라집니다.

댓글