콘텐츠로 이동

🔆 빛을 켜다 - LED 제어의 기초

"컴퓨터가 세상과 대화하는 첫 번째 방법: 불을 켜고 끄기"


🎯 이 장에서 배우는 것

  • 디지털 출력(HIGH/LOW)의 개념을 이해하고 LED를 켜고 끌 수 있다
  • time 모듈을 사용해 LED 깜빡임을 구현할 수 있다
  • 반복문(while)을 활용해 LED가 계속 깜빡이게 만들 수 있다
  • 다양한 깜빡임 패턴(SOS, 심장 박동 등)을 직접 설계할 수 있다

💡 왜 이걸 배우나요?

LED를 켜는 건 피지컬 컴퓨팅의 "Hello World"야.

프로그래밍을 처음 배울 때 화면에 "Hello World"를 출력하잖아? 피지컬 컴퓨팅에서는 LED를 켜는 것이 그 첫 번째 단계야. 왜냐하면:

┌─────────────────────────────────────────────────────────────┐
│                                                             │
│    코드 작성  →  Pico에 전송  →  LED가 켜짐!               │
│                                                             │
│    내가 쓴 코드가 "진짜 세상"에 영향을 미치는 순간 🎉      │
│                                                             │
└─────────────────────────────────────────────────────────────┘

생각해봐: - 🚦 신호등은 LED의 확장판이야 - 📱 스마트폰 알림 불빛도 LED - 🎄 크리스마스 트리 조명도 LED - 🚗 자동차 계기판 표시등도 LED

LED 하나를 제어할 수 있으면, 이 모든 것의 기본 원리를 이해한 거야!


📚 핵심 개념

개념 1: 디지털 출력 (Digital Output)

비유로 시작 🔦

디지털 출력은 마치 방의 전등 스위치와 같아.

    스위치 ON (올림)          스위치 OFF (내림)
    ┌───────────┐            ┌───────────┐
    │   💡 ON   │            │   💡 OFF  │
    │           │            │           │
    │  [===]    │            │    [===]  │
    │    ↑      │            │      ↓    │
    │   올림    │            │    내림   │
    └───────────┘            └───────────┘

스위치는 딱 두 가지 상태만 있어: 올림(ON) 또는 내림(OFF). 중간은 없어!

정확한 정의 📖

디지털 출력은 Pico가 핀을 통해 전기 신호를 내보내는 것이야: - HIGH (1): 3.3V 전압 출력 → LED 켜짐 - LOW (0): 0V 전압 출력 → LED 꺼짐

    Pico 핀 상태

    HIGH (1) ─────────────────── 3.3V  ═══ LED 켜짐 💡

    LOW  (0) ─────────────────── 0V   ═══ LED 꺼짐 ○

예시로 확인

led.value(1)   # HIGH → LED 켜짐
led.value(0)   # LOW  → LED 꺼짐

쉽게 말하면: LED에 전기를 보내면(HIGH) 켜지고, 안 보내면(LOW) 꺼져!


개념 2: GPIO 핀 (General Purpose Input/Output)

비유로 시작 🔌

GPIO 핀은 Pico의 손가락이야. 이 손가락들로 외부 세계와 소통하지.

    ┌──────────────────────────────────────┐
    │           Raspberry Pi Pico          │
    │  ┌──────────────────────────────┐   │
    │  │         [USB 포트]           │   │
    │  └──────────────────────────────┘   │
    │                                      │
    │  ●  ●  ●  ●  ●  ●  ●  ●  ●  ●  ●   │ ← GPIO 핀들
    │  0  1  2  3  4  5  6  7  8  9 10   │   (숫자 = 핀 번호)
    │                                      │
    │  ●  ●  ●  ●  ●  ●  ●  ●  ●  ●  ●   │
    │                 ...                  │
    └──────────────────────────────────────┘

정확한 정의 📖

GPIO(General Purpose Input/Output)는 "다목적 입출력"이라는 뜻이야: - 각 핀에는 번호가 있어 (GP0, GP1, GP2...) - 같은 핀을 출력(LED 제어)으로도, 입력(버튼 읽기)으로도 쓸 수 있어 - Grove Shield를 사용하면 더 쉽게 연결할 수 있어

예시로 확인

from machine import Pin

# GP16 핀을 출력 모드로 설정
led = Pin(16, Pin.OUT)

쉽게 말하면: GPIO 핀은 Pico가 바깥 세상과 전기 신호를 주고받는 통로야!


개념 3: time 모듈과 sleep()

비유로 시작

time.sleep()"잠깐 기다려!" 명령이야.

    LED 켜짐     1초 대기      LED 꺼짐     1초 대기
       💡    →   ⏳⏳⏳    →     ○     →   ⏳⏳⏳

    time.sleep(1) = 1초 동안 아무것도 안 하고 기다려!

정확한 정의 📖

import time          # time 모듈 불러오기

time.sleep(1)        # 1초 대기
time.sleep(0.5)      # 0.5초(500ms) 대기
time.sleep(0.1)      # 0.1초(100ms) 대기

예시로 확인

