주요 내용

라즈베리 파이에는 본질적으로 아날로그 입력 기능이 없지만, 측정, 처리, 조절 등 다양한 목적으로 물리적 전압 신호를 디지털화된 데이터로 쉽게 변환할 수 있는 외부 아날로그-디지털 컨버터(ADC)를 통합하여 그 기능을 보완할 수 있습니다.

트레이더가 사용을 고려할 수 있는 인기 있는 ADC 대안으로는 속도와 정확도 사이의 균형을 제공하는 MCP3004/MCP3008과 16비트 분해능을 제공하지만 느린 샘플링 속도로 작동하는 ADS111x가 있습니다.

Adafruit를 통해 제공되는 ADS1115는 프로그래밍 가능 이득 증폭기(PGA)를 통합하여 미세한 전압 차이를 감지하는 동시에 프로그래밍 중에 이득을 동적으로 조정할 수 있는 복잡한 솔루션을 제공합니다. I2C 연결을 통한 라즈베리 파이와의 통합은 단순성이 특징입니다.

라즈베리 파이의 기본 구성에는 아두이노와 같은 마이크로컨트롤러 기반 플랫폼에서 흔히 볼 수 있는 기능인 아날로그 입력 기능이 포함되어 있지 않습니다.

초기에 어려움을 겪을 수 있지만, 여러 가지 실행 가능한 대안이 존재합니다. 외부 아날로그-디지털 컨버터(ADC)와 함께 라즈베리 파이를 사용하여 프로젝트를 시작하세요.

왜 입력을 추가해야 하나요?

본질적으로 우주는 전기적 전위의 활용을 통해 효과적으로 특성화할 수 있는 다양한 현상들을 제공합니다. 이러한 전위를 디지털로 변환하면 다양한 변수와 추가 장치의 기록, 조작 및 조절이 용이해집니다.

대지의 습도를 감독하거나 온실 내부의 열을 조절하거나 설치류의 무게를 측정할 수 있습니다. 또한 라즈베리 파이를 위한 볼륨 관리 시스템을 구축하거나, 전위차계 배열을 개발하거나, 조이스틱을 새로 제작할 수도 있습니다. 잠재적인 응용 분야는 방대하고 다양합니다.

ADC용 옵션

디지털 변환 분야를 처음 접하는 사람들에게 가장 적합한 아날로그-디지털 컨버터(ADC)는 무엇인가요?

가장 인기 있고 간단한 옵션 중에는 Microchip의 MCP3004 (및 MCP3008 ) 칩이 있습니다. 각각 10비트의 4개(또는 8개) 채널이 제공되며, 최대 200kSPS를 읽을 수 있습니다. 반면에 860 SPS에서 16비트를 읽을 수 있는 텍사스 인스트루먼트의 ADS111x 장치가 있습니다. 따라서 속도와 정밀도(그리고 당연히 가격) 사이에 트레이드 오프가 있습니다.

몇몇 마이크로컨트롤러는 통합 아날로그-디지털 컨버터(ADC)를 기능으로 통합하고 있습니다. 예를 들어, 대부분의 아두이노에서 널리 사용되는 ATMega 구성 요소는 다른 기능과는 별도로 여러 개의 10비트 ADC 채널을 제공합니다. 이 기능을 통해 아두이노 플랫폼은 라즈베리 파이의 한계를 뛰어넘는 아날로그 입력 기능을 제공할 수 있습니다. 따라서 시스템 구성 내에서 아두이노 장치에 액세스할 수 있고 정확한 판독을 위해 10비트 해상도만 필요한 경우 아두이노를 사용하는 것이 실제로 실용적인 선택이 될 것입니다.

실제로 이 데모에서는 단순화를 위해 Adafruit에서 제공하는 ADS1115를 활용합니다.

프로그래머블 이득 증폭기란 무엇인가요?

이 집적 회로는 원하는 값 범위를 몇 분의 1볼트까지 디지털로 설정할 수 있는 프로그래머블 이득 증폭기(PGA)와 같은 몇 가지 혁신적인 기능을 자랑합니다. 16비트 분해능을 활용하면 마이크로와트 단위의 미세한 차이도 감지할 수 있습니다.

이 글도 확인해 보세요:  JES에서 사운드를 임포트하고 재생하는 방법

이 특정 칩의 또 다른 장점은 작동 중에 게인을 조정할 수 있다는 것입니다. 이와 달리 MCP3004와 같은 다른 디바이스는 레퍼런스 전압을 인가하기 위한 추가 핀을 통합하여 다른 전략을 사용합니다.

멀티플렉싱은 어떻습니까?

“멀티플렉서”라는 용어는 단일 아날로그-디지털 컨버터(ADC)를 통해 수많은 입력 신호를 분배할 수 있는 장치를 의미합니다. ADC에 다수의 입력 단자가 있다는 것은 내부 아키텍처에 멀티플렉서 기능이 통합되어 있다는 것을 의미합니다. ADS1115의 경우 이 집적 회로는 최대 4개의 개별 채널을 지원하며, 이러한 입력 선택은 전용 레지스터 설정에 의해 제어됩니다.

