다음을 통해 공유


아날로그에서 디지털로의 변환기에서 값 읽기

ADC(아날로그-디지털 변환기)는 아날로그 입력 전압 값을 읽고 디지털 값으로 변환할 수 있는 디바이스입니다. ADC는 서미스터, 전위차계 및 특정 조건에 따라 저항을 변경하는 기타 디바이스에서 값을 읽는 데 사용됩니다.

이 항목에서는 전위차계를 사용하여 입력 전압을 조절할 때 .NET을 사용하여 ADC에서 값을 읽습니다.

필수 구성 요소

  • ARM 기반(ARMv7 이상) SBC(단일 보드 컴퓨터)
  • MCP3008 아날로그-디지털 변환기
  • 3핀 전위차계
  • 브레드보드
  • 점퍼 와이어
  • Raspberry Pi GPIO 브레이크아웃 보드(선택 사항/권장)
  • .NET SDK 7 이상

참고

이 자습서는 대상 디바이스가 Raspberry Pi라고 가정하여 작성되었습니다. 그러나 이 자습서는 Orange Pi, ODROID 등 .NET을 지원하는 모든 Linux 기반 SBC에 사용할 수 있습니다.

SBC 준비

SBC가 다음 서비스를 지원하도록 구성되어 있는지 확인합니다.

  • SSH
  • SPI

많은 디바이스의 경우 추가 구성이 필요하지 않습니다. Raspberry Pi의 raspi-config 경우 명령을 사용합니다. raspi-config에 관한 자세한 내용은 Raspberry Pi 설명서를 참조하세요.

하드웨어 준비

하드웨어 구성 요소를 사용하여 다음 다이어그램에 표시된 대로 회로를 빌드합니다.

MCP3008 ADC 및 전위차계가 있는 회로를 보여 주는 Fritzing 다이어그램

MCP3008은 통신하는 데 SPI(직렬 주변 디바이스 인터페이스)를 사용합니다. 다음은 MCP3008에서 Raspberry Pi 및 전위차계로 연결한 것입니다.

  • VDD-3.3v(빨간색으로 표시)
  • VREF-3.3v(빨간색)
  • AGND-접지(검은색)
  • CLK-SCLK(주황색)
  • DOUT-MISO(주황색)
  • DIN-MOSI(주황색)
  • CS/SHDN-CE0(녹색)
  • DGND-접지(검은색)
  • CH0-전위차계의 가변(중간) 핀(노란색)

전위차계의 외부 핀에 3.3V 및 접지를 제공합니다. 순서는 중요하지 않습니다.

필요한 경우 다음 핀 배치도 다이어그램을 참조하세요.

MCP3008 Raspberry Pi GPIO
MCP3008의 핀 배치도를 보여 주는 다이어그램 Raspberry Pi GPIO 헤더의 핀 배치도를 보여 주는 다이어그램. Raspberry Pi Foundation이 제공한 이미지
Raspberry Pi Foundation이 제공한 이미지.

GPIO 헤더에 대한 연결을 간소화하기 위해 브레드보드와 함께 GPIO 브레이크아웃 보드를 사용하는 것이 좋습니다.

앱 만들기

선호하는 개발 환경에서 다음 단계를 완료합니다.

  1. .NET CLI 또는 Visual Studio 중 하나를 사용하여 새 .NET 콘솔 앱을 만듭니다. 이름을 AdcTutorial로 지정합니다.

    dotnet new console -o AdcTutorial
    cd AdcTutorial
    
  2. Iot.Device.Bindings 패키지를 프로젝트에 추가합니다. 프로젝트 디렉터리 또는 Visual Studio에서 .NET CLI를 사용합니다.

    dotnet add package Iot.Device.Bindings --version 2.2.0-*
    
  3. Program.cs의 내용을 다음 코드로 바꿉니다.

    using System;
    using System.Device.Spi;
    using System.Threading;
    using Iot.Device.Adc;
    
    var hardwareSpiSettings = new SpiConnectionSettings(0, 0);
    
    using SpiDevice spi = SpiDevice.Create(hardwareSpiSettings);
    using var mcp = new Mcp3008(spi);
    while (true)
    {
        Console.Clear();
        double value = mcp.Read(0);
        Console.WriteLine($"{value}");
        Console.WriteLine($"{Math.Round(value/10.23, 1)}%");
        Thread.Sleep(500);
    }
    

    위의 코드에서

    • hardwareSpiSettingsSpiConnectionSettings의 새 인스턴스로 설정됩니다. 생성자는 busId 매개 변수를 0으로 설정하고 chipSelectLine 매개 변수를 0으로 설정합니다.
    • using 선언SpiDevice.Create를 호출하고 hardwareSpiSettings를 전달하여 SpiDevice 인스턴스를 만듭니다. 이 SpiDevice는 SPI 버스를 나타냅니다. using 선언은 개체가 삭제되고 하드웨어 리소스가 제대로 해제되었는지 확인합니다.
    • 또 다른 using 선언은Mcp3008 인스턴스를 만들고 SpiDevice를 생성자에 전달합니다.
    • while 루프는 무기한으로 실행됩니다. 반복될 때마다:
      1. 콘솔을 지웁니다.
      2. mcp.Read(0)을 호출하여 ADC에서 CH0 값을 읽습니다.
      3. 원시 값을 콘솔에 씁니다.
      4. 값을 백분율 형식으로 콘솔에 씁니다.
        • 백분율을 계산하기 위해 값은 10.23으로 나뉩니다. MCP3008은 10비트 ADC입니다. 즉, 0~1,023 범위의 1,024개 가능한 값을 반환합니다. 값을 10.23으로 나누면 값이 백분율로 표시됩니다.
        • 백분율은 가장 가까운 0.1로 반올림됩니다.
      5. 500밀리초 동안 일시 중단합니다.
  4. 앱을 빌드합니다. .NET CLI를 사용하는 경우를 dotnet build를 실행합니다. Visual Studio에서 빌드하려면 Ctrl+Shift+B를 누릅니다.

  5. SBC에 자체 포함 앱으로 앱을 배포합니다. 자세한 내용은 Raspberry Pi에 .NET 앱 배포를 참조하세요. chmod +x를 사용하여 실행 파일 ‘실행’ 권한을 부여해야 합니다.

  6. 배포 디렉터리로 전환하고 실행 파일을 실행하여 Raspberry Pi에서 앱을 실행합니다.

    ./AdcTutorial
    

    전위차계 다이얼을 회전하면서 출력을 관찰합니다. 이는 전위차계가 ADC에서 CH0에 제공된 전압을 변경하기 때문입니다. ADC는 CH0의 입력 전압을 VREF에 제공된 참조 전압과 비교하여 값을 생성합니다.

  7. Ctrl+C를 눌러 프로그램을 종료합니다.

축하합니다! SPI를 사용하여 아날로그-디지털 변환기에서 값을 읽었습니다.

소스 코드 가져오기

이 자습서의 소스는 GitHub에서 제공됩니다.

다음 단계