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는 같은 쪽으로 연결됨 |
| 브레드보드 장착 |
스위치를 중앙 홈을 가로질러 꽂아야 핀 간 오연결을 방지할 수 있음 |
| 주의 사항 |
같은 쪽 핀끼리 연결하지 말고, 서로 다른 쪽 핀을 사용해 스위치 입력을 구성해야 함 |
풀업/풀다운 논리
- 연결되지 않은 입력 핀은 주변 잡음의 영향을 받아 HIGH와 LOW 상태가 불규칙하게 변할 수 있다.
- 이를 방지하려면 풀업(Pull-up) 또는 풀다운(Pull-down) 저항을 사용해 입력 핀의 기본 상태를 안정적으로 설정해야 한다.
- 입력 핀에 명확한 HIGH(참) 또는 LOW(거짓) 상태를 유지하면 오작동을 줄이고 안정적으로 입력을 처리할 수 있다.
폴업과 풀다운의 저항 역할
버튼 회로 연결 실습
- 점퍼 와이어를 Raspberry Pi 물리 핀 11 (BCM GPIO17) → 브레드보드 버튼 한 쪽 다리 연결
- 점퍼 와이어를 Raspberry Pi 물리 핀 6 (GND) → 버튼 반대쪽 다리 연결
- 버튼은 중앙 홈을 가로질러 브레드보드에 올바르게 배치
주의: 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 자원 반환