アナログ デジタル コンバーターから値を読み取る

アナログ デジタル コンバーター (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-1023 の範囲で 1024 通りの値を返すことができます。 その値を 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 から入手できます

次の手順