챕터 8: 빛을 숫자로 - 조도센서 기초¶
🎯 이 장에서 배우는 것¶
- 아날로그와 디지털의 차이를 설명할 수 있다
- ADC(아날로그-디지털 변환)의 개념을 이해할 수 있다
- 조도센서를 Pico에 연결하고 빛의 밝기를 숫자로 읽을 수 있다
- 조도 값의 의미를 해석하고 다양한 환경에서 테스트할 수 있다
- 조도센서를 활용한 프로젝트 아이디어를 구상할 수 있다
💡 왜 이걸 배우나요?¶
지금까지 버튼은 "눌림/안눌림" 두 가지뿐이었어. 세상을 0과 1로만 보는 거지.
하지만 진짜 세상은 어때?
밝기는 "밝다/어둡다" 두 가지가 아니라 무한히 많은 단계가 있어. 이걸 어떻게 컴퓨터에게 전달할 수 있을까?
바로 아날로그 센서와 ADC의 마법이야!
실생활에서 조도센서는 어디에?¶
┌─────────────────────────────────────────────────────────────┐
│ 📱 스마트폰 화면 → 어두우면 자동으로 화면 밝기 낮춤 │
│ 🚗 자동차 헤드라이트 → 터널 들어가면 자동으로 켜짐 │
│ 💡 가로등 → 해 지면 자동으로 켜짐 │
│ 🌱 스마트 화분 → 빛 부족하면 LED 성장등 켜짐 │
└─────────────────────────────────────────────────────────────┘
이번 챕터에서 배우면, 너도 이런 것들을 직접 만들 수 있어!
📚 핵심 개념¶
개념 1: 디지털 vs 아날로그¶
비유로 시작: 디지털은 계단, 아날로그는 경사로야.
디지털 (계단) 아날로그 (경사로)
┌───┐ ╱
│ │ ╱
┌───┘ └───┐ ╱
│ │ ╱
┘ └─── ╱
딱딱 끊어지는 값 부드럽게 연속되는 값
0 또는 1만 가능 무한히 많은 값 가능
정확히 말하면: - 디지털(Digital): 정해진 값만 가질 수 있어. 버튼은 0(안눌림) 또는 1(눌림) 딱 두 개. - 아날로그(Analog): 연속적인 값을 가질 수 있어. 밝기, 온도, 소리 크기 등 자연의 모든 것.
예시로 확인: | 구분 | 디지털 예시 | 아날로그 예시 | |------|------------|--------------| | 스위치 | ON/OFF | - | | 조명 | - | 밝기 0%~100% | | 시계 | 디지털 숫자 시계 | 아날로그 바늘 시계 | | 온도 | - | 실제 기온 (23.7°C) |
쉽게 말하면: 버튼처럼 딱딱 끊어지면 디지털, 볼륨 다이얼처럼 부드럽게 변하면 아날로그야.
개념 2: ADC (아날로그-디지털 변환)¶
비유로 시작: ADC는 "아날로그 통역사"야.
┌─────────────────────────────────────────────────────────────┐
│ │
│ 🌞 빛 (아날로그) │
│ │ │
│ ▼ │
│ ┌─────────┐ │
│ │ 조도 │ "지금 밝기가 이 정도야" │
│ │ 센서 │ (전압으로 표현) │
│ └────┬────┘ │
│ │ 전압 (0V ~ 3.3V) ← 아날로그 신호 │
│ ▼ │
│ ┌─────────┐ │
│ │ ADC │ "0V~3.3V를 0~65535 숫자로 바꿔줄게!" │
│ │ (변환기)│ │
│ └────┬────┘ │
│ │ 숫자 (0 ~ 65535) ← 디지털 값 │
│ ▼ │
│ ┌─────────┐ │
│ │ Pico │ "오! 지금 32000이네. 중간 밝기구나!" │
│ │ 코드 │ │
│ └─────────┘ │
│ │
└─────────────────────────────────────────────────────────────┘
정확히 말하면: - ADC (Analog-to-Digital Converter): 아날로그 신호(전압)를 디지털 숫자로 변환하는 장치 - Pico의 ADC는 16비트 → 0부터 65535까지 (2^16 = 65,536가지) 표현 가능
왜 65535일까?
16비트 = 16자리 이진수
가장 큰 값 = 1111111111111111 (2진수)
= 65535 (10진수)
0V → 0
3.3V → 65535
1.65V → 약 32768 (중간)
쉽게 말하면: ADC는 "이 정도 밝기면 숫자로 32000쯤 되겠다"라고 번역해주는 통역사야.
개념 3: 조도센서의 원리¶
비유로 시작: 조도센서는 "빛을 먹고 전기를 내뿜는 작은 태양광 패널" 같아.
┌─────────────────────────────────────────────────────────────┐
│ │
│ 빛이 강할 때 (밝음) 빛이 약할 때 (어두움) │
│ │
│ ☀️☀️☀️ 🌙 │
│ │││ │ │
│ ▼▼▼ ▼ │
│ ┌─────────┐ ┌─────────┐ │
│ │ 조도 │ │ 조도 │ │
│ │ 센서 │ │ 센서 │ │
│ └────┬────┘ └────┬────┘ │
│ │ │ │
│ 높은 전압 출력 낮은 전압 출력 │
│ (3.0V 근처) (0.5V 근처) │
│ │ │ │
│ ▼ ▼ │
│ ADC → 큰 숫자 ADC → 작은 숫자 │
│ (50000~65535) (0~10000) │
│ │
└─────────────────────────────────────────────────────────────┘
정확히 말하면: - 조도센서 안에는 포토레지스터 또는 포토다이오드가 있어 - 빛을 받으면 전기적 특성이 변해서 전압이 달라짐 - 이 전압 변화를 ADC가 숫자로 변환
Grove 조도센서 특징: - 측정 범위: 0 ~ 1000 Lux (일반 실내 조명 충분히 측정) - 출력: 아날로그 전압 (0V ~ 3.3V) - 연결: Grove 케이블로 간단 연결
쉽게 말하면: 밝으면 큰 숫자, 어두우면 작은 숫자가 나와!
🤔 생각해보기¶
잠깐! 디지털은 0과 1뿐이라면서, 왜 0~65535까지 숫자가 나와?
좋은 질문이야! 65535도 결국 0과 1의 조합이야.
컴퓨터는 내부적으로 모든 걸 0과 1로 처리하지만, 우리에게는 편하게 10진수로 보여주는 거야!
🔨 따라하기¶
Step 1: 조도센서 연결하기¶
목표: Grove 조도센서를 Pico에 연결한다.
준비물: - Raspberry Pi Pico (또는 Pico W/Pico 2) - Grove Shield for Pico - Grove 조도센서 (Light Sensor v1.2) - Grove 케이블 1개
연결 방법:
┌─────────────────────────────────────────────────────────────┐
│ Grove Shield for Pico │
│ │
│ ┌─────────────────────────────────────┐ │
│ │ │ │
│ │ [A0] [A1] [A2] ← 아날로그 포트 │ │
│ │ ↑ │ │
│ │ │ │ │
│ │ 조도센서 │ │
│ │ 연결 │ │
│ │ │ │
│ │ [D16] [D18] [D20] ← 디지털 포트 │ │
│ │ │ │
│ └─────────────────────────────────────┘ │
│ │
│ ⚠️ 조도센서는 반드시 A0, A1, A2 중 하나에 연결! │
│ (디지털 포트에 연결하면 안 돼요) │
│ │
└─────────────────────────────────────────────────────────────┘
연결 순서: 1. Pico를 Grove Shield에 꽂는다 (USB 포트 방향 확인!) 2. Grove 케이블의 한쪽을 조도센서에 연결 3. 케이블의 다른 쪽을 Shield의 A0 포트에 연결 4. USB 케이블로 Pico를 컴퓨터에 연결
여기서 잠깐! 🤔
A0? 그게 뭐야?
A = Analog(아날로그)의 약자 0 = 첫 번째 포트
아날로그 센서(조도, 소리 크기 등)는 반드시 A0, A1, A2 포트에 연결해야 해! D16, D18 같은 디지털 포트에 연결하면 제대로 값을 읽을 수 없어.
Step 2: 첫 번째 코드 - 조도 값 읽기¶
목표: 조도센서의 값을 읽어서 화면에 출력한다.
코드:
# === WHAT: 조도센서 값 읽기 ===
# 조도센서로 현재 밝기를 측정해서 숫자로 출력하는 코드
# --- WHY: 필요한 이유 ---
# 빛의 밝기를 숫자로 알아야 "어두우면 불 켜기" 같은 자동화가 가능해
from machine import ADC, Pin # ADC: 아날로그 값을 읽는 기능
import time # time: 시간 관련 기능
# HOW: 조도센서 설정
# A0 포트는 GPIO 26번에 연결되어 있음
light_sensor = ADC(Pin(26)) # ADC 객체 생성, GPIO 26번 사용
# 무한 반복하며 값 읽기
while True:
# 조도센서 값 읽기 (0 ~ 65535)
light_value = light_sensor.read_u16() # u16 = unsigned 16-bit (0~65535)
# 화면에 출력
print("밝기:", light_value)
# 0.5초 대기 (너무 빠르면 읽기 힘들어)
time.sleep(0.5)
실행 결과 (환경에 따라 다름): ``` 밝기: 45231