4주차 ‐ GPIO 출력과 LED 제어 - Jhyemin06/Embedded-System_2026 GitHub Wiki
전자회로 용어 개념
옴의 법칙
I(전류) = v(전압)/R(저항)
- 전류는 전압에 비례하고 저항이 반비례하는 전기회로에서의 기본 법칙
저항
- 전기회로에서 전류의 흐름을 방해하는 성질
키르히호프의 전류 법칙(KCL)
ΣI(in) = ΣI(out) / (유입 전류의 합 = 유출 전류의 합)
- 회로의 어떤 마디(노드, Node)에 들어오는 전류의 총합과 나가는 전류의 총합이 항상 같다는 법칙
GPIO(General Purpose Input/Output, 범용 입출력) 출력 원리
마이크로컨트롤러(MCU)나 프로세서 내부의 레지스터에 특정 값(1 또는 0)을 쓰면, 하드웨어 회로가 이를 전기적 신호(High 또는 Low 전압)로 변환해 외부 핀으로 내보내는 과정
- 1을 쓸 경우: 논리적 High 상태가 되어 핀으로 3.3V 또는 5V(보드 작동 전압)의 전압이 출력됨.
- 0을 쓸 경우: 논리적 Low 상태가 되어 핀으로 0V(GND)가 출력됨.
실습과정 전
실습 전 준비물
- 라즈베리파이4 보드
- SD카드
- SD카드 리더기
- LED
- 5V 충전기
- 스위치 전원 장치
- 점퍼 와이어 2~3개
- 330Ω 저항 1개
실습 전 주의사항
5V 배터리에 LED를 저항없이 꽂으면 안되는 이유
이유: LED에서 허용하는 전류보다 더 큰 전류가 저항없이 들어오기 때문에 결과: LED가 터지는 손상될 수 있다. -> 전류에 알맞게 저항을 사용하면 해결된다.
하지만, 저항을 달았더라도 타버릴 수 있다
전기회로가 고장나는 것을 방지하기 위해 저항을 사용하지만 저항 자체가 타버릴수도 있다. 이유: 저항의 전력 한계를 넘겼을 경우에 저항 자체가 타버릴 수 있다.
실습
실습 폴더 및 환경 확인
mkdir -p ~/embedded/week03
cd ~/embedded/week03
python3 --version # 파이썬 버전 확인
python3 -c "import gpiozero; print(gpiozero.__version__)" #gpiozero 설치 확인
단일점등
- LED 2초 키기
from gpiozero import LED
from time import sleep
led = LED(17) # BCM GPIO17
led.on()
sleep(2)
led.off()
led.close()
안전종료
from gpiozero import LED
from time import sleep
led = LED(17) # BCM GPIO17 객체 생성
try:
led.on()
sleep(2)
print("LED off")
finally:
led.off()
led.close() # GPIO 자원 해제
gpiozero를 이용한 LED 점멸 제어 방식 비교
gpiozero 라이브러리를 사용하여 LED의 점멸 횟수와 주기를 제어하는 두 가지 대표적인 방식을 비교합니다.
- for 반복문으로 직접 제어하기 for 반복문과 sleep() 함수를 사용하여 LED의 점멸 횟수와 주기를 직접 제어하는 방식입니다.
from gpiozero import LED
from time import sleep
led = LED(17)
try:
for count in range(5):
led.on()
sleep(1.0)
led.off()
sleep(1.0)
print(count + 1)
finally:
led.close()
주요 개념 및 설명
- 주기: 1.0초 ON + 1.0초 OFF \rightarrow 총 주기 2.0초
- 반복: range(5)를 사용하여 동일한 점멸 과정을 총 5회 수행
- 실습 참고: 0.2초 ON / 0.8초 OFF로 설정값을 변경하여 체감 차이를 비교·설명해볼 수 있습니다.
- blink() 메서드로 비동기 제어하기 gpiozero에서 제공하는 blink() 함수를 사용하여 비동기(백그라운드) 점멸을 간결하게 구현하는 방식입니다.
from gpiozero import LED
from signal import pause
led = LED(17)
led.blink(
on_time=0.2,
off_time=0.8
)
try:
pause()
finally:
led.close()
주요 개념 및 설명
- 백그라운드 점멸: blink() 호출 후에도 프로그램이 블록되지 않고 다음 작업을 지속해서 수행할 수 있습니다.
- pause(): 프로그램을 바로 종료하지 않고 이벤트를 대기 상태로 유지합니다.
- 주의사항: 코드의 길이가 짧을수록 종료 조건과 자원 정리(led.close())를 더 명확하게 작성해야 합니다.