led.value(1)          # LED 켜기
time.sleep(1)         # 1초 기다리기
led.value(0)          # LED 끄기
time.sleep(1)         # 1초 기다리기

쉽게 말하면: sleep(초)는 프로그램을 그 시간만큼 멈추게 해!


🔨 따라하기

Step 1: LED 켜기 - 첫 번째 불빛

목표: LED를 켜서 내 코드가 실제로 작동하는 걸 확인하자!

하드웨어 연결:

┌──────────────────────────────────────────────────────────┐
│                    Grove Shield for Pico                  │
│                                                          │
│   ┌─────────┐                                            │
│   │  LED    │  ←── Grove 케이블 ──→  D16 포트           │
│   │ (빨강)  │                                            │
│   └─────────┘                                            │
│                                                          │
│   💡 Grove LED 모듈을 D16 포트에 연결해!                 │
│      (케이블 방향 맞추기 - 검정선이 GND 쪽)             │
│                                                          │
└──────────────────────────────────────────────────────────┘

코드:

# === WHAT: LED 켜기 - 피지컬 컴퓨팅의 Hello World ===
# 가장 기본적인 출력: LED를 켜는 코드

# --- WHY: 왜 이 코드들이 필요한지 ---
# machine 모듈: Pico의 하드웨어(핀)를 제어하기 위해
# Pin 클래스: GPIO 핀을 설정하고 제어하기 위해

# HOW: 한 줄씩 따라가보자

from machine import Pin    # machine 모듈에서 Pin 클래스 가져오기

# Pin(16, Pin.OUT) 의미:
# - 16: GPIO 16번 핀 사용 (Grove D16 포트)
# - Pin.OUT: 출력 모드로 설정 (전기를 내보냄)
led = Pin(16, Pin.OUT)

# LED 켜기
# value(1) = HIGH = 3.3V 전압 출력 = LED ON!
led.value(1)

print("LED가 켜졌어! 🔆")

실행 결과:

LED가 켜졌어! 🔆
그리고 LED가 실제로 켜진다! 💡


🤔 여기서 잠깐!

코드를 실행했는데 LED가 안 켜진다면? 1. Grove 케이블이 D16 포트에 꽂혀 있는지 확인 2. 케이블이 끝까지 들어갔는지 확인 3. LED 모듈의 전원 LED(작은 거)가 켜져 있는지 확인


Step 2: LED 끄기 - 불 끄기

목표: LED를 껐다가 다시 켜보자

코드:

# === WHAT: LED 껐다 켜기 ===
# value(0)으로 끄고, value(1)으로 켜기

from machine import Pin

led = Pin(16, Pin.OUT)

# LED 켜기
led.value(1)
print("LED 켜짐 💡")

# 잠깐 기다리기 (이게 없으면 너무 빨라서 변화를 못 봐!)
import time
time.sleep(2)  # 2초 대기

# LED 끄기
led.value(0)
print("LED 꺼짐 ○")

실행 결과:

LED 켜짐 💡
(2초 후)
LED 꺼짐 ○


💡 알아보기: value() vs on() / off()

LED를 제어하는 방법은 여러 가지가 있어:

# 방법 1: value() 사용
led.value(1)    # 켜기
led.value(0)    # 끄기

# 방법 2: on() / off() 사용 (더 직관적!)
led.on()        # 켜기
led.off()       # 끄기

# 방법 3: toggle() - 현재 상태 반전
led.toggle()    # 켜져있으면 끄고, 꺼져있으면 켜기

세 방법 모두 똑같이 작동해. 편한 거 써!


Step 3: LED 깜빡이기 - 반복의 마법

목표: LED가 계속 깜빡이게 만들자!

핵심 개념: while True (무한 반복)

┌─────────────────────────────────────────────────────────────┐
│                                                             │
│   while True:     ← "True인 동안 반복해" = 영원히 반복!    │
│       LED 켜기                                              │
│       1초 기다리기                                          │
│       LED 끄기          ↺ 끝나면 다시 처음으로            │
│       1초 기다리기                                          │
│                                                             │
└─────────────────────────────────────────────────────────────┘

코드:

# === WHAT: LED 깜빡이기 (Blink) ===
# 피지컬 컴퓨팅의 "Hello World" - 가장 기본적인 예제!

from machine import Pin
import time

# LED 설정
led = Pin(16, Pin.OUT)

print("LED 깜빡이기 시작! (멈추려면 Ctrl+C)")

# 무한 반복
while True:
    led.value(1)       # LED 켜기
    print("켜짐 💡")
    time.sleep(1)      # 1초 대기

    led.value(0)       # LED 끄기
    print("꺼짐 ○")
    time.sleep(1)      # 1초 대기

    # 여기까지 오면 다시 while True로 돌아감!

실행 결과:

LED 깜빡이기 시작! (멈추려면 Ctrl+C)
켜짐 💡
꺼짐 ○
켜짐 💡
꺼짐 ○
... (계속 반복)


🤔 여기서 잠깐!

프로그램 멈추는 방법: - Thonny에서 빨간 STOP 버튼 클릭 - 또는 키보드에서 Ctrl + C 누르기


Step 4: 깜빡임 속도 바꾸기

**목표