46 lines
2.0 KiB
Python
46 lines
2.0 KiB
Python
import smbus
|
|
import time
|
|
|
|
# PCF8591의 I2C 주소 (i2cdetect -y 1 명령으로 확인 가능)
|
|
# 대부분의 PCF8591 모듈은 0x48을 기본 주소로 사용합니다.
|
|
PCF8591_ADDRESS = 0x48
|
|
|
|
# I2C 버스 번호 (라즈베리 파이 2, 3, 4는 1, 초기 모델은 0일 수 있음)
|
|
I2C_BUS = 1
|
|
|
|
# smbus 객체 생성
|
|
bus = smbus.SMBus(I2C_BUS)
|
|
|
|
# PCF8591 제어 바이트 (CONTROLL_BYTE) 설정
|
|
# 비트 7: 1 (DAC 활성화 - 여기서는 사용 안 함)
|
|
# 비트 6: 0 (AIN 활성화 - 여기서는 사용 안 함)
|
|
# 비트 5: 0 (AIN0 활성화 - 여기서는 사용 안 함)
|
|
# 비트 4: 0 (AIN1 활성화 - 여기서는 사용 안 함)
|
|
# 비트 3-2: AIN 입력 모드 (00: 4단일 입력, 01: 차동 입력, 10: 2차동 입력)
|
|
# 여기서는 4개의 단일 입력 모드 (AIN0-AIN3)를 사용합니다.
|
|
# 비트 1-0: 사용할 아날로그 입력 채널 선택 (00: AIN0, 01: AIN1, 10: AIN2, 11: AIN3)
|
|
# 따라서 AIN0을 읽으려면 0x40 (1000000) 또는 0x00 (00000000)과 같이 설정할 수 있습니다.
|
|
# 일반적으로 0x40은 4채널 단일 입력 모드에서 AIN0을 나타냅니다.
|
|
# 하지만 라이브러리에서 채널 번호를 직접 지정하기 때문에 간단하게 0x40으로 설정합니다.
|
|
# 0x40 = 0100 0000b (단일 입력 모드 설정)
|
|
CONTROL_BYTE = 0x40
|
|
|
|
print(f"PCF8591 A/D 컨버터 테스트 시작 (주소: 0x{PCF8591_ADDRESS:X})")
|
|
print("로터리 엔코더를 돌려 값을 확인하세요. Ctrl+C로 종료.")
|
|
|
|
try:
|
|
while True:
|
|
# PCF8591에서 AIN0 채널의 값을 읽습니다.
|
|
# read_byte_data(주소, 제어_바이트 + 채널_번호)
|
|
# 제어 바이트에 채널 번호를 더하여 특정 채널을 선택합니다.
|
|
# 예를 들어 AIN0은 채널 0이므로 CONTROL_BYTE + 0 입니다.
|
|
analog_value = bus.read_byte_data(PCF8591_ADDRESS, CONTROL_BYTE + 0)
|
|
|
|
# 읽은 아날로그 값 (0-255) 출력
|
|
print(f"아날로그 값 (AIN0): {analog_value}")
|
|
|
|
time.sleep(0.1) # 0.1초마다 값 읽기
|
|
|
|
except KeyboardInterrupt:
|
|
print("\n프로그램 종료.")
|