Chapter 3. 기초 코딩: 단계별로 내장 LED 제어하기
하드웨어 개발의 "Hello World"는 LED를 깜빡이는 것입니다. RP2350 기반의 Pico 2 보드를 제어하는 기초 문법을 3가지 단계로 차근차근 알아봅시다.
3.1 "LED" 핀의 비밀
구형 Pico는 내장 LED를 제어할 때 25번 핀을 지정해야 했지만, 새롭게 업그레이드된 Pico 2(RP2350)는 펌웨어에서 예약한 "LED"라는 문자열 키워드를 사용하여 직관적으로 제어합니다.
하드웨어 프로그래밍의 첫걸음, LED 제어하기
Blink 코드의 작동 논리: 켜기 → 기다리기 → 끄기 → 기다리기의 무한 반복
3.2 단계별 소스 코드 작성
Thonny 편집창에 아래의 코드들을 차례대로 입력하고 실행하며 원리를 이해해 보세요.
[1단계] LED 직접 켜고 끄기 (기초 익히기)
on()과 off() 메서드를 사용해 직접 LED의 전원을 통제하는 가장 직관적인 방법입니다.
from machine import Pin
import time
# 내장 LED를 출력(OUT) 모드로 설정
led = Pin("LED", Pin.OUT)
print("1단계: LED 제어 테스트를 시작합니다.")
# 1. LED 켜기
led.on()
print("LED 켜짐")
time.sleep(1.5) # 1.5초 동안 유지
# 2. LED 끄기
led.off()
print("LED 꺼짐")
[2단계] 토글(Toggle) 기능으로 스마트하게 바꾸기
toggle() 메서드는 "현재 상태가 켜져 있으면 끄고, 꺼져 있으면 켜는" 반전 기능입니다. 코드가 훨씬 간결해집니다.
from machine import Pin
import time
led = Pin("LED", Pin.OUT)
print("2단계: 토글 기능 테스트를 시작합니다.")
led.toggle()
print("LED 상태 반전 (켜짐)")
time.sleep(1.0)
led.toggle()
print("LED 상태 반전 (꺼짐)")
[3단계] 무한 루프와 결합하여 자동으로 깜빡이기 (Blink 완성형)
2단계에서 배운 토글 기능에 while True: 무한 반복문을 결합하면, 보드가 스스로 0.5초마다 깜빡이는 자동 블링크 코드가 완성됩니다.
from machine import Pin
import time
# Pico 2용 내장 LED 설정
led = Pin("LED", Pin.OUT)
print("3단계: 최종 보드 테스트(Blink)를 시작합니다!")
# 아래의 코드를 무한히 반복합니다.
while True:
led.toggle() # LED 상태 반전 (켜져있으면 끄고, 꺼져있으면 켬)
print("LED 상태 변경")
time.sleep(0.5) # 0.5초 대기 (이 값을 줄이면 더 빨리 깜빡입니다)
3.3 실행 및 저장
▶️ 코드 실행 및 결과 확인 방법
- 작성한 코드를 Thonny 코드 입력 창에 붙여넣습니다.
- 좌측 상단의 ▶️ (실행) 버튼을 클릭하면 코드가 실행됩니다.
- 하단 [쉘] 창에서
LED 켜짐,LED 꺼짐등 출력 메시지를 확인합니다. - Pico 보드 위의 내장 LED가 실제로 동작하면 성공!
💡 Tip: [보기] 탭 → [쉘]을 클릭하면 실행 결과 창을, [보기] 탭 → [파일]을 클릭하면 Pico에 저장된 파일 목록을 확인할 수 있습니다.
💾 Pico 내부에 파일 저장하기
- 코드 작성 후 좌측 상단의 💾 (저장) 버튼을 클릭합니다.
- 저장 위치 선택 창이 나타나면 [Raspberry Pi Pico]를 선택합니다.
- 파일명을 입력합니다. 반드시 확장자를
.py로 지정해야 합니다.
예)test.py,blink.py - 최종 완성 코드는 파일명을
main.py로 저장합니다.
💡 핵심 Tip: 파일명을 main.py로 저장하면, Pico에 외부 전원(배터리 등)이 공급되는 순간 해당 코드가 자동으로 실행됩니다! 독립형 IoT 기기를 만들 때 필수 개념입니다.
💡 왜 main.py인가요?
Pico 보드에 전원(USB 또는 배터리)이 연결되자마자 컴퓨터 도움 없이 자동으로 실행되는 파일명이 바로 main.py입니다. 나중에 작품을 독립적으로 구동시키기 위한 필수 단계입니다.
3.4 외부 LED 제어하기 (GPIO 10번 핀)
내장 LED에 이어, 이번에는 브레드보드에 LED를 직접 꽂고 GPIO 핀으로 제어해 봅시다. 외부 전자부품을 다루는 첫 번째 실습입니다.
① LED란 무엇일까?
LED(Light Emitting Diode)는 발광 다이오드라고도 하며, 전류를 흘려주면 빛을 내는 작은 전자 부품입니다. 에너지 효율이 좋고 빛의 색상·밝기 제어가 용이해 조명·신호등·디스플레이 등 일상생활 곳곳에서 사용됩니다.
LED 외형 — 반구형 몸체와 길이가 다른 2개의 다리
② LED의 극성
LED는 2개의 핀(다리)을 가지며, 핀마다 + / - 극성이 있기 때문에 반드시 방향을 구분하여 회로에 연결해야 합니다.
| 다리 구분 | 극성 | 연결 방향 |
|---|---|---|
| 긴 다리 (Anode) | + 극 (VCC) | GPIO 핀 (전류 공급) 방향으로 연결 |
| 짧은 다리 (Cathode) | - 극 (GND) | GND 핀 (접지) 방향으로 연결 |
극성 연결 주의!
핀 방향을 고려하지 않고 잘못 연결하면, 코드가 올바르게 작성되어도 전류가 흐르지 못해 LED가 켜지지 않습니다. 항상 긴 다리(+) → GPIO, 짧은 다리(-) → GND 방향을 확인하세요!
③ LED 회로도 구성
GPIO 10번 핀과 GND 핀 사이에 330Ω 저항과 LED를 직렬로 연결합니다. 저항은 과전류로부터 LED를 보호하기 위해 반드시 필요합니다.
GPIO 10 → 330Ω 저항 → LED (+) → LED (-) → GND 회로도
④ 코드 작성하기 ①
아래 코드를 실행하면 GPIO 10번에 연결된 LED가 켜집니다.
from machine import Pin
# GPIO 10번 핀을 출력(OUT) 모드로 설정하여 LED 객체 생성
led10 = Pin(10, Pin.OUT)
led10.on() # LED 켜기
💬 생각해보기
위 코드를 성공적으로 실행시키면 LED가 계속해서 켜진 상태를 유지합니다.
그렇다면, LED를 끄기 위해선 어떻게 하면 될까요?
⑤ 코드 작성하기 ②
이번에는 time.sleep()을 활용하여 LED를 3초 켰다가 끄는 코드를 작성해 봅시다.
from machine import Pin
import time
led10 = Pin(10, Pin.OUT)
led10.on() # LED 켜기
time.sleep(3) # 3초 대기
led10.off() # LED 끄기
time.sleep(3) # 3초 대기
🏆 과제 해결해보기!
과제 1. LED 3개 동시에 제어하기
GPIO 10번, 11번, 12번 핀에 LED를 각각 연결했을 때, LED 3개를 모두 켜려면 어떻게 해야 할까요?
과제 2. 신호등 알고리즘 구현해보기!
GPIO 10(빨간 LED), GPIO 11(노란 LED), GPIO 12(초록 LED)를 이용하여 신호등처럼 순서대로 켜지고 꺼지는 코드를 작성해 보세요.
- 🔴 빨간 LED가 3초 동안 켜졌다가 꺼진다.
- 🟡 노란 LED가 1초 동안 켜졌다가 꺼진다.
- 🟢 초록 LED가 3초 동안 켜졌다가 꺼진다.
- 이 과정을 무한히 반복한다.
3.5 Wokwi 시뮬레이션으로 실습하기
1.8절에서 소개한 Wokwi를 이용하면 실제 Pico 2 보드나 LED, 저항이 없어도 이번 챕터의 두 회로(내장 LED, 외부 LED)를 브라우저에서 바로 실습해 볼 수 있습니다.
① 내장 LED Blink 회로 (3.1 ~ 3.3절)
내장 LED만 사용하므로 별도의 부품 연결 없이 Pico 2 보드 하나만 배치하면 됩니다.
{
"version": 1,
"author": "Pico 2 IoT Guide",
"editor": "code",
"parts": [
{ "type": "wokwi-pi-pico", "id": "pico", "top": 0, "left": 0, "attrs": {} }
],
"connections": [],
"dependencies": {}
}
위 diagram.json을 Wokwi 프로젝트에 붙여넣고, 코드 편집기에는 [3단계] Blink 완성형 코드(led = Pin("LED", Pin.OUT) ...)를 그대로 붙여넣은 뒤 초록색 ▶ 실행 버튼을 누르면 시뮬레이터 화면 속 보드의 LED가 실제로 깜빡이는 것을 확인할 수 있습니다.
② 외부 LED + 330Ω 저항 회로 (3.4절)
GPIO 10번 핀 → 330Ω 저항 → LED(+) → LED(-) → GND 순서로 연결된 회로를 그대로 재현합니다.
{
"version": 1,
"author": "Pico 2 IoT Guide",
"editor": "code",
"parts": [
{ "type": "wokwi-pi-pico", "id": "pico", "top": 0, "left": 0, "attrs": {} },
{ "type": "wokwi-resistor", "id": "r1", "top": 40, "left": 150, "attrs": { "value": "330" } },
{ "type": "wokwi-led", "id": "led1", "top": 40, "left": 220, "attrs": { "color": "red" } }
],
"connections": [
[ "pico:GP10", "r1:1", "orange", [] ],
[ "r1:2", "led1:A", "orange", [] ],
[ "led1:C", "pico:GND", "black", [] ]
],
"dependencies": {}
}
회로를 구성한 뒤 3.4절 ④, ⑤의 코드를 코드 편집기에 붙여넣고 실행하면, 실제 하드웨어 없이도 LED가 켜지고 꺼지는 동작을 미리 검증할 수 있습니다.
💡 참고
Wokwi의 부품 이름이나 속성은 버전 업데이트에 따라 조금씩 달라질 수 있습니다. 부품 이름을 입력했는데 오류가 발생한다면, Wokwi 편집기 좌측의 부품 라이브러리(Parts) 검색창에서 비슷한 이름을 검색해 정확한 명칭을 확인하세요.