[실습] MCP3208 모듈을 이용한 아날로그 조도 센서 측정
필기자
2025-04-15 14:14
268
0
본문
MCP3208 모듈을 이용한 아날로그 조도 센서 측정
목 적
1. MCP3208 기반 조도 센서 회로 구성
2. 아날로그 조도 센서 값 측정 프로그램
1. MCP3208 기반 조도 센서 회로 구성





2. 아날로그 조도 센서 값 측정 프로그램

목 적
- 라즈베리파이에서 MCP3208 ADC 모듈을 통해 조도 센서(SSBH-011)의 아날로그 값을 측정하는 방법 이해한다.
1. MCP3208 기반 조도 센서 회로 구성
2. 아날로그 조도 센서 값 측정 프로그램
1. MCP3208 기반 조도 센서 회로 구성
- MCP3208
- 12비트 해상도의 8채널 아날로그-디지털 변환기(ADC)
- SPI 인터페이스로 라즈베리파이와 통신
- 라즈베리파이는 아날로그 입력 기능이 없어 외부 ADC 필요
- 기본 사양
- 입력 채널: CH0 ~ CH7
- 해상도: 12비트 (0~4095)
- 인터페이스: SPI
- 동작 전압: 2.7V ~ 5.5V
- 변환 속도: 최대 100ksps
- 조도 센서 회로 구성
- SSBH-011 조도 센서, MCP3208, GPIO 연결

- SPI 기능 활성화
pi@pi20221234:~ $ sudo raspi-config





pi@pi20221234:~ $ sudo reboot
2. 아날로그 조도 센서 값 측정 프로그램
- 기본 구동 프로그램 : 라즈베리파이 가상환경에서 파이썬 코딩
- 라즈베리파이에서 SPI 설정
- VSCode에서 light_sensor_analog.py 파일 생성
- SPI 통신을 통해 조도 센서 아날로그 값을 디지털로 변환 후 측정하는 코드 실습

pi@pi20221234:~ $ sudo apt update
pi@pi20221234:~ $ sudo apt install python3-spidev
pi@pi20221234:~ $ iot_
(iot) pi@pi20221234:~/iot $ pip install git+https://github.com/doceme/py-spidev
import spidev
import time
# SPI 초기화
spi = spidev.SpiDev()
spi.open(0, 0) # bus=0, CE0
spi.max_speed_hz = 1000000 # 1MHz
spi.mode = 0 # 모드 0 설정
# MCP3208 아날로그 데이터 읽기 함수 (0~7 채널)
def read_adc(channel):
if not 0 <= channel <= 7:
return -1
# MCP3208용 명령
cmd1 = 0b00000110 # 시작 비트(1) + 단일 엔드 모드(1) + 채널 비트 D2 #단일 입력으로 CH0 채널 읽겠다는 명령
cmd2 = (channel & 0x07) << 6 # 나머지 채널 비트 D1, D0 (<< 6 상위 6비트로 이동) #CH0 이면 0b00000000
adc = spi.xfer2([cmd1, cmd2, 0]) # 3byte로 나눠서 보냄 #CH0이면 0b00000110 0b00000000 0b00000000
print(f"Raw SPI response: {adc}")
data = ((adc[1] & 0x0F) << 8) | adc[2]
'''
adc[1] & 0x0F
adc[1]의 **하위 4비트(B11~B8)**만 추출
예: adc[1] = 0b10101100이면 → 0b00001100만 남김
<< 8
추출된 상위 4비트를 왼쪽으로 8비트 이동 → 12비트의 상위 위치(B11~B8)에 배치
| adc[2]
adc[2]는 **하위 8비트(B7~B0)**이므로
최종적으로 B11~B0이 모두 합쳐짐
'''
return data
try:
print("조도센서 값 읽기 시작...")
print("Ctrl+C로 종료")
while True:
value = read_adc(0) # 첫 번째 방법
voltage = value * 5.0 / 4095 # VREF = 5V 기준
print(f"방법 - 조도 값: {value}, 전압: {voltage:.2f}V")
print("-" * 50)
time.sleep(1)
except KeyboardInterrupt:
print("\n프로그램 종료")
finally:
spi.close()
print("SPI 연결 종료")
- 아날로그 조도 센서 데이터 SPI전송과정

- Master -> MCP3208
- 0b00000110 = 0(Start), 1(Start bit), 1(SGL), 0(D2), 0000
바이트 | 비트 번호 | 의미 | 설명 |
---|---|---|---|
1st(8bit) | 7 | Dummy (무시) | 항상 0 |
6 | Start bit | 항상 1 | |
5 | SGL/DIFF | 단일=1 / 차동=0 | |
4 | D2 | 채널 선택 상위 비트 | |
3~0 | Don't care | 무시됨 | |
2nd(8bit) | 7 | D1 | 채널 하위 비트 |
6 | D0 | 채널 하위 비트 | |
5~0 | Don't care | 무시됨 | |
3rd(8bit) | 7~0 | 클럭 유지용 | 데이터 응답 읽기 위해 필요 |
- MCP3208 -> Master
비트 순서 | 의미 | 설명 |
---|---|---|
1~2 | Null / Don't care | 무시됨, 값 없음 (대기 상태) |
3~14 | B11 ~ B0 (12bit) | 변환된 디지털 값 (MSB부터 전송) |
이후 | 무의미 또는 HI-Z 상태 | 통신 종료 |
- 센서 SSBH-011의 AO 출력 특성
- 밝아지면 LDR 저항이 감소되면서 LDR 쪽으로 흐르는 전류가 많아짐
- AO 측정되는 전압이 감소됨
방식 | 조도 증가 시 | AO 전압 변화 | 설명 |
---|---|---|---|
일반형 (반비례) | 밝아지면 | 낮아짐 | LDR(저항 감소) → 전압 감소 |
역형 (비례) | 밝아지면 | 높아짐 | 회로 반대로 구성됨 |

댓글목록0