04. 라즈베리 파이4로 LED 전등 작동 - EnglishNo/EmbeddedSystem GitHub Wiki

실습 전 알아야 할 정보

갈림길에서 전류가 사라지지 않는 절대 원리

옴의 법칙의 한계

  • 옴의 법칙 : V = I × R
    • V : 전압
    • I : 전류
    • R : 저항
  • 한계)
    • 복잡한 회로에서 전류가 여러 갈래로 나뉘는 경우, 옴의 법칙만으로는 각 가지에 흐르는 전류를 결정하기 어려움.
    • 따라서 키르히호프의 법칙 등을 함께 사용하여 회로 분석.

키르히호프의 전류 법칙 (KCL)

  • 전하량 보존)
    • 전하는 갑자기 생성되거나 사라지지 않음.
    • 노드에 들어온 전류는 나가는 전류와 같음.
  • KCL 정의)
    • 하나의 노드에 들어오는 전류의 합은 나가는 전류의 합과 같음.
    • 부호를 정하여 표현하면 하나의 노드에서 모든 전류의 합은 0 (ΣI = 0).
  • 적용)
    • 여러 갈래로 나뉘는 복잡한 전기회로에서 각 가지에 흐르는 전류를 분석하는 데 사용.

LED를 5V에 바로 꽂으면 일어나는 일

LED를 5V에 바로 꽂아버린다면?

  • 결과 : LED에 과도한 전류가 흘러 LED가 손상될 수 있음.
  • 원인 : LED의 허용 전류보다 큰 전류가 흐르기 때문.
    • 전압은 전류를 흐르게 하는 원인이며, 과도한 전류가 흐르면 부품이 과열되어 손상될 수 있음.
    • 따라서 부품이 견딜 수 있는 전류보다 큰 전류가 흐르지 않도록 전류를 제한해야 함.
  • 해결책 : 전류를 알맞게 제한하기 위해 저항 사용.

옴의 법칙

  • 설명 : 전압과 전류를 이용하여 필요한 저항값을 계산하는 공식.
  • 예 : 5V에서 2V로 켜지는 20mA LED)
    • 전원 5V 중 LED에 2V가 걸리므로 나머지 3V는 저항에 걸림.
    • 20mA = 0.02A
    • R = V / I
    • 3V / 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 전등을 작동시키자-

회로 모습

회로도

회로 구성 방법

  1. 라즈베리 파이의 GPIO17(11번째 핀)하고 연결된 케이블을 브레드 보드 +극 선로에 끼운다.
  2. 저항으로 다른 선하고 연결한 다음, LED 다리 긴 쪽(+극)와 연결시킨다.
  3. LED 다리 짧은 쪽(-극)하고 브레드 보드 -극 선로을 연결한 다음, 라즈베리 파이 Ground하고 연결시키면 끝.

코드 작성


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 핀 자원 해제

코드 원리

  1. 먼저 LED에 불이 켜짐.
  2. 그리고 0.8초가 지날 때까지 켜진 상태로 유지.
  3. 0.8초가 지나면 LED의 불이 꺼지고, 다시 0.2초가 지날 때까지 꺼진 상태 유지.
  4. 0.2초가 지나면 터미널에 "현재 깜빡인 횟수" 출력, 이를 5번 반복.
  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 핀 자원 해제

코드 설명

  1. PWM LED 객체 생성 후, for문을 통해 배열 안의 모든 값이 사용될 때까지 작동.
  2. for문이 작동될 때마다 LED의 밝기는 점점 밝아지며, 밝아진 후 터미널에 현재 밝기 출력하고 2초 동안 대기.
  3. for문을 벗어나면 1초 동안 밝아지고 1초 동안 어두워지는 페이트 효과 작동.
  4. 해당 페이트 효과는 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초 동안 대기

상태 이름과 점멸 패턴 분리 이유

  • 재사용하기 쉽게 하기 위해서.