버저(Buzzer)를 이용한 작은별 동요 실행 > 스마트기기시스템

본문 바로가기

[실습] 버저(Buzzer)를 이용한 작은별 동요 실행

필기자
2025-04-02 09:55 599 0

본문

버저(Buzzer)를 이용한 작은별 동요 실행

목 적
  • 라즈베리파이에 버저(Buzzer) 액추레이터 사용법을 이해한다.
  • 버저(Buzzer) 액추레이터를 응용하여 단음 작은별 동요를 실행한다.
목 차
1. 버저(Buzzer) 액츄레이터 모듈 설치
2. 버저(Buzzer) 액츄레이터 구동 및 응용

1. 버저(Buzzer) 액츄레이터 모듈 설치
  • 액티브 버저 모듈
    • 액티브 버저 모듈은 전기 신호를 받았을 때 소리를 내는 장치임.
    • 내장된 발진 회로를 가지고 있어서 단순히 전원을 공급하면 특정 주파수로 소리를 낼 수 있음.
    • 액티브 버저는 로봇, 알람 시스템, 사용자 인터페이스 피드백 등 다양한 응용 프로그램에 사용됨.
  • 기본 사양
    • 전원 공급: 일반적으로 3.3V 또는 5V DC
    • 소비 전류: 약 30mA
    • 작동 주파수: 주로 2kHz 내외
    • 소리 크기: 약 85 dB 정도
  • GPIO 연결
    • VCC : 3.3V 또는 5V Power(핀 1 또는 2)
    • GND : Ground 접지(핀 2)
    • IN : 입력 핀으로 LOW 또는 HIGH 신호에 따라 버저가 활성화됨
      • GPIO 17(핀 11)
3529946166_okZ3KScG_2f584db2522b33214397357dc66abd06a3d78560.png

3529946166_ct0AlNfI_8fad85536565ca793bc3f0ef9bcb6d7ae9b5fb4c.png

2. 버저(Buzzer) 액츄레이터 구동 및 응용
  • 기본 구동 프로그램 : 라즈베리파이 가상환경에서 파이썬 코딩
    • VSCode에서 buzzer.py 파일 생성
    • GPIO 17핀(핀 11)을 출력 모드로 설정
    • GPIO 17핀을 순회하면 On/Off 코딩

3529946166_boQfiIZ6_fe6120b724aad935ede645588af00c918c2a648d.png


import RPi.GPIO as GPIO
import time

# GPIO 모드 설정
GPIO.setmode(GPIO.BCM)

# 사용할 GPIO 핀의 번호를 설정한다. 여기서는 17번 핀을 사용한다.
BUZZER_PIN = 17
GPIO.setup(BUZZER_PIN, GPIO.OUT)

try:
    while True:
        # 부저를 켠다.
        GPIO.output(BUZZER_PIN, GPIO.HIGH)
        print("Buzzer on")
        time.sleep(1) # 1초 동안 대기

        # 부저를 끈다.
        GPIO.output(BUZZER_PIN, GPIO.LOW)
        print("Buzzer off")
        time.sleep(1) # 1초 동안 대기

except KeyboardInterrupt:
    # 프로그램 종료 시 GPIO 핀 상태를 초기화한다.
    GPIO.cleanup()

 
  • 계이름 응용 구동 프로그램 : 라즈베리파이 가상환경에서 파이썬 코딩
    • VSCode에서 buzzer_melody.py 파일 생성
    • 주파수 대역과 음 지속 시간을 이용하여 계이름(도레미파...시도) 소리 출력

import RPi.GPIO as GPIO
import time
# GPIO 모드 설정
GPIO.setmode(GPIO.BCM)
# Buzzer 핀 설정
BUZZER_PIN = 17
GPIO.setup(BUZZER_PIN, GPIO.OUT)
pwm = None
# PWM 인스턴스 생성 및 초기 주파수 설정
pwm = GPIO.PWM(BUZZER_PIN, 100) #부저의 경우 MAX 2000(2kHz), 출력 범위(약 1Hz ~ 10kHz)
pwm.start(0)  
# 주요 음표의 주파수 (단위: Hz)
notes = {
    'C4': 261.63,
    'D4': 293.66,
    'E4': 329.63,
    'F4': 349.23,
    'G4': 392.00,
    'A4': 440.00,
    'B4': 493.88,
    'C5': 523.25  # 추가된 높은 도 음표
}
# 간단한 멜로디 (음표와 지속 시간)
melody = [('C4', 0.5), ('D4', 0.5), ('E4', 0.5), ('F4', 0.5),
          ('G4', 0.5), ('A4', 0.5), ('B4', 0.5), ('C5', 0.5)]  # 마지막 음을 높은 도로 변경
