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

본문 바로가기

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

필기자
2025-04-15 14:14 1,300 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 | ((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전송과정
20250415172923_11119dc3dc970f88dfde85abf43e8231_qxih.png
  • 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(저항 감소) → 전압 감소
역형 (비례) 밝아지면 높아짐 회로 반대로 구성됨



20250415182210_11119dc3dc970f88dfde85abf43e8231_ycut.gif
 

댓글목록0

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