레지스터 다루기

ADS1115는 구성 가능한 여러 설정 조작을 통해 쉽게 액세스할 수 있는 다양한 기능을 제공합니다. 여기에는 멀티플렉서 관리, 게인 미세 조정, 내장 비교 메커니즘 활성화, 샘플링 주파수 수정, 절전 절전 모드 구현 등이 포함되며, 모두 선택적 제어 요소의 간단한 토글을 통해 달성할 수 있습니다.

앞서 언급한 스위치의 위치는 패키지 내부에 숨겨져 있으며, 레지스터로 알려진 디지털 스토리지의 미세한 잔재로 나타납니다. 특정 기능을 구현하려면 해당 레지스터를 기본 상태인 이진수 0에서 이진수 1로 변경하기만 하면 됩니다.

ADS111x 데이터시트 을 보면 이 모델에는 디바이스의 동작을 제어하는 구성 레지스터를 포함하여 4개의 레지스터가 포함되어 있음을 알 수 있습니다.

비트 14~12는 멀티플렉서의 작동을 조절하여 8가지 가능한 설정 중에서 선택할 수 있습니다. 여기서는 입력 0과 접지 사이의 차동 신호에 관한 정보를 제공하는 비트 시퀀스 ‘100’을 선택해야 합니다. 반대로 비트 7~5는 샘플링 주파수를 결정하며, 이 비트를 ‘111’로 설정하면 초당 860개의 샘플 상한을 달성할 수 있습니다.

적절한 구성 설정을 결정하면 아날로그-디지털 컨버터로 2비트의 데이터를 전송할 수 있습니다. 이후 개별 비트를 수정하려면 비트별 연산자를 사용하여 각 비트를 개별적으로 처리할 수 있습니다.

상황의 복잡성으로 인해 당혹스러울 수 있습니다. 이진 표현은 숫자 값을 전달하는 것이 아니라 각 개별 스위치의 상태를 나타내는 것이기 때문입니다. 이러한 요소를 10진수 또는 16진수로 표현하는 단일 엔티티로 표현할 수도 있지만, 이진 형식을 고수하는 것이 이해하기 쉽기 때문에 더 유리할 수 있습니다.

배선하기

이 다용도 장치는 브레드보드에 직접 연결할 수 있습니다. 양극 전압 입력 범위는 2~5.5V로, 라즈베리 파이의 3.3V 전원 공급 장치와의 호환성을 보장합니다.

이 글도 확인해 보세요:  Rust의 제네릭 형식 알아보기

온도 센서의 SDA 및 SCL 핀을 라즈베리 파이의 GPIO 헤더에 있는 해당 포트에 연결합니다. 마찬가지로 접지 및 3.3V 핀을 각각의 접지 및 전원 공급 레일에 연결합니다. 그런 다음 전압 라인과 직렬로 전위차계를 삽입하여 입력 신호 범위를 조절합니다. 마지막으로 전위차계의 한쪽 끝을 접지 핀에 연결하고 다른 쪽 끝을 라즈베리파이의 아날로그-디지털 컨버터(ADC)의 첫 번째 입력에 연결합니다. 이렇게 연결이 완료되면 프로젝트를 구현할 준비가 된 것입니다.

I2C 다루기

다양한 아날로그-디지털 컨버터(ADC)는 작동을 위해 서로 다른 통신 프로토콜을 사용합니다. 예를 들어, ADS1115를 사용할 때는 I2C 인터페이스를 선호하는 통신 방법으로 활용합니다.

아날로그-디지털 컨버터(ADC)와의 인터페이스에 Python을 활용하려면 구현하기 전에 특정 설정 단계를 완료해야 합니다. 다행히도 최근 라즈베리 파이 운영 체제(OS)의 반복적인 개선으로 이 과정이 상당히 간소화되었습니다. 구성 절차를 시작하려면 ‘환경설정’으로 이동하여 ‘라즈베리 파이 구성’을 선택합니다.여기에서 ‘인터페이스’ 탭으로 이동하여 I2C 기능을 활성화하세요.

모든 구성 요소가 올바르게 작동하는지 확인하려면 터미널을 열어 명령줄 인터페이스를 시작하고 다음 명령을 실행하세요:

 sudo i2cdetect -y 1 

제공된 텍스트는 사용자가 주어진 구성을 성공적으로 구현했을 때 아날로그-디지털 컨버터(ADC)의 주소가 포함된 출력 그리드를 볼 수 있는 프로세스를 설명합니다. 이 주소는 16진수 값으로 표시되며, 코드 내에서 사용하기 전에 “0x”가 앞에 와야 한다는 점에 유의해야 합니다. 이 경우 값은 0x48에 해당합니다.

write\_word\_data() 및 read\_word\_data(). 이러한 메서드에는 쓰기 또는 읽어야 하는 특정 레지스터와 의도한 데이터 값 자체를 지정하는 장치 주소 형식의 입력이 필요합니다.