def play(note, duration):
    pwm.ChangeFrequency(notes[note])
    pwm.ChangeDutyCycle(50)  # 켜짐
    time.sleep(duration)  # 음표 지속 시간
    pwm.ChangeDutyCycle(0)  # 꺼짐
try:  
    for note, duration in melody:
        play(note, duration)
        time.sleep(0.1)  # 음표 사이의 간격
finally:
    if pwm is not None:
        try:
            pwm.stop()
        except:
            pass
        del pwm  # __del__ 호출 시 오류 방지
    GPIO.cleanup()
  • PWM(Pulse Width Modulation) 이론
용어 설명
PWM (펄스폭 변조) 디지털 핀에서 출력 신호의 ON/OFF 비율을 조절하여 아날로그처럼 동작하게 하는 방식
DutyCycle(듀티 사이클) 하나의 주기 내에서 ON(신호 High) 상태가 차지하는 비율(%)
예: 50%면 ON/OFF 비율이 1:1 (음색이 변함, 예: 10%는 얇고 날카로운 소리, 90%는 두껍고 탁한 소리)
Frequency(주파수) 1초당 반복되는 PWM 신호의 횟수(Hz)
응용 분야 모터 속도 조절, LED 밝기 조절, 부저(Buzzer) 음정 제어 등

20250402113714_733e3b51acae139abbddfc505e851720_c5oz.png
  • 소리의 원리
항목 설명
진동수(Hz) 초당 공기의 압력이 몇 번 변화하는가
주파수 ↑ 음의 높이가 높아짐 (예: 도 → 미 → 솔)
주파수 ↓ 음의 높이가 낮아짐
부저(PWM) 전기적 ON/OFF로 진동을 만들어 공기를 흔듦
공기 진동(파동)을 받아 음높이로 인식
가청 주파수 약 20Hz ~ 20,000Hz
 
  • PWM에서 LED 밝기 조절 공식
    • 공급 전압 Vsupply = 5V, LED 순방향 전압 VLED = 3V, 저항 R = 220Ω, 듀티사이클 80%
  1. 순간 전류 (옴의 법칙):
    I = (Vsupply − VLED) / R = (5 − 3) / 220 = 9.09mA
  2. 평균 전류 (옴의 법칙 × 듀티사이클):
    Iavg = 9.09mA × 0.8 = 7.27mA
  3. 평균 전력 (전압 × 평균 전류):
    P = 2V × 7.27mA = 14.54mW
듀티사이클 (%) 순간 전류 (mA)
I = (5−3)/220
평균 전류 (mA)
Iavg = I × 듀티
평균 전력 (mW)
P = 2V × Iavg
10% 9.09 9.09 × 0.1 = 0.91 2 × 0.91 = 1.82
20% 9.09 9.09 × 0.2 = 1.82 2 × 1.82 = 3.64
30% 9.09 9.09 × 0.3 = 2.73 2 × 2.73 = 5.45
40% 9.09 9.09 × 0.4 = 3.64 2 × 3.64 = 7.27
50% 9.09 9.09 × 0.5 = 4.55 2 × 4.55 = 9.09
60% 9.09 9.09 × 0.6 = 5.45 2 × 5.45 = 10.91
70% 9.09 9.09 × 0.7 = 6.36 2 × 6.36 = 12.73
80% 9.09 9.09 × 0.8 = 7.27 2 × 7.27 = 14.54
90% 9.09 9.09 × 0.9 = 8.18 2 × 8.18 = 16.36
100% 9.09 9.09 × 1.0 = 9.09 2 × 9.09 = 18.18

[문제: 부저를 이용한 동요 재생 실습]
  • 다음 작은별 악보를 보고 부저 프로그램을 완성하여라.

3529946166_D3MULgIs_6f07511f254ef257335b94e9fd1d52b78e6c1392.png


 
[문제: 3Color LED와 부저를 이용한 동요 재생 실습]
  • 3컬러 RGB LED는 아래와 같이 연결되어 있다.
    • 빨강: GPIO 18
    • 초록: GPIO 23
    • 파랑: GPIO 24
  • 작은별 멜로디를 부저로 연주한다.
  • 각 음이 재생될 때, 해당 음에 지정된 색상으로 RGB LED가 점등된다.
  • 음이 끝나면 LED는 꺼진다.
  • 사용된 음표에 대한 색상 매핑은 아래와 같다.
 
음표 색상 RGB 상태(GPIO)
C4 빨강 (1, 0, 0)
D4 초록 (0, 1, 0)
E4 파랑 (0, 0, 1)
F4 노랑 (1, 1, 0)
G4 하늘 (0, 1, 1)
A4 보라 (1, 0, 1)
B4 흰색 (1, 1, 1)
C5 빨강 (1, 0, 0)


import RPi.GPIO as GPIO
import time
# GPIO 설정
GPIO.setmode(GPIO.BCM)
# 핀 번호
BUZZER_PIN = 17
RED_PIN = 18
GREEN_PIN = 23
BLUE_PIN = 24
# 핀 모드 설정
GPIO.setup(BUZZER_PIN, GPIO.OUT)
GPIO.setup(RED_PIN, GPIO.OUT)
GPIO.setup(GREEN_PIN, GPIO.OUT)
GPIO.setup(BLUE_PIN, GPIO.OUT)
# 부저 PWM 초기화
pwm = GPIO.PWM(BUZZER_PIN, 100)
pwm.start(0)
# 음표 주파수
notes = {
    'C4': 261.63,
    'D4': 293.66,
    'E4': 329.63,
    'F4': 349.23,
    'G4': 392.00,
    'A4': 440.00,
    'B4': 493.88,
    'C5': 523.25
}
# 색상 매핑 (C5도 빨강으로 수정)
colors = {
    'C4': (1, 0, 0),  # 빨강
    'D4': (0, 1, 0),  # 초록
    'E4': (0, 0, 1),  # 파랑
    'F4': (1, 1, 0),  # 노랑
    'G4': (0, 1, 1),  # 하늘
    'A4': (1, 0, 1),  # 보라
    'B4': (1, 1, 1),  # 흰색
    'C5': (1, 0, 0)   # 빨강으로 수정
}
# 작은별 멜로디
# melody = [('C4', 0.5), ('C4', 0.5), ('G4', 0.5), ('G4', 0.5)]
melody = [
    ('C4', 0.5), ('C4', 0.5), ('G4', 0.5), ('G4', 0.5),
    ('A4', 0.5), ('A4', 0.5), ('G4', 1.0),
    ('F4', 0.5), ('F4', 0.5), ('E4', 0.5), ('E4', 0.5),
    ('D4', 0.5), ('D4', 0.5), ('C4', 1.0),
    ('G4', 0.5), ('G4', 0.5), ('F4', 0.5), ('F4', 0.5),
    ('E4', 0.5), ('E4', 0.5), ('D4', 1.0),
    ('G4', 0.5), ('G4', 0.5), ('F4', 0.5), ('F4', 0.5),
    ('E4', 0.5), ('E4', 0.5), ('D4', 1.0),
    ('C4', 0.5), ('C4', 0.5), ('G4', 0.5), ('G4', 0.5),
    ('A4', 0.5), ('A4', 0.5), ('G4', 1.0),
    ('F4', 0.5), ('F4', 0.5), ('E4', 0.5), ('E4', 0.5),
    ('D4', 0.5), ('D4', 0.5), ('C4', 1.0)
]
# LED 색상 출력 함수
def set_color(r, g, b):
    GPIO.output(RED_PIN, r)
    GPIO.output(GREEN_PIN, g)
    GPIO.output(BLUE_PIN, b)
# 음 재생 함수
# 음 재생 함수
def play_note(note, duration):
    freq = notes.get(note, None)  # 기본값을 None으로 설정하고 유효한 주파수인지 확인
    rgb = colors.get(note, (0, 0, 0))
    if freq:  # freq가 None이 아니면 실행
        pwm.ChangeFrequency(freq)
        pwm.ChangeDutyCycle(50)
        set_color(*rgb)
        time.sleep(duration)
        pwm.ChangeDutyCycle(0)
        set_color(0, 0, 0)
        time.sleep(0.05)
# 실행
try:
    for note, dur in melody:
        play_note(note, dur)
except Exception as e:
    print(f"실행 중 예외 발생: {e}")
finally:
    if pwm is not None:
        try:
            pwm.stop()
        except:
            pass
        del pwm  # __del__ 호출 시 오류 방지
    GPIO.cleanup()

댓글목록0

등록된 댓글이 없습니다.
게시판 전체검색