6주차 - Jhyemin06/Embedded-System_2026 GitHub Wiki

GPIO 입력과 스위치 이벤트

  • GPIO 입력: 외부 상태(버튼 등)의 전기 신호를 읽어 Python 이벤트로 변환하는 과정
  • GPIO 출력: Python에서 신호를 보내 장치(LED, 부저 등)를 제어
  • 사용 환경: Raspberry Pi 4의 GPIO17을 입력, GPIO18을 출력으로 사용
  • 동작 흐름: 버튼 누름에 따른 전압 변화 → gpiozero 라이브러리의 이벤트 감지 → Python 콜백 실행 → 하드웨어 반응

4핀 푸시버튼 내부구조

구분 핵심 내용
내부 구조 4핀 택트 스위치는 내부 접점이 연결되어 있어 핀 2개씩 같은 전기적 연결을 가짐
연결 상태 버튼을 누르기 전에는 접점이 분리되고, 누르면 접점이 연결됨
연결 핀 확인 A1-A2는 같은 쪽, B1-B2는 같은 쪽으로 연결됨
브레드보드 장착 스위치를 중앙 홈을 가로질러 꽂아야 핀 간 오연결을 방지할 수 있음
주의 사항 같은 쪽 핀끼리 연결하지 말고, 서로 다른 쪽 핀을 사용해 스위치 입력을 구성해야 함

풀업/풀다운 논리

  1. 연결되지 않은 입력 핀은 주변 잡음의 영향을 받아 HIGH와 LOW 상태가 불규칙하게 변할 수 있다.
  2. 이를 방지하려면 풀업(Pull-up) 또는 풀다운(Pull-down) 저항을 사용해 입력 핀의 기본 상태를 안정적으로 설정해야 한다.
  3. 입력 핀에 명확한 HIGH(참) 또는 LOW(거짓) 상태를 유지하면 오작동을 줄이고 안정적으로 입력을 처리할 수 있다.

폴업과 풀다운의 저항 역할

버튼 회로 연결 실습

  • 배선 단계
  1. 점퍼 와이어를 Raspberry Pi 물리 핀 11 (BCM GPIO17) → 브레드보드 버튼 한 쪽 다리 연결
  2. 점퍼 와이어를 Raspberry Pi 물리 핀 6 (GND) → 버튼 반대쪽 다리 연결
  3. 버튼은 중앙 홈을 가로질러 브레드보드에 올바르게 배치 주의: GPIO 핀은 3.3V 전용, 5V 연결 시 보드 손상 위험

파이썬 라이브러리를 통한 실습

  • 버튼이 눌릴 때까지 기다리기
from gpiozero import Button  # 버튼 입력 클래스
button = Button(17)  # BCM 17번, 내부 풀업 사용
print("버튼을 누르세요.")  # 사용자 안내
button.wait_for_press()  # 눌림 상태가 될 때까지 대기
print("버튼이 눌렸습니다.")  # 대기 종료 후 실행
button.close()  # 사용한 GPIO 자원 반환

  • 폴링으로 반복 확인
from gpiozero import Button  # 버튼 입력 클래스
from time import sleep  # 반복 사이의 대기 함수
button = Button(17)  # BCM 17번, 내부 풀업 사용
try:  # 실행 후에는 finally에서 자원 정리
    while True:  # 버튼 상태를 계속 확인
        if button.is_pressed:  # 누르면 True(전압은 LOW)
            print("PRESSED")  # 누르는 동안 반복 출력
        else:  # 버튼을 떼고 있는 상태
            print("RELEASED")
        sleep(0.1)  # 0.1초 대기 후 다시 확인
finally:  # Ctrl+C 등으로 벗어나도 정리

폴링과 이벤트 방식

구분 동작 방식 주요 특징 및 기능
폴링(Polling) 일정한 시간 간격으로 상태 확인 주기적으로 상태를 확인하며, 설정된 주기에 따라 반복 실행
이벤트(Event) 특정 이벤트 발생 시 감지 및 처리 상태 변화에 즉각적으로 반응하며, 이벤트 발생 시 처리
응답 속도 폴링 주기에 따라 지연 발생 가능 이벤트 발생 시 빠른 대응 가능
자원 효율 변경 사항이 없어도 반복 확인하여 자원 소모 불필요한 반복 확인을 줄여 자원 효율 향상
주요 특징 구현이 단순하고 주기 제어가 쉬움 반응성이 높지만 이벤트 처리 구조가 필요함
  • 폴링 주기
  • 이벤트 방식의 버튼 실습
from gpiozero import Button  # 버튼 입력 클래스
from signal import pause  # 메인 실행 흐름 대기
button = Button(17)  # BCM 17번, 내부 풀업 사용
def pressed():  # 눌림 이벤트에서 실행할 함수
    print("버튼을 눌렀습니다.")
# 함수 자체를 등록: pressed()처럼 호출하지 않음
button.when_pressed = pressed
try:
    pause()  # 프로그램을 유지하며 이벤트 처리
finally:  # Ctrl+C 등으로 종료할 때 정리
    button.close()  # GPIO 자원 반환