04. 라즈베리 파이4로 LED 전등 작동 - EnglishNo/EmbeddedSystem GitHub Wiki
실습 전 알아야 할 정보
갈림길에서 전류가 사라지지 않는 절대 원리
옴의 법칙의 한계
- 옴의 법칙 :
V = I × RV: 전압I: 전류R: 저항
- 한계)
- 복잡한 회로에서 전류가 여러 갈래로 나뉘는 경우, 옴의 법칙만으로는 각 가지에 흐르는 전류를 결정하기 어려움.
- 따라서 키르히호프의 법칙 등을 함께 사용하여 회로 분석.
키르히호프의 전류 법칙 (KCL)
- 전하량 보존)
- 전하는 갑자기 생성되거나 사라지지 않음.
- 노드에 들어온 전류는 나가는 전류와 같음.
- KCL 정의)
- 하나의 노드에 들어오는 전류의 합은 나가는 전류의 합과 같음.
- 부호를 정하여 표현하면 하나의 노드에서 모든 전류의 합은
0(ΣI = 0).
- 적용)
- 여러 갈래로 나뉘는 복잡한 전기회로에서 각 가지에 흐르는 전류를 분석하는 데 사용.
LED를 5V에 바로 꽂으면 일어나는 일
LED를 5V에 바로 꽂아버린다면?
- 결과 : LED에 과도한 전류가 흘러 LED가 손상될 수 있음.
- 원인 : LED의 허용 전류보다 큰 전류가 흐르기 때문.
- 전압은 전류를 흐르게 하는 원인이며, 과도한 전류가 흐르면 부품이 과열되어 손상될 수 있음.
- 따라서 부품이 견딜 수 있는 전류보다 큰 전류가 흐르지 않도록 전류를 제한해야 함.
- 해결책 : 전류를 알맞게 제한하기 위해 저항 사용.
옴의 법칙
- 설명 : 전압과 전류를 이용하여 필요한 저항값을 계산하는 공식.
- 예 : 5V에서 2V로 켜지는 20mA LED)
- 전원
5V중 LED에2V가 걸리므로 나머지3V는 저항에 걸림. 20mA = 0.02AR = V / I3V / 0.02A = 150Ω- 따라서
150Ω저항을 사용하면 LED에 흐르는 전류를 약20mA로 제한할 수 있음.
- 전원
저항을 달았는데도 타버리는 진짜 이유
반전과 한계
- 설명)
- 과도한 전류로 인해 전기 회로가 고장나는 것을 방지하기 위해 저항 사용.
- 다만 저항 자체가 타버리는 경우도 있음.
- 저항이 타버린 이유)
- 저항이 견딜 수 있는 전력의 한계(정격 전력)를 넘겼기 때문.
저항
- 종류 & 용도)
- 탄소 피막 : 일반적인 회로에서 사용.
- 금속 피막 : 오차가 작아 정밀한 회로에 사용.
- 시멘트 저항 : 많은 전력을 견뎌야 하는 회로에 사용.
- 저항값 읽기)
- 방향 잡기 : 금색이나 은색 띠를 오른쪽에 둔 상태로 읽음.
- 숫자 : 1·2번째 띠는 숫자, 3번째 띠는 곱하는 값(승수) 나타냄.
- 예 : 빨강, 빨강, 갈색 →
22 × 10 = 220Ω, 마지막 금색·은색 띠는 오차 범위를 나타냄.
부품마다 전압이 다른 이유
회로의 위험
- 각 부품에 걸리는 전압을 제대로 확인하지 않으면, 과전압으로 인해 칩이나 부품이 손상될 수 있음.
KVL (키르히호프의 전압 법칙)
- 원리)
- 하나의 폐회로를 한 바퀴 돌았을 때 전압의 상승과 감소를 모두 더하면 그 합은 0.
- 전원에서 상승한 전압과 저항 등에서 감소한 전압의 총합은 같음.
- 즉, 폐회로에서 전압 변화의 총합은 항상 0 (
ΣV = 0).
- 예)
- 배터리에서 전압이
12V상승함. - 첫 번째 저항에서
4V감소함. - 두 번째 저항에서 나머지
8V감소함. - 출발점으로 돌아오면
+12V - 4V - 8V = 0V.
- 배터리에서 전압이
실습 -라즈베리 파이4를 이용해 LED 전등을 작동시키자-
회로 모습
회로도
회로 구성 방법
- 라즈베리 파이의 GPIO17(
11번째 핀)하고 연결된 케이블을 브레드 보드 +극 선로에 끼운다. - 저항으로 다른 선하고 연결한 다음, LED 다리 긴 쪽(+극)와 연결시킨다.
- LED 다리 짧은 쪽(-극)하고 브레드 보드 -극 선로을 연결한 다음, 라즈베리 파이 Ground하고 연결시키면 끝.
- 라즈베리 파이 핀 구조도 참고 : https://github.com/EnglishNo/EmbeddedSystem/wiki/01.-라즈베리파이4에-대한-설명-및-환경세팅#라즈베리파이4-핀맵---gpio-40핀-구성
코드 작성
from gpiozero import LED # gpiozero 라이브러리에서 LED 제어 클래스 불러오기
from time import sleep # time 모듈에서 시간 대기(sleep) 함수 불러오기
# BCM 번호 기준 GPIO 17번 핀에 연결된 LED 객체 생성
led = LED(17) # BCM GPIO17
led.on() # LED 켜기 (GPIO 17번 핀에 HIGH/1 신호 출력)
sleep(2) # 2초 동안 대기
led.off() # LED 끄기 (GPIO 17번 핀에 LOW/0 신호 출력)
led.close() # 사용이 끝난 GPIO 핀 자원 해제
예외처리한 코드
from gpiozero import LED # gpiozero 라이브러리에서 LED 제어 클래스 불러오기
from time import sleep # time 모듈에서 시간 대기(sleep) 함수 불러오기
# BCM 번호 기준 GPIO 17번 핀에 연결된 LED 객체 생성
led = LED(17)
try:
led.on() # LED 켜기 (GPIO 17번 핀에 HIGH/1 신호 출력)
sleep(2) # 2초 동안 대기
finally:
# 예외 발생 여부와 상관없이 무조건 실행되어 안전한 종료 보장
led.off() # LED 끄기 (GPIO 17번 핀에 LOW/0 신호 출력)
led.close() # 사용이 끝난 GPIO 핀 자원 해제
결과
https://github.com/user-attachments/assets/1bcfb1a5-979e-4aed-ae82-5d7668d03cf6
실습 -for 반복문으로 점멸 횟수와 주가 직접 제어-
코드 작성
from gpiozero import LED # gpiozero 라이브러리에서 LED 제어 클래스 불러오기
from time import sleep # time 모듈에서 시간 대기(sleep) 함수 불러오기
# BCM 번호 기준 GPIO 17번 핀에 연결된 LED 객체 생성
led = LED(17)
try:
# 5회 반복 실행 (count: 0부터 4까지)
for count in range(5):
led.on() # LED 켜기 (GPIO 17번 핀에 HIGH/1 신호 출력)
sleep(0.8) # 0.8초 동안 대기 (켜짐 유지)
led.off() # LED 끄기 (GPIO 17번 핀에 LOW/0 신호 출력)
sleep(0.2) # 0.2초 동안 대기 (꺼짐 유지)
print(count + 1) # 현재 깜빡인 횟수(1부터 5까지) 출력
finally:
# 예외 발생 여부와 상관없이 무조건 실행되어 안전한 종료 보장
led.close() # 사용이 끝난 GPIO 핀 자원 해제
코드 원리
- 먼저 LED에 불이 켜짐.
- 그리고 0.8초가 지날 때까지 켜진 상태로 유지.
- 0.8초가 지나면 LED의 불이 꺼지고, 다시 0.2초가 지날 때까지 꺼진 상태 유지.
- 0.2초가 지나면 터미널에 "
현재 깜빡인 횟수" 출력, 이를 5번 반복. - count가 5 이상이 되면
for반복문 종료.
결과
https://github.com/user-attachments/assets/ee80ae02-a5a5-4f51-aaad-5f3c99ce95af
간결화된 버전
from gpiozero import LED # gpiozero 라이브러리에서 LED 제어 클래스 불러오기
from signal import pause # signal 모듈에서 프로세스 대기(pause) 함수 불러오기
# BCM 번호 기준 GPIO 17번 핀에 연결된 LED 객체 생성
led = LED(17)
# 0.2초 동안 켜지고 0.8초 동안 꺼지는 패턴을 백그라운드(비동기)에서 무한 반복
led.blink(
on_time=0.2,
off_time=0.8
)
try:
print("LED 깜빡이는 중... (종료하려면 Ctrl+C를 누르세요)")
pause() # 프로세스가 종료되지 않도록 무한 대기 (백그라운드 깜빡임 유지)
finally:
# 키보드 인터럽트(Ctrl+C) 등 예외 발생 시 안전하게 실행
led.close() # 사용이 끝난 GPIO 핀 자원 해제
- 단, 해당 코드는
Ctrl + C를 누를 때까지 LED 등 점멸 무한 반복.
실습 -천천히 불이 점점 밝아지다가 곧 페이트 효과가 나타나게 설정-
코드 작성
from gpiozero import PWMLED # gpiozero 라이브러리에서 PWM(밝기 조절) LED 제어 클래스 불러오기
from time import sleep # time 모듈에서 시간 대기(sleep) 함수 불러오기
# BCM 번호 기준 GPIO 17번 핀에 연결된 PWM LED 객체 생성
led = PWMLED(17)
try:
# 0.0(0%)부터 1.0(100%)까지 밝기를 25%씩 단계별로 순회
for value in [0.0, 0.25, 0.5, 0.75, 1.0]:
led.value = value # LED 밝기 설정 (0.0: 완전 꺼짐 ~ 1.0: 최대 밝기)
print(f"duty={value:.2f}") # 현재 설정된 밝기(Duty Cycle) 값 출력
sleep(2) # 해당 밝기를 2초 동안 유지
# 1초 동안 밝아지고 1초 동안 어두워지는 페이드(pulse) 효과 실행
led.pulse(fade_in_time=1, fade_out_time=1)
sleep(6) # pulse 효과가 6초 동안 작동하도록 대기 (총 3회 반복)
finally:
# 예외 발생 여부와 상관없이 무조건 실행되어 안전한 종료 보장
led.close() # 사용이 끝난 GPIO 핀 자원 해제
코드 설명
- PWM LED 객체 생성 후,
for문을 통해 배열 안의 모든 값이 사용될 때까지 작동. for문이 작동될 때마다 LED의 밝기는 점점 밝아지며, 밝아진 후 터미널에 현재 밝기 출력하고 2초 동안 대기.for문을 벗어나면 1초 동안 밝아지고 1초 동안 어두워지는 페이트 효과 작동.- 해당 페이트 효과는 6초 동안 진행, 6초가 지나면 LED 등 꺼짐.
결과
https://github.com/user-attachments/assets/3bf4489b-c47b-49eb-8e7e-61b97bc32a77
실습 -상태 이름과 점멸 패턴을 함수로 분리-
코드 작성
from gpiozero import LED # gpiozero 라이브러리에서 LED 제어 클래스 불러오기
from time import sleep # time 모듈에서 시간 대기(sleep) 함수 불러오기
# BCM 번호 기준 GPIO 17번 핀에 연결된 LED 객체 생성
led = LED(17)
# 정상(OK) 상태 표시 함수: 1초 간격으로 천천히 점멸 (켜짐 1.0초, 꺼짐 1.0초)
def show_ok():
led.blink(1.0, 1.0)
# 경고(Warning) 상태 표시 함수: 0.2초 간격으로 빠르게 점멸 (켜짐 0.2초, 꺼짐 0.2초)
def show_warning():
led.blink(0.2, 0.2)
# 에러(Error) 상태 표시 함수: 짧게 3번 반짝인 후 휴식 패턴 실행
def show_error():
led.off() # LED 상태 초기화 (끄기)
for _ in range(3): # 3회 빠른 경고 점멸 반복
led.on(); sleep(0.1) # 0.1초 동안 켜기
led.off(); sleep(0.1) # 0.1초 동안 끄기
sleep(1.5) # 패턴 완료 후 1.5초 동안 대기
상태 이름과 점멸 패턴 분리 이유
- 재사용하기 쉽게 하기 위해서.