MCP3208 모듈을 이용한 아날로그 조도 센서 측정 > 스마트기기시스템

본문 바로가기

[실습] MCP3208 모듈을 이용한 아날로그 조도 센서 측정

필기자
2025-04-15 14:14 262 0

본문

MCP3208 모듈을 이용한 아날로그 조도 센서 측정

목 적
  • 라즈베리파이에서 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 연결
20250415142622_11119dc3dc970f88dfde85abf43e8231_dd36.png
 
  • SPI 기능 활성화

pi@pi20221234:~ $ sudo raspi-config

20250415161107_11119dc3dc970f88dfde85abf43e8231_8fhb.png

20250415161136_11119dc3dc970f88dfde85abf43e8231_zxqy.png

20250415161202_11119dc3dc970f88dfde85abf43e8231_w4c0.png

20250415161256_11119dc3dc970f88dfde85abf43e8231_knic.png

20250415161327_11119dc3dc970f88dfde85abf43e8231_wyds.png


pi@pi20221234:~ $ sudo reboot


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

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전송과정
20250415172923_11119dc3dc970f88dfde85abf43e8231_qxih.png
  • 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(저항 감소) → 전압 감소
역형 (비례) 밝아지면 높아짐 회로 반대로 구성됨



20250415182210_11119dc3dc970f88dfde85abf43e8231_ycut.gif
 

댓글목록0

등록된 댓글이 없습니다.
게시판 전체검색