`read_word_data()` 함수는 장치 주소와 레지스터만 입력으로 받습니다. 이 함수는 아날로그-디지털 컨버터(ADC)가 전압 레벨을 지속적으로 측정하고 그 결과를 지정된 레지스터에 저장하도록 합니다. 이 기능을 사용하면 언제든지 해당 레지스터에 저장된 정보에 액세스할 수 있습니다.

루프의 시작 부분으로 진행하기 전에 짧은 일시 정지를 통합하면서 세련된 방식으로 출력을 장식하도록 선택할 수 있습니다. 이러한 조치는 과도한 정보로 넘쳐나지 않도록 보장합니다.

 from smbus import SMBus
import time
addr = 0x48
bus = SMBus(1)

# set the registers for reading
CONFIGREG = 1
CONVERSIONREG = 0

# set the address register to point to the config register
# write to the config registers
bus.write_word_data(addr, CONFIGREG, (0b0 << 8 | 0b0))

# define the top of the range
TOP = 26300

while True:
    # read the register
    b = bus.read_word_data(addr, CONVERSIONREG)

    # swap the two bytes
    b = ((b & 0xFF) << 8) | ((b >> 8) & 0xFF)
    
    # subtract half the range to set ground to zero
    b -= 0x8000

    # divide the result by the range to give us a value between zero and one
    b /= TOP

    # cap at one
    b = min(b, 1)

    # bottom is zero
    b = max(b, 0)

    # two decimal places
    b = round(b, 2)
    print(b)
    time.sleep(.01)

완료되면 필요한 변환을 적용하여 값 배열을 원하는 배율에 매핑합니다. 그런 다음 중요하지 않은 숫자를 삭제하여 지정된 소수점 이하 자릿수로 정밀도를 줄입니다. 가독성을 높이려면 새 결과가 이전 결과와 다른 경우에만 표시되도록 인쇄 기능을 수정합니다. 최대, 최소 및 반올림 기술에 대한 지침은 상위 20개 필수 Python 함수 모음집을 참조하세요.

이 글도 확인해 보세요:  내부에서 REST API 호출을 수행하는 방법 VS 코드

노이즈 처리하기

특정 상황에서는 10비트 표현이 아닌 16비트 표현을 사용할 때 어느 정도의 내재적 불완전성을 관찰할 수 있습니다. 이러한 미묘한 왜곡은 더 높은 비트 심도로 인해 정밀도가 높아지는 특성으로 인해 감지될 수 있습니다.

입력 1을 접지에 연결하고 작동 모드를 조정하여 입력 1과 2를 비교하면 테스트 결과가 훨씬 더 안정적입니다. 또한 긴 점퍼 케이블을 짧은 케이블로 교체하고 회로에 커패시터를 통합하면 성능이 향상될 수 있습니다. 또한 전위차계에 적절한 값을 선택하는 것도 중요합니다.

수동 방법 외에도 소프트웨어 솔루션을 활용하는 것도 고려할 수 있습니다.한 가지 가능한 접근 방식은 이동 평균을 계산하거나 사소한 변동을 무시하는 것입니다. 그러나 이러한 옵션을 구현하면 계산 요구 사항이 증가하여 초당 수많은 샘플을 수집하면서 Python과 같은 복잡한 프로그래밍 언어로 작업할 때와 같이 대량의 데이터를 빠른 속도로 연속적으로 처리하는 경우 성능에 부정적인 영향을 미칠 수 있습니다.

가능한 많은 다음 단계로 더 나아가기

읽기 목적으로 I2C를 활용하는 것은 비교적 간단한 프로세스를 제공하며, 이는 SPI와 같은 대체 접근 방식에서도 비슷하게 적용됩니다. 접근 가능한 ADC 대안들 간에 상당한 차이가 존재하는 것처럼 보일 수 있지만, 실제로는 한 가지 옵션에 익숙해지면 이러한 이해를 나머지 대안으로 이전하는 것이 다소 쉬워집니다.

새로 만든 포텐셔미터 컨트롤러의 한계를 더 넓혀보는 것은 어떨까요? 여러 개의 전위차계를 직렬로 연결하거나 빛, 소리 또는 온도 센서를 실험함으로써 DIY 프로젝트의 기능을 완전히 새로운 차원으로 확장할 수 있습니다. 잠재적인 응용 분야는 사실상 무한합니다.

By 최은지

윈도우(Windows)와 웹 서비스에 대한 전문 지식을 갖춘 노련한 UX 디자이너인 최은지님은 효율적이고 매력적인 디지털 경험을 개발하는 데 탁월한 능력을 발휘합니다. 사용자의 입장에서 생각하며 누구나 쉽게 접근하고 즐길 수 있는 콘텐츠를 개발하는 데 주력하고 있습니다. 사용자 경험을 향상시키기 위해 연구를 거듭하는 은지님은 All Things N 팀의 핵심 구성원으로 활약하고 있습니다.