MCP3008 ADC로 라즈베리 파이에서 아날로그 센서 읽기
라즈베리 파이에 아날로그 센서를 연결하는 건 GPIO 핀이 디지털만 지원하기 때문에 까다로울 수 있습니다. 저렴한 해결책은 MCP3008로, 8채널 10비트 아날로그-디지털 변환기로 파이 SPI 버스에 직결되며 추가 부품이 필요 없습니다.
이 가이드에서는 MCP3008을 라즈베리 파이에 배선하고, 조도 의존 저항(LDR)과 TMP36 온도 센서를 연결한 뒤, 간단한 파이썬 스크립트로 데이터를 읽는 과정을 안내합니다.
필요한 것
- 라즈베리 파이(GPIO 헤더 있는 모든 모델)
- MCP3008 8채널 ADC
- 조도 의존 저항(LDR) – 예: NORPS-12
- TMP36 온도 센서
- 10kΩ 저항(LDR 회로용)
파이에서 SPI 활성화
SPI 인터페이스는 기본 비활성화돼 있습니다. 라즈베리 파이에서 SPI 인터페이스 활성화하기 단계를 따라 SPI를 활성화하고 spidev 파이썬 라이브러리를 설치하세요.
회로 연결
MCP3008은 파이 40핀 헤더의 GPIO 핀 4개가 필요합니다. 다음 핀 연결(핀 번호는 헤더 P1 번호 기준):
VDD 3.3V
VREF 3.3V
AGND GROUND
CLK GPIO11 (P1-23)
DOUT GPIO9 (P1-21)
DIN GPIO10 (P1-19)
CS GPIO8 (P1-24)
DGND GROUND
MCP3008의 CH0~CH7 핀 각각이 아날로그 입력이 됩니다. 아래 예제에서는 CH0를 LDR, CH1을 TMP36에 사용하며 나머지 6채널은 향후 센서용으로 비워둡니다.
조도 의존 저항 (LDR)
LDR 저항은 밝은 빛에서 약 10kΩ, 어둠에서 수 메가옴으로 올라갑니다. 10kΩ 저항과 전압 분배기를 구성하면 MCP3008은 조명 시 0V 근처, 어두울 때 3.3V 근처 전압을 읽습니다.
TMP36 온도 센서
TMP36은 3핀 아날로그 온도 센서입니다. 3.3V로 전원 공급하고 VOUT 핀을 읽습니다. 25°C에서 0.750V 출력, 선형 기울기 10mV/°C. 따라서 0°C는 0.500V, 100°C는 1.500V입니다.
파이썬으로 데이터 읽기
MCP3008은 0~1023 범위의 10비트 값을 출력하며 0V~3.3V에 선형 매핑됩니다. TMP36의 경우 약 -50°C~+280°C 온도 범위에 해당합니다.
아래는 spidev 라이브러리로 채널 0과 1을 읽는 최소 예제:
import spidev
import time
spi = spidev.SpiDev()
spi.open(0, 0) # 버스 0, 디바이스 0
spi.max_speed_hz = 1350000
def read_channel(channel):
# MCP3008 프로토콜: 시작 비트, 싱글/디프, 채널(3비트), 5더미 비트
adc = spi.xfer2([1, (8 + channel) & 0x0F << 4, 0])
data = ((adc[1] & 3) << 8) + adc[2]
return data
while True:
ldr_val = read_channel(0)
temp_val = read_channel(1)
temp_c = (temp_val * 3.3 / 1023) * 100 - 50 # °C 변환
print(f'LDR: {ldr_val}, Temp: {temp_c:.2f}°C')
time.sleep(1)
센서 레이아웃에 맞춰 채널 번호를 변경하세요. 스크립트는 LDR 원시 ADC 값과 계산된 섭씨 온도를 지속 출력합니다.
이 설정으로 포토다이오드, 압력 트랜스듀서, 습도 프로브 같은 추가 아날로그 센서를 CH2~CH7에 배선하고 파이썬 코드를 확장해 활용할 수 있습니다.
해피 해킹!