빛·소리·불꽃 · 난이도 쉬움
KY-018 조도 센서의 전압으로 LDR 저항을 계산하고 로그 눈금으로 밝기 비교하기
KY-018은 빛이 셀수록 저항이 줄어드는 LDR과 10kΩ 고정 저항으로 만든 분압 모듈이에요. 3.3V 배선, 읽은 전압에서 LDR 저항을 계산하는 식, lux 대신 상대 밝기와 로그 그래프로 읽는 이유, 거리·색 필터·두 점 보정을 재는 탐구를 정리했어요.
이 센서로 무엇을 잴 수 있나
KY-018은 빛을 받으면 저항이 줄어드는 광저항(LDR) 하나와 고정 저항을 작은 기판에 얹은 모듈이에요. Joy-IT 자료에는 동작 전압 3.3~5V, 고정 저항 10kΩ, 크기 21×15×6mm가 적혀 있어요. 핀은 신호(S), 가운데 +, 그리고 −(GND) 세 개예요.
이 센서로 잴 수 있는 것은 "같은 센서로 본 상대 밝기"예요. 스탠드에서 멀어질 때 밝기가 줄어드는 정도, 색 셀로판이 빛을 얼마나 가리는지, 창가와 교실 안쪽의 차이처럼 비교하는 탐구에 잘 맞아요. 조도의 단위인 lux를 바로 알려 주지는 않아요. lux가 필요하면 조도계나 BH1750 같은 lux 센서로 보정해요.
원리
모듈 안에서 고정 저항과 LDR이 3.3V와 GND 사이에 직렬로 이어지고, 그 사이 점이 S 핀이에요. Joy-IT 예제의 계산식으로 보면 10kΩ이 + 쪽, LDR이 GND 쪽에 있어요. S 전압은 3.3V × R_LDR ÷ (10kΩ + R_LDR)이라서, 밝아져 LDR 저항이 줄면 S 전압도 내려가요. 시나브로 PICO의 센서 예제가 값이 작을수록 "밝음"으로 판단하는 이유예요. 제품에 따라 두 부품의 자리가 바뀐 것도 있을 수 있으니, 처음에 손으로 가려 값의 방향을 확인해요.
S 전압 V를 알면 LDR 저항을 거꾸로 구할 수 있어요.
R_LDR = 10000 × V ÷ (3.3 − V)
LDR의 저항은 밝기에 반비례하는 직선으로 변하지 않아요. 예를 들어 흔한 GL5528 소자의 데이터시트는 10lux에서 10~20kΩ, 어둠 속에서 1MΩ이고, 10lux와 100lux의 저항 비율을 로그로 나타낸 γ값을 0.6으로 적어요. 밝기가 10배가 되면 저항은 10의 0.6제곱, 곧 약 4분의 1로 준다는 뜻이에요. 그래서 밝기와 저항을 둘 다 로그 눈금으로 그리면 직선에 가까워져요. KY-018에 어떤 LDR이 들었는지는 제품마다 다르니 이 숫자를 그대로 쓰지는 않고, 관계의 모양만 참고해요.
분압 회로에는 성질이 하나 더 있어요. LDR 저항이 고정 저항(10kΩ)과 비슷할 때, 곧 S 전압이 1.65V 근처일 때 같은 밝기 변화에 전압이 가장 크게 움직여요. 아주 밝거나 아주 어두우면 전압이 0V나 3.3V 끝에 몰려 작은 차이를 구별하기 어려워요.
준비물
- 라즈베리파이 피코와 USB 케이블
- KY-018 모듈, 암-수 점퍼선 3개
- LED 스탠드, 줄자, 빛을 가릴 검은 종이나 상자
- 탐구용: 빨강·초록·파랑 셀로판, 조도계나 BH1750 모듈(보정용)
배선
브레드보드 따라 꽂기 순서 (8단계)
- 피코를 브레드보드 가운데 홈에 걸쳐 꽂아요. USB 단자가 왼쪽을 보게 하고, 1번 핀이 f2, 40번 핀이 e2에 들어가요. 다리가 홈 양쪽에 모두 들어갔는지 옆에서 봐요.
- 주황 선: 피코 36번 핀(3V3(OUT)) 옆 칸 a6 → 위쪽 + 줄(3.3V). 이제 이 줄 전체가 3.3V예요.
- 검은 선: 피코 38번 핀(GND) 옆 칸 a4 → 위쪽 − 줄(GND). 이제 이 줄 전체가 GND예요.
- 조도 센서 LDR 꽂기: 다리 VCC · GND · AO (S)를 위쪽 a24 · a25 · a26에 차례로 꽂아요. 다리가 브레드보드에 바로 안 들어가면 암-수 점퍼선으로 같은 칸에 이어요.
- 주황 선(3.3V 전원): 조도 센서 VCC 줄 b24 → 위쪽 + 줄(3.3V)
- 검은 선(GND): 조도 센서 GND 줄 b25 → 위쪽 − 줄(GND)
- 초록 선(신호): 조도 센서 AO (S) 줄 b26 → 피코 32번 핀(GP27) 옆 칸 a10
- 마지막 확인: ① 위쪽 + 줄(3.3V)과 아래쪽 + 줄(5V)이 서로 이어지지 않았나요? ② 모든 부품의 GND가 − 줄에 이어졌나요? ③ 5V 신호 다리는 저항을 거쳐 피코에 이어졌나요? ④ 긴 브레드보드는 + − 줄이 가운데에서 끊긴 것도 있어요(빨간·파란 선이 끊겨 있으면 짧은 선으로 이어요). ⑤ 그림과 한 칸씩 비교한 뒤 USB를 꽂아요.
| 모듈 핀 | 피코 핀 | 비고 |
|---|---|---|
| S | GP27 (32번) | 아날로그 출력 |
| 가운데(+) | 3V3 (36번) | 3.3~5V 가운데 3.3V |
| − | GND (38번) | 피코와 접지를 함께 써요 |
고정 저항이 기판에 이미 있어서 저항을 따로 달지 않아요. 전원은 반드시 3V3에 이어요. VBUS(5V)에 이으면 어두울 때 S 전압이 3.3V를 넘어 ADC 핀에 무리가 가요.
모듈이 아닌 LDR 단품을 쓴다면 사이트 안내처럼 3V3 ─ LDR ─ GP27 ─ 10kΩ ─ GND로 직접 꾸며요. 이렇게 하면 LDR이 + 쪽에 있어 밝을수록 값이 커져요. KY-018과 방향이 반대이니, 두 회로의 결과를 섞어 비교하지 않아요.
코드
from machine import ADC, Pin
import math
import time
ldr = ADC(Pin(27)) # S → GP27, 가운데 핀은 3V3
R_FIX = 10000 # 모듈 안의 고정 저항(Ω)
VCC = 3.3
def read_v(n=16):
s = 0
for i in range(n):
s += ldr.read_u16()
return s / n * VCC / 65535
while True:
v = read_v()
if 0.01 < v < VCC - 0.01:
r = R_FIX * v / (VCC - v) # LDR이 S와 GND 사이에 있을 때
print(f"DATA: volt={v:.3f}, r_ohm={r:.0f}, log_r={math.log(r) / math.log(10):.3f}")
else:
print(f"DATA: volt={v:.3f}, r_ohm=-1, log_r=-1") # 범위 끝: 너무 밝거나 어두움
time.sleep(0.5)
read_v()는 16번 읽어 평균을 내요. LED 조명은 눈에 보이지 않게 깜빡이는 경우가 있어서, 한 번만 읽은 값보다 평균이 안정적이에요.- 전압으로 LDR 저항
r_ohm을 계산하고, 로그 그래프용으로 상용로그 값log_r도 함께 내보내요. - 전압이 0V나 3.3V에 거의 붙으면 저항을 계산하지 않고 −1을 내보내요. 그 줄은 측정 범위 밖으로 봐요.
값 해석과 보정
r_ohm은 밝기의 상대값이에요. 같은 모듈, 같은 방향, 같은 높이에서 잰 값끼리만 비교해요. 사람이 센서 옆에 서면 그림자가 생기니, 잴 때는 모두 한 걸음 물러서요.
lux로 바꾸고 싶다면 로그 눈금에서 두 점 보정을 해요. 조도계로 밝기를 아는 두 곳(예를 들어 어두운 곳과 밝은 곳)에서 log_r을 재고, log(lux) = a × log_r + b의 a와 b를 구해요. 그다음 다른 밝기 세 곳에서 계산한 lux와 조도계 값을 비교하면 보정이 얼마나 맞는지 알 수 있어요(탐구 3). 두 점 사이를 벗어난 밝기에서는 오차가 커질 수 있어요(센서 값의 신뢰도).
LDR은 직전에 받은 빛에 따라 값이 달라질 수 있어요. GL5528 데이터시트가 저항을 재기 전에 400~600lux의 빛을 두 시간 쬐어 두는 조건을 적어 둔 것도 그런 이유로 읽을 수 있어요. 어두운 상자에서 꺼낸 직후보다 1분쯤 같은 빛에 둔 뒤에 기록해요. 피코 ADC의 유효 비트는 RP2350 데이터시트 기준 약 9.5비트라, 전압이 끝에 몰린 구간의 작은 차이는 믿지 않아요.
자주 하는 실수
- 가운데 핀과 − 핀을 바꿔 꽂기. 전원이 거꾸로 걸려 값의 방향이 뒤집혀요. 기판의 − 표시를 확인해요.
- VBUS(5V)에 잇기. S 전압이 3.3V를 넘을 수 있어요. 3V3에 이어요.
- 값을 lux라고 부르기. 보정하지 않은 값은 lux가 아니에요. 표와 그래프에 "ADC 값" 또는 "LDR 저항(Ω)"이라고 적어요.
- 센서 위로 몸을 숙여 읽기. 내 그림자가 결과에 들어가요.
- 단품 LDR 회로의 결과와 섞기. 방향이 반대라 같은 밝기에서 정반대 경향이 나와요.
이 센서로 잴 수 있는 탐구
1. 스탠드에서 멀어지면 저항은 어떻게 커질까
- 질문: 스탠드와 센서 사이 거리를 두 배로 늘릴 때 LDR 저항은 몇 배가 될까?
- 바꾸는 것: 거리 10cm, 20cm, 40cm, 80cm(어두운 방에서 스탠드 정면)
- 재는 것: 10줄 평균 r_ohm(Ω)과 log_r
- 방법: 커튼을 치고 다른 조명을 끈 뒤 스탠드만 켜요. 거리마다 3번 재고, log(거리)와 log_r의 그래프가 직선에 가까운지, 기울기가 얼마인지 구해요.
2. 색 셀로판은 빛을 얼마나 가릴까
- 질문: 같은 스탠드 빛을 빨강, 초록, 파랑 셀로판으로 가리면 저항이 얼마나 달라질까?
- 바꾸는 것: 센서 위에 덮는 셀로판 색(없음, 빨강, 초록, 파랑, 각 한 겹)
- 재는 것: r_ohm(Ω), 셀로판이 없을 때에 대한 비율
- 방법: 거리 30cm에서 셀로판만 바꿔 덮어요. 색마다 3번 재고, 결과를 셀로판의 색과 LDR이 어떤 색에 민감한지와 연결해 해석해요.
3. 두 점 보정으로 lux를 얼마나 맞힐까 - 질문: 두 밝기로 보정한 식은 다른 밝기에서 조도계와 몇 % 차이가 날까? - 바꾸는 것: 확인용 밝기 세 곳(교실 안쪽, 창가, 스탠드 아래) - 재는 것: 보정식으로 구한 lux와 조도계(또는 BH1750) 값의 차이(%) - 방법: 보정용 두 점과 확인용 세 점 모두 센서와 조도계를 나란히 붙여 같은 방향으로 재요. 곳마다 3번 기록해 평균 차이를 구해요.
안전
- 스탠드는 LED 제품을 쓰고, 오래 켠 전구나 할로겐등은 뜨거우니 만지지 않아요.
- 밝은 조명을 눈으로 직접 들여다보지 않아요.
- 배선은 USB를 뽑은 채로 바꾸고, 모듈 전원은 3V3에만 이어요.
더 알아보기
- 모듈 자료: Joy-IT "KY-018 Photoresistor"(3.3~5V, 고정 저항 10kΩ, 핀 배치, 전압으로 저항을 구하는 피코 예제)
- 참고 소자: GL5528 광저항 데이터시트(10lux 저항, 암저항, γ값, 반응 시간, 최대 감도 파장). KY-018에 이 소자가 들었다는 뜻은 아니에요
- 공식 자료: Raspberry Pi "RP2350 datasheet"(ADC 유효 비트)
- 기초 글: 분압 회로, 센서 값의 신뢰도, 잴 수 있는 탐구 주제 만들기, 피코 핀 지도