Chapter 6. 기본 디지털 입출력 (LED, 스위치, 부저)

브레드보드를 활용해 외부 소자들을 연결해 봅시다. 전기를 내보내는 출력(Output)과 외부 상태를 읽어들이는 입력(Input)의 기초를 다집니다.

Pico 2 스위치 (Input) GP14 LED (Output) GP15

디지털 입출력의 흐름: 스위치 신호 입력 → 보드 판단 → LED 전기 출력

6.1 스위치 입력을 받아 외장 LED 제어하기

스위치가 눌렸을 때 발생하는 전류 신호를 읽어 외부 LED를 켜는 조건문 실습입니다. 안정적인 입력을 위해 내부 풀다운(Pull-Down) 저항을 활성화합니다.

Pico 2 3V3 GP14 GP15 GND 스위치 330Ω LED ← 읽기(INPUT) → 출력(OUTPUT) 3.3V (전원) GP14 (입력) GP15 (출력) GND

스위치 한쪽 → GP14, 반대쪽 → 3.3V. LED는 330Ω 저항과 직렬로 GP15 → 저항 → LED(+) → LED(−) → GND 순으로 연결합니다.

from machine import Pin
import time

# GPIO 15번에 외장 LED 연결 (출력 모드)
external_led = Pin(15, Pin.OUT)

# GPIO 14번에 푸시 스위치 연결 (입력 모드 및 내부 풀다운 저항 활성화)
# 버튼을 누르면 1(High), 떼면 0(Low)이 입력됩니다.
switch = Pin(14, Pin.IN, Pin.PULL_DOWN)

print("스위치 감지 시스템 가동...")

while True:
    if switch.value() == 1:       # 스위치가 눌렸다면
        external_led.value(1)     # 외장 LED 켜기
        print("버튼 클릭 -> LED ON")
    else:                         # 스위치가 떨어졌다면
        external_led.value(0)     # 외장 LED 끄기
        
    time.sleep(0.05)              # 채터링(흔들림) 방지를 위한 짧은 대기

6.2 능동 부저 vs 수동 부저 제어

능동 부저(Active Buzzer)는 전원만 주면 단일 경고음이 나고, 수동 부저(Passive Buzzer)는 주파수 신호(PWM)를 주어야 원하는 음계(도레미파)를 연주할 수 있습니다.

Pico 2 GP16 GND 부저 (Buzzer) + (Signal) − (GND) → PWM 신호(OUT)

부저 + 단자(S 핀)→GP16, − 단자→GND. 능동 부저도 동일 배선이며, 수동 부저와 달리 GP16을 ON/OFF하는 것만으로 소리가 납니다.

[실습] 수동 부저를 이용한 도레미파 멜로디 연주

from machine import Pin, PWM
import time

# GPIO 16번에 수동 부저 연결 후 PWM 인스턴스 생성
buzzer = PWM(Pin(16))

# 음계별 주파수 정의 (도, 레, 미, 파)
tones = {
    'DO': 262,
    'RE': 294,
    'MI': 330,
    'FA': 349
}

def play_tone(frequency, duration):
    if frequency == 0:
        buzzer.duty_u16(0) # 소리 끄기
    else:
        buzzer.freq(frequency)       # 주파수 설정
        buzzer.duty_u16(32768)       # 소리 크기 설정 (50% 듀티폭)
    time.sleep(duration)
    buzzer.duty_u16(0)               # 음과 음 사이 음소거
    time.sleep(0.05)

try:
    print("멜로디 연주를 시작합니다.")
    play_tone(tones['DO'], 0.5)
    play_tone(tones['RE'], 0.5)
    play_tone(tones['MI'], 0.5)
    play_tone(tones['FA'], 0.5)
finally:
    # 에러가 발생하거나 연주가 끝나면 안전하게 소리를 끄고 객체 해제
    buzzer.duty_u16(0)
    buzzer.deinit()
    print("시스템이 안전하게 종료되었습니다.")