Chapter 8: 미니 프로젝트 - 설계와 시작¶
🎯 이 장에서 배우는 것¶
- [ ] 프로젝트 주제를 선정하고 기획서를 작성할 수 있다
- [ ] 필요한 부품과 회로를 설계할 수 있다
- [ ] 핵심 기능의 프로토타입을 구현할 수 있다
- [ ] 기획과 실제 구현 사이의 간극을 이해할 수 있다
💡 왜 이걸 배우나요?¶
여태까지 배운 건 뭐였지? LED 켜고, 버튼 누르고, 센서 읽고, 부저 울리고... 전부 따로따로였어. 마치 레고 블록을 하나씩 만져본 것처럼.
이제 진짜 작품을 만들 시간이야! 🎨
실제 메이커들은 어떻게 일할까? 1. 아이디어를 떠올리고 2. 기획서로 정리하고 3. 프로토타입을 빠르게 만들어 테스트하고 4. 문제를 발견하면 수정하고 5. 완성까지 반복해
이번 장에서는 1~3단계를 경험해볼 거야. 너의 첫 "진짜 작품"이 탄생하는 순간이지!
"아이디어는 누구나 있지만, 실행하는 사람이 메이커다" 🔧
📚 핵심 개념¶
개념 1: 프로젝트 기획서¶
-
비유로 시작: 프로젝트 기획서는 마치 여행 계획표와 같아요. 어디 가는지, 뭘 가져가는지, 어떤 순서로 다니는지 미리 정해두면 여행이 훨씬 수월하잖아?
-
정확한 정의: 프로젝트 기획서는 무엇을 만들지, 왜 만드는지, 어떻게 만들지를 문서화한 것이에요. 개발 과정의 나침반 역할을 해요.
-
예시로 확인: 예를 들어, "스마트 무드등" 기획서에는 "조도 센서로 어두워지면 자동으로 켜지고, 버튼으로 색상을 바꿀 수 있다"처럼 구체적으로 적어요.
쉽게 말하면: 만들기 전에 "뭘 만들 건지" 정리한 종이야!
개념 2: 프로토타입 (Prototype)¶
-
비유로 시작: 프로토타입은 마치 레고 시제품과 같아요. 진짜 건물 짓기 전에 레고로 먼저 만들어보는 거지.
-
정확한 정의: 프로토타입은 핵심 기능만 빠르게 구현한 초기 버전이에요. 완벽할 필요 없고, "이게 되네!"를 확인하는 게 목표야.
-
예시로 확인: 예를 들어, 스마트 무드등 프로토타입은 "조도 센서 값 읽기 + LED 켜기"만 되면 성공! 색상 변경, 저장 기능 같은 건 나중에 추가해.
쉽게 말하면: "일단 핵심부터 돌아가게 만들자!"
개념 3: 시스템 분해 (Decomposition)¶
-
비유로 시작: 시스템 분해는 마치 요리 레시피를 단계로 나누는 것과 같아요. "비빔밥 만들기"를 한꺼번에 하려면 막막하지만, "밥 짓기 → 나물 볶기 → 계란 프라이 → 비비기"로 나누면 할 수 있잖아?
-
정확한 정의: 시스템 분해는 복잡한 문제를 작고 관리 가능한 조각으로 나누는 방법이에요. 컴퓨터 과학에서 핵심적인 문제 해결 전략이지.
-
예시로 확인:
스마트 무드등 ├── 입력 파트 │ ├── 조도 센서로 밝기 읽기 │ └── 버튼으로 모드 선택 ├── 처리 파트 │ └── 밝기에 따라 LED 색상 결정 └── 출력 파트 └── RGB LED로 색상 표현
쉽게 말하면: 큰 걸 작은 조각으로 쪼개면 만들 수 있어!
🎨 프로젝트 옵션 소개¶
세 가지 프로젝트 중 하나를 골라봐! (또는 자유 주제도 OK 👍)
옵션 A: 스마트 무드등 💡¶
컨셉: 주변 밝기에 따라 자동으로 켜지고, 버튼으로 색상 모드를 바꾸는 조명
| 항목 | 내용 |
|---|---|
| 난이도 | ⭐⭐ (보통) |
| 필요 부품 | 조도 센서, RGB LED, 버튼 |
| 핵심 기능 | 자동 점등, 색상 변경 |
| 확장 가능 | 밝기 조절, 타이머, 패턴 |
옵션 B: 반응형 알람 ⏰¶
컨셉: 온도가 특정 값을 넘으면 경고음과 LED로 알려주는 시스템
| 항목 | 내용 |
|---|---|
| 난이도 | ⭐⭐ (보통) |
| 필요 부품 | 온습도 센서(DHT11), 부저, LED |
| 핵심 기능 | 온도 감지, 경고 출력 |
| 확장 가능 | 습도 알림, 다단계 경고, OLED 표시 |
옵션 C: 자유 주제 🚀¶
컨셉: 네가 직접 상상하는 작품!
| 항목 | 내용 |
|---|---|
| 난이도 | ⭐⭐⭐ (도전) |
| 필요 부품 | 키트 내 자유 조합 |
| 핵심 기능 | 네가 정해! |
| 조건 | 입력 1개 + 출력 1개 이상 필수 |
자유 주제 아이디어 예시: - 🎮 반응 속도 테스트 게임 (LED 켜지면 버튼 누르기) - 🚗 거리 경보 시스템 (초음파 센서 + 부저) - 🎵 터치 피아노 (버튼 여러 개 + 부저) - 🌡️ 환경 모니터링 (온습도 + 조도 + LED 표시)
🔨 따라하기¶
Step 1: 주제 선정하기¶
목표: 만들고 싶은 프로젝트 하나를 확실히 정하기
질문에 답해봐: 1. 세 옵션 중 뭐가 제일 끌려? 2. 왜 그 프로젝트가 재밌을 것 같아? 3. 이 프로젝트가 완성되면 누가 쓸 수 있을까?
여기서 잠깐! 🤔
프로젝트 선택 팁: - "쉬운 것"보다 "하고 싶은 것"을 골라 - 어려워도 흥미 있으면 끝까지 해 - 모르겠으면 스마트 무드등을 추천해! (가장 시각적으로 만족감 높음)
Step 2: 기획서 작성하기¶
목표: 기획서 템플릿을 채워서 내 프로젝트 정리하기
아래 템플릿을 복사해서 너만의 기획서를 작성해봐!
# 🎯 프로젝트 기획서
## 1. 기본 정보
- **프로젝트 이름**:
- **만드는 사람**:
- **선택 옵션**: A / B / C (자유)
## 2. 프로젝트 설명
### 한 줄 소개
(예: "어두워지면 자동으로 켜지는 무드등")
### 만드는 이유
(왜 이걸 만들고 싶은지 솔직하게!)
### 누가 사용하나요?
(예: 나, 동생, 부모님, 친구...)
## 3. 기능 목록
### 핵심 기능 (반드시 구현)
- [ ] 기능 1:
- [ ] 기능 2:
### 추가 기능 (시간되면)
- [ ] 기능 3:
- [ ] 기능 4:
## 4. 필요한 부품
| 부품 | 용도 | 연결 포트 |
|------|------|----------|
| | | |
| | | |
| | | |
## 5. 회로 연결도
(어떤 부품이 어디에 연결되는지 그림이나 설명)
## 6. 프로토타입 목표
오늘 수업 끝날 때까지:
- [ ]
Step 3: 부품과 회로 설계하기¶
목표: 필요한 부품을 정리하고 연결 방법 파악하기
📦 부품 연결 참고표¶
| 부품 | 연결 포트 | 라이브러리/코드 |
|---|---|---|
| 조도 센서 | A0 | ADC(26) |
| DHT11 | D16 | dht.DHT11(Pin(16)) |
| 버튼 | D20 | Pin(20, Pin.IN, Pin.PULL_DOWN) |
| LED (단색) | D18 | Pin(18, Pin.OUT) |
| RGB LED | D18 | Pin(18, Pin.OUT) + PWM |
| 부저 | D20 | PWM(Pin(20)) |
| 서보모터 | D16 | PWM(Pin(16)) |
🔌 프로젝트별 회로 연결도¶
옵션 A: 스마트 무드등
┌─────────────────────────────────────────────┐
│ Pico 2W │
│ │
│ A0 ◄──── 조도 센서 (Grove 케이블) │
│ D18 ────► RGB LED (Grove 케이블) │
│ D20 ◄──── 버튼 (Grove 케이블) │
│ │
└─────────────────────────────────────────────┘
옵션 B: 반응형 알람
┌─────────────────────────────────────────────┐
│ Pico 2W │
│ │
│ D16 ◄──── DHT11 온습도 센서 │
│ D18 ────► LED (경고등) │
│ D20 ────► 부저 (경고음) │
│ │
└─────────────────────────────────────────────┘
여기서 잠깐! 🤔
연결할 때 주의점: - Grove 케이블 색깔 확인 (빨강=VCC, 검정=GND, 노랑=신호) - 포트 번호 잘 확인하기 (D16, D18, D20...) - 연결 후 흔들려서 빠지지 않게 잘 꽂기
Step 4: 프로토타입 개발하기¶
목표: 핵심 기능이 작동하는 최소한의 코드 만들기
이제 진짜 코딩 시간이야! 🎉
각 프로젝트별로 프로토타입 코드를 제공할게. 이걸 기반으로 시작해봐!
🔵 옵션 A: 스마트 무드등 프로토타입¶
코드:
# === WHAT: 스마트 무드등 프로토타입 ===
# 조도 센서로 밝기를 읽고, 어두우면 LED를 켜는 기본 동작
# --- WHY: 핵심 기능 확인 ---
# 일단 "어두우면 켜진다"가 되는지 확인하자!
# HOW: 어떻게 동작하는지
from machine import Pin, ADC # 핀, 아날로그 변환
import time
# === 부품 연결 설정 ===
light_sensor = ADC(26) # 조도 센서 (A0 = GP26)
led = Pin(18, Pin.OUT) # LED (D18)
button = Pin(20, Pin.IN, Pin.PULL_DOWN) # 버튼 (D20)
# === 설정값 ===
DARK_THRESHOLD = 20000 # 이 값보다 낮으면 "어둡다"고 판단
# (조도 센서 값은 0~65535, 어두울수록 낮음)
# === 메인 루프 ===
print("스마트 무드등 시작!")
print("조도 센서 값을 모니터링합니다...")
while True:
# 1. 조도 센서 값 읽기
brightness = light_sensor.read_u16()
# 2. 밝기 판단 & LED 제어
if brightness < DARK_THRESHOLD:
led.on()
status = "어두움 → LED 켜짐"
else:
led.off()
status = "밝음 → LED 꺼짐"
# 3. 현재 상태 출력
print(f"밝기: {brightness}, 상태: {status}")
# 4. 0.5초 대기
time.sleep(0.5)
실행 결과:
스마트 무드등 시작!
조도 센서 값을 모니터링합니다...
밝기: 45230, 상태: 밝음 → LED 꺼짐
밝기: 44980, 상태: 밝음 → LED 꺼짐
밝기: 12300, 상태: 어두움 → LED 켜짐
밝기: 11800, 상태: 어두움 → LED 켜짐
테스트 방법: 1. 코드 실행 2. 조도 센서를 손으로 가려봐 → LED가 켜져야 해! 3. 손을 떼면 → LED가 꺼져야 해!
🔴 옵션 B: 반응형 알람 프로토타입¶
코드:
# === WHAT: 반응형 알람 프로토타입 ===
# 온도가 설정값을 넘으면 LED와 부저로 경고
# --- WHY: 핵심 기능 확인 ---
# 일단 "온도 높으면 경고"가 되는지 확인하자!
# HOW: 어떻게 동작하는지
from machine import Pin, PWM
import dht
import time
# === 부품 연결 설정 ===
sensor = dht.DHT11(Pin(16)) # DHT11 온습도 센서 (D16)
led = Pin(18, Pin.OUT) # LED (D18)
buzzer = PWM(Pin(20)) # 부저 (D20)
# === 설정값 ===
TEMP_THRESHOLD = 30 # 이 온도 이상이면 경고 (테스트용으로 낮게 설정 가능)
# === 경고 함수 ===
def alarm_on():
"""경고 켜기"""
led.on()
buzzer.freq(1000) # 1000Hz 소리
buzzer.duty_u16(32768) # 50% 볼륨
def alarm_off():
"""경고 끄기"""
led.off()
buzzer.duty_u16(0) # 소리 끄기
# === 메인 루프 ===
print("반응형 알람 시작!")
print(f"경고 온도: {TEMP_THRESHOLD}도 이상")
while True:
try:
# 1. 온습도 측정
sensor.measure()
temp = sensor.temperature()
humidity = sensor.humidity()
# 2. 온도 판단 & 경고
if temp >= TEMP_THRESHOLD:
alarm_on()
status = "⚠️ 경고!"
else:
alarm_off()
status = "✅ 정상"
# 3. 현재 상태 출력
print(f"온도: {temp}°C, 습도: {humidity}%, 상태: {status}")
except Exception as e:
print(f"센서 읽기 오류: {e}")
# 4. 2초 대기 (DHT11은 2초 간격 필요)
time.sleep(2)
실행 결과:
반응형 알람 시작!
경고 온도: 30도 이상
온도: 25°C, 습도: 60%, 상태: ✅ 정상
온도: 26°C, 습도: 58%, 상태: ✅ 정상
온도: 31°C, 습도: 55%, 상태: ⚠️ 경고!
테스트 방법:
1. 코드 실행
2. 센서에 손을 대거나 입김을 불어봐 (온도 올리기)
3. 경고음과 LED가 켜지면 성공!
4. 테스트 쉽게 하려면 TEMP_THRESHOLD = 25로 낮춰봐
🟣 옵션 C: 자유 주제용 기본 템플릿¶
코드:
# === WHAT: 자유 프로젝트 템플릿 ===
# 입력 읽기 → 처리 → 출력의 기본 구조
# --- WHY: 모든 프로젝트의 기본 패턴 ---
# 이 구조를 수정해서 네 프로젝트를 만들어봐!
# HOW: 어떻게 동작하는지
from machine import Pin, ADC, PWM
import time
# === 부품 연결 설정 ===
# TODO: 네 프로젝트에 맞게 수정해!
# 입력 예시:
# button = Pin(20, Pin.IN, Pin.PULL_DOWN)
# sensor = ADC(26)
# 출력 예시:
# led = Pin(18, Pin.OUT)
# buzzer = PWM(Pin(20))
# === 설정값 ===
# TODO: 네 프로젝트에 필요한 설정값 추가
# === 함수 정의 ===
def read_input():
"""입력 읽기"""
# TODO: 센서/버튼 값 읽기
pass
def process_data(input_value):
"""데이터 처리"""
# TODO: 입력값을 바탕으로 판단
pass
def set_output(result):
"""출력 설정"""
# TODO: LED/부저/서보 제어
pass
# === 메인 루프 ===
print("프로젝트 시작!")
while True:
# 1. 입력 읽기
input_value = read_input()
# 2. 처리
result = process_data(input_value)
# 3. 출력
set_output(result)
# 4. 대기
time.sleep(0.5)
📝 전체 기획서 예시¶
실제로 작성하면 이런 느낌이야!
# 🎯 프로젝트 기획서
## 1. 기본 정보
- **프로젝트 이름**: 스마트 무드등 "밤친구"
- **만드는 사람**: 김피코
- **선택 옵션**: A (스마트 무드등)
## 2. 프로젝트 설명
### 한 줄 소개
어두워지면 자동으로 켜지고, 버튼으로 분위기에 맞는 색상을 선택할 수 있는 무드등
### 만드는 이유
밤에 책 읽을 때 너무 밝은 조명 말고
은은한 무드등이 있으면 좋겠다고 생각했어요.
또 기분에 따라 색깔을 바꿀 수 있으면 재밌을 것 같아요!
### 누가 사용하나요?
- 나 (밤에 책 읽을 때)
- 동생 (잘 때 무서워서 은은한 불빛 필요)
## 3. 기능 목록
### 핵심 기능 (반드시 구현)
- [x] 기능 1: 주변이 어두워지면 자동으로 LED 켜짐
- [ ] 기능 2: 버튼 누르면 색상 모드 변경 (빨강→초록→파랑→꺼짐)
### 추가 기능 (시간되면)
- [ ] 기능 3: RGB 색상 부드럽게 변하는 효과
- [ ] 기능 4: 밝기 조절 기능 (로터리 센서 추가)
## 4. 필요한 부품
| 부품 | 용도 | 연결 포트 |
|------|------|----------|
| 조도 센서 | 주변 밝기 측정 | A0 |
| RGB LED | 색상 출력 | D18 |
| 버튼 | 모드 선택 | D20 |
## 5. 회로 연결도
Grove Shield 사용
- A0 포트 ← 조도 센서
- D18 포트 → RGB LED
- D20 포트 ← 버튼
## 6. 프로토타입 목표
오늘 수업 끝날 때까지:
- [x] 조도 센서 값 읽어서 출력하기
- [x] 어두우면 LED 켜지는 것 확인
- [ ] 버튼 누르면 print 출력되는 것 확인
⚠️ 자주 하는 실수¶
실수 1: 너무 큰 목표 설정하기¶
증상: "AI 로봇 만들기", "스마트홈 전체 시스템" 같은 기획서
원인: 할 수 있는 시간과 부품을 고려하지 않음
해결:
# 잘못된 기획
목표: 음성인식 스마트홈 시스템
(→ 한 학기도 부족한 프로젝트!)
# 올바른 기획
목표: 조도 센서로 자동 켜지는 무드등
(→ 50분 안에 프로토타입 가능!)
💡 팁: "오늘 안에 핵심이 돌아가야 한다"고 생각하면 적절한 크기가 나와!
실수 2: 연결 포트 충돌¶
증상: "부저도 D20, 버튼도 D20인데 왜 안 돼요?"
원인: 같은 포트에 여러 부품 연결
해결:
# 잘못된 연결 - 포트 충돌!
button = Pin(20, Pin.IN, Pin.PULL_DOWN) # D20
buzzer = PWM(Pin(20)) # D20 또 사용!
# 올바른 연결 - 포트 분리
button = Pin(20, Pin.IN, Pin.PULL_DOWN) # D20
buzzer = PWM(Pin(18)) # D18 사용 (또는 다른 포트)
💡 팁: 기획서에 "연결 포트"를 미리 정리하면 충돌 방지!
실수 3: 센서 값 범위 모르고 코딩¶
증상: "왜 항상 '어둡다'고 나와요?"
원인: 조도 센서 값 범위(0~65535)를 모르고 임계값 설정
해결:
# 잘못된 코드 - 임계값을 막 정함
DARK_THRESHOLD = 100 # 거의 항상 어둡다고 판단됨
# 올바른 코드 - 먼저 값을 확인!
# Step 1: 먼저 실제 값 확인
brightness = light_sensor.read_u16()
print(f"현재 밝기: {brightness}") # 밝을 때/어두울 때 확인
# Step 2: 확인 후 적절한 임계값 설정
DARK_THRESHOLD = 20000 # 실제 측정값 기반으로 설정
💡 팁: 항상 먼저 값을 print로 확인하고 임계값을 정해!
실수 4: DHT11 너무 빠르게 읽기¶
증상: OSError 또는 이상한 값
원인: DHT11은 최소 2초 간격으로 읽어야 함
해결:
# 잘못된 코드
while True:
sensor.measure()
time.sleep(0.5) # 0.5초 → 너무 빠름!
# 올바른 코드
while True:
sensor.measure()
time.sleep(2) # 2초 이상 대기 필수!
✅ 스스로 점검하기¶
- 프로토타입의 목적은 무엇인가요?
- A) 완벽한 제품을 만드는 것
- B) 핵심 기능이 되는지 빠르게 확인하는 것
-
C) 예쁘게 꾸미는 것
-
스마트 무드등에서 조도 센서 값이 10,000일 때, DARK_THRESHOLD가 20,000이면 LED는?
- A) 켜진다
- B) 꺼진다
-
C) 깜빡인다
-
기획서에서 "핵심 기능"과 "추가 기능"을 나누는 이유는?
정답 확인
1. **B) 핵심 기능이 되는지 빠르게 확인하는 것** - 프로토타입은 "일단 되게" 만드는 게 목표야. 완벽함은 나중에! 2. **A) 켜진다** - 코드에서 `brightness < DARK_THRESHOLD` 조건 - 10,000 < 20,000 → True → LED 켜짐 - (값이 낮을수록 어두움!) 3. **시간이 부족할 때 우선순위를 정하기 위해서** - 핵심 기능 = 반드시 해야 하는 것 - 추가 기능 = 시간 되면 하는 것 - 이렇게 나눠야 "미완성"을 방지할 수 있어!🚀 더 해보기¶
도전 1: 프로토타입에 print 디버깅 추가하기¶
센서 값이 이상하면 원인을 찾기 어려워. print를 전략적으로 넣어봐!
# 디버그 모드 추가
DEBUG = True # 테스트 끝나면 False로
if DEBUG:
print(f"[DEBUG] 센서 원본값: {brightness}")
print(f"[DEBUG] 임계값: {DARK_THRESHOLD}")
print(f"[DEBUG] 비교 결과: {brightness < DARK_THRESHOLD}")
도전 2: 버튼으로 모드 변경 추가하기¶
스마트 무드등에 버튼 기능을 추가해봐!
# 힌트 코드
mode = 0 # 0: 꺼짐, 1: 빨강, 2: 초록, 3: 파랑
while True:
# 버튼 누르면 모드 변경
if button.value() == 1:
mode = (mode + 1) % 4 # 0→1→2→3→0 순환
print(f"모드 변경: {mode}")
time.sleep(0.3) # 디바운싱
# TODO: mode에 따라 LED 색상 변경
도전 3: 두 센서 조합하기 ⭐¶
조도 센서 + 온도 센서를 조합해서 "어둡고 더우면" 알림!
# 힌트: 두 조건을 AND로 연결
if brightness < DARK_THRESHOLD and temp > 28:
print("어둡고 덥네요! 환기 필요!")
📋 프로젝트 체크리스트¶
오늘 수업 끝나기 전에 확인해봐!
기획 단계¶
- [ ] 프로젝트 주제를 선택했다
- [ ] 기획서를 작성했다
- [ ] 핵심 기능과 추가 기능을 구분했다
설계 단계¶
- [ ] 필요한 부품을 정리했다
- [ ] 연결 포트를 확인했다 (충돌 없음)
- [ ] 회로 연결을 완료했다
개발 단계¶
- [ ] 프로토타입 코드를 작성했다
- [ ] 코드가 에러 없이 실행된다
- [ ] 핵심 기능이 작동한다 (적어도 1개)
남은 할 일 (다음 시간)¶
- [ ] 아직 안 된 기능: ____
- [ ] 개선하고 싶은 점: ____
🔗 다음 장으로¶
오늘은 프로젝트를 기획하고 프로토타입을 시작했어!
배운 것: - ✅ 기획서로 아이디어를 정리하는 법 - ✅ 복잡한 시스템을 작은 조각으로 나누는 법 - ✅ 핵심 기능만 빠르게 확인하는 프로토타입 개발
다음 장에서는: - 🎯 프로젝트를 완성하고 - 🎤 1분 발표를 하고 - 👏 친구들의 작품을 보고 피드백을 나눌 거야!
준비할 것: 오늘 못 끝낸 기능이 있다면, 다음 시간 시작 15분 안에 완성할 수 있도록 계획을 세워와!
수고했어, 메이커! 🔧✨