AI-mobility

buzzer, button

부저를 작동하는 방법과 버튼을 작동하는 방법 그리고 읽을 시 풀업, 풀다운 저항에 대해서 깊게 다루었다.

buzzer, button

buzzer에 대하여

부저는 전기 신호를 진동으로 바꾸어 소리를 내는 기계이다. 현재 실습 중인 모델 기준 GP6에 부저가 장착되어 있다.

부저가 내부 판을 진동시키는 두 가지 방식

부저가 내부 판을 진동시키는 방식은 압전 부저 방식과 전자기 부저 방식이 있다.

압전 부저

압전 부저는 전압을 가하면 아주 조금 휘어지는 성질을 가진 압전 세라믹을 이용하여 진동을 만들어 소리를 낸다.

전자기 부저

전자기 부저는 코일과 자석을 이용하여 자기장으로 자석을 진동시켜 소리를 낸다.

빠르게 진동하면 높은 음을 내고 느리게 진동하면 낮은 음을 낸다. 빠르거나 느린 정도를 우리는 주파수라고 한다.

부저의 종류

이제 부저의 종류를 알아보자.

부저는 능동 부저와 수동 부저가 있다.

능동 부저

능동 부저에는 내부에 발전기가 있기 때문에 단순한 On, Off 만으로도 소리를 내게 할 수 있다. 하지만 음의 높낮이를 바꿀 수 없으므로 경고음을 출력하는 상황에 어울릴 수 있다. 다음과 같이 코드를 작성할 수 있다.

from machine import Pin
import time

buzzer = Pin(6, Pin.OUT)

buzzer.value(1)
time.sleep(1)

buzzer.value(0)

수동 부저

수동 부저는 프로그래머가 직접 주파수를 설정하여 진동시킬 수 있다. 필자가 실습하는 모델 안에는 수동 부저가 장착되어 있어 아래와 같은 주파수 음 표를 이용하여 원하는 소리를 출력시킬 수 있다.

음계 영문 표기 3옥타브 주파수 4옥타브 주파수 5옥타브 주파수
C 130.81 Hz 261.63 Hz 523.25 Hz
도♯ / 레♭ C♯ / D♭ 138.59 Hz 277.18 Hz 554.37 Hz
D 146.83 Hz 293.66 Hz 587.33 Hz
레♯ / 미♭ D♯ / E♭ 155.56 Hz 311.13 Hz 622.25 Hz
E 164.81 Hz 329.63 Hz 659.25 Hz
F 174.61 Hz 349.23 Hz 698.46 Hz
파♯ / 솔♭ F♯ / G♭ 185.00 Hz 369.99 Hz 739.99 Hz
G 196.00 Hz 392.00 Hz 783.99 Hz
솔♯ / 라♭ G♯ / A♭ 207.65 Hz 415.30 Hz 830.61 Hz
A 220.00 Hz 440.00 Hz 880.00 Hz
라♯ / 시♭ A♯ / B♭ 233.08 Hz 466.16 Hz 932.33 Hz
B 246.94 Hz 493.88 Hz 987.77 Hz

코드는 다음과 같이 작성할 수 있다.

from machine import Pin, PWM
import time

buzzer = PWM(Pin(6))

buzzer.freq(1000)        # 1000Hz
buzzer.duty_u16(32768)   # 약 50%

button에 대하여

버튼은 GPIO핀의 전압을 보고 HIGH, LOW를 판단한다.

Pin class 글에서 입력 상태에 대해 자세하게 설명했듯이, 버튼처럼 핀의 모드가 입력인 상황에서 아무 행위를 하지 않으면 플로팅 상태가 될 수 있다고 하였다.

Pin class 글로 가기

따라서, 입력 값이 주변 회로의 전기적 신호나 사람의 정전기로 인해 불규칙하게 나올 수 있다.

0 0 1 0 1 1 0 1 0 ...

그렇기 때문에 프로그래머는 Pin class를 사용할 때 pull 파라미터를 꼭 지정해주어야 한다고 설명 하였다.

풀저항

풀 저항은 풀업 저항이 있고 풀 다운 저항이 있다. 쉽게 말해서 풀저항을 3.3V 쪽에 배치하냐 GND쪽에 배치하냐의 차이이다. 풀 저항을 이용하는 이유는 버튼이 눌리지 않았을 때, 즉 입력이 주어지지 않는 상황을 정의하기 위함이 있다.

풀업 저항

풀업 저항으로 설정하는 방법은 다음과 같다.

button = Pin(6, Pin.IN, pull=Pin.PULL_UP)

그리하여, 버튼이 눌리지 않았을 때는 저항을 통해 GPIO핀은 3.3V의 높은 전압을 인식하게 되고 HIGH 값이 찍히게 된다.

       3.3V
         │
      풀업 저항
         │
         └──── GP4

       버튼 열림

하지만, 버튼이 눌렸을 때는 아래와 같이 GND와 연결되어 거의 낮은 전압으로 GPIO가 인식하게 되고 LOW값이 찍히게 된다.

       3.3V
         │
      풀업 저항
         │
         ├──── GP4
         │
       버튼 닫힘
         │
        GND

정리하면, 풀업 저항은 입력이 주어지지 않았을 때 HIGH 값을 읽도록 유도하는 것이다.

풀 다운 저항

풀다운 저항으로 설정하는 방법은 다음과 같다.

button = Pin(6, Pin.IN, pull=Pin.PULL_DOWN)

풀다운 저항은 풀업과 다르게 3.3V 쪽에 버튼을 두고, GND 쪽에 저항을 둔다

       3.3V
         │
       버튼
         │
         ├──── GP4 입력
         │
     풀다운 저항
         │
        GND

그리하여 버튼을 누르지 않았을 때는 LOW가 찍히는 것이다. 버튼을 눌렀을 떄는 동일한 논리로 HIGH가 찍히게 된다.

지금까지 알아본 풀 저항은 내장되어 있는 내부 풀 저항을 말한 것이다. 만약, 회로도 내부에 외부 풀 저항이 연결되어 있는 구조라면 내부 풀 저항과 충돌할 수 있다.

외부 회로 내부 설정 결과
외부 풀업 내부 풀업 같은 방향, 보통 문제 없음
외부 풀다운 내부 풀다운 같은 방향, 보통 문제 없음
외부 풀업 내부 풀다운 반대 방향, 충돌 가능
외부 풀다운 내부 풀업 반대 방향, 충돌 가능
외부 풀 저항 없음 내부 풀업/다운 내부 저항이 기본값을 결정

그래서 프로그래머는 우선 회로도를 보고 외부 풀 저항이 있는지 확인 후, 내부 풀 저항을 고려해야할 것이다.

Related records

읽던 위치가 있어요.
확대 이미지