[실습] MCP3208 모듈을 이용한 아날로그 조도 센서 측정
필기자
2025-04-15 14:14
1,300
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 | ((channel & 0x04) >> 2) # 시작 비트(1) + 단일 엔드 모드(1) + 채널 비트 D2 #단일 입력으로 CH0 채널 읽겠다는 명령
cmd2 = (channel & 0x03) << 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]
'''
adc1 & 0x0F
→ 0b10101100 & 0b00001111 = 0b00001100 = 12 (10진수)
0b00001100 << 8
→ 0b00001100_00000000 = 3072 (10진수)
result = 3072 | 240
→ 0b00001100_11110000 = 3312
'''
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전송과정

- 1st : Master -> MCP3208
- 0b00000110 = 00000(Dummy), 1(Start bit), 1(SGL), 0(D2)
비트 위치 | 7 | 6 | 5 | 4 | 3 | 2 (S) | 1 (SGL/DIFF) | 0 (D2) |
---|---|---|---|---|---|---|---|---|
의미 | x | x | x | x | x | Start | 단일/차동 | 채널 상위비트 |
값 | 0 | 0 | 0 | 0 | 0 | 1 | 1 | 0 |
- 2nd : Master -> MCP3208
- 예: CH0 → D1=0, D0=0 → 0b00000000 (0x00)
- 예: CH7 → D1=1, D0=1 → 0b11000000 (0xC0), 1st의 D2 1로 세팅
비트 위치 | 7 (D1) | 6 (D0) | 5 | 4 | 3 | 2 | 1 | 0 |
---|---|---|---|---|---|---|---|---|
의미 | 채널 중간비트 | 채널 하위비트 | 무시 | 무시 | 무시 | 무시 | 무시 | 무시 |
값 (CH0) | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
값 (CH7) | 1 | 1 | 0 | 0 | 0 | 0 | 0 | 0 |
- 3rd : Master -> MCP3208
비트 위치 | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
---|---|---|---|---|---|---|---|---|
의미 | 더미 | 더미 | 더미 | 더미 | 더미 | 더미 | 더미 | 더미 |
값 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
바이트 | 비트 번호 | 필드 이름 | 설명 |
---|---|---|---|
1st (8bit) | 7 ~ 3 | Dummy | 항상 0, 의미 없음 |
2 | Start bit | 항상 1 (전송 시작 신호) | |
1 | SGL/DIFF | 1 = 단일 입력, 0 = 차동 입력 | |
0 | D2 | 채널 선택 상위 비트 (채널 번호의 3비트 중 상위) | |
2nd (8bit) | 7 | D1 | 채널 선택 하위 비트 |
6 | D0 | 채널 선택 최하위 비트 | |
5 ~ 0 | Don't care | 아무 값이나 무관 (무시됨) | |
3rd (8bit) | 7 ~ 0 | Dummy Read | 클럭 유지를 위한 더미 비트 (응답 데이터 읽기 목적) |
- MCP3208 -> Master
비트 순서 | 의미 | 설명 |
---|---|---|
0~3 | Null / Don't care | 무시됨, 값 없음 (대기 상태) |
4~15 | B11 ~ B0 (12bit) | 변환된 디지털 값 (MSB부터 전송) |
이후 | 무의미 또는 HI-Z 상태 | 통신 종료 |
- 비트 순서에 대한 비교
- MSB(Most Significant Bit : 최상위비트)
- LSB(Least Significant Bit : 최하위비트)
구분 | 기준 | 표기 방식 | 설명 |
---|---|---|---|
Master → MCP3208 | 바이트 | MSB(7) → LSB(0) | 명령을 어떻게 구성하는지 설명 |
MCP3208 → Master | 시간 | Bit 0 → Bit 15 | 데이터가 어떻게 순서대로 들어오는지 |
- 센서 SSBH-011의 AO 출력 특성
- 밝아지면 LDR 저항이 감소되면서 LDR 쪽으로 흐르는 전류가 많아짐
- AO 측정되는 전압이 감소됨
방식 | 조도 증가 시 | AO 전압 변화 | 설명 |
---|---|---|---|
일반형 (반비례) | 밝아지면 | 낮아짐 | LDR(저항 감소) → 전압 감소 |
역형 (비례) | 밝아지면 | 높아짐 | 회로 반대로 구성됨 |

댓글목록0