Leer valores de un convertidor analógico digital

Un conversor analógico-digital (ADC) es un dispositivo que puede leer un valor de voltaje de entrada analógico y convertirlo en un valor digital. Los ADC se usan para leer valores de termistores, potenciómetros y otros dispositivos que cambian la resistencia en función de ciertas condiciones.

En este tema, usará .NET para leer valores de un ADC a medida que se modula el voltaje de entrada con un potenciómetro.

Requisitos previos

  • Equipo de placa única (SBC) basado en ARM (ARMv7 o superior)
  • Conversor analógico-digital MCP3008
  • Potenciómetro de tres pines
  • Placa de pruebas
  • Cables de puente
  • Placa adaptadora GPIO de Raspberry Pi (opcional/recomendada)
  • SDK de .NET 7 o versiones posteriores

Nota

En este tutorial, se presupone que el dispositivo de destino es Raspberry Pi. Sin embargo, se puede usar con cualquier equipo SBC basado en Linux que admita .NET, como Orange Pi, ODROID, etc.

Preparación del equipo de placa única

Asegúrese de que el equipo de placa única esté configurado para admitir estos servicios:

  • SSH
  • SPI

En muchos dispositivos, no se requiere ninguna configuración adicional. En Raspberry Pi, use el comando raspi-config. Para obtener más información sobre raspi-config, consulte la documentación de Raspberry Pi.

Preparación del hardware

Use los componentes de hardware para crear el circuito como se muestra en el diagrama siguiente:

Un diagrama de Fritzing el que se muestra un circuito con un ADC MCP3008 y un potenciómetro

MCP3008 usa la interfaz de periféricos en serie (SPI) para comunicarse. A continuación se muestran las conexiones desde MCP3008 al dispositivo Raspberry Pi y el potenciómetro:

  • De VDD a 3,3V (se muestra en color rojo)
  • De VREF a 3,3V (rojo)
  • De AGND a la toma de tierra (negro)
  • De CLK a SCLK (naranja)
  • De DOUT a MISO (naranja)
  • De DIN a MOSI (naranja)
  • De CS/SHDN a CE0 (verde)
  • De DGND a la toma de tierra (negro)
  • De CH0 a un pin variable (central) en el potenciómetro (amarillo)

Proporcione 3,3V y una toma de tierra a los pines externos del potenciómetro. El orden no es importante.

Consulte los siguientes diagramas de pines según sea necesario:

MCP3008 GPIO de Raspberry Pi
Diagrama en el que se muestran los pines de MCP3008 Diagrama en el que se muestran los pines del encabezado GPIO de Raspberry Pi. Imagen de Raspberry Pi Foundation.
Imagen de Raspberry Pi Foundation.

Sugerencia

Se recomienda una placa de pruebas de GPIO junto con una placa para optimizar las conexiones con el encabezado de GPIO.

Creación de la aplicación

Complete los pasos siguientes en el entorno de desarrollo que prefiera:

  1. Cree una aplicación de consola de .NET mediante la CLI de .NET o Visual Studio. Asígnele el nombre AdcTutorial.

    dotnet new console -o AdcTutorial
    cd AdcTutorial
    
  2. Agregue el paquete Iot.Device.Bindings al proyecto. Use la CLI de .NET desde el directorio del proyecto o Visual Studio.

    dotnet add package Iot.Device.Bindings --version 2.2.0-*
    
  3. Reemplace el contenido de Program.cs por el código siguiente:

    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);
    }
    

    En el código anterior:

    • hardwareSpiSettings se establece en una instancia nueva de SpiConnectionSettings. El constructor establece el parámetro busId en 0 y el parámetro chipSelectLine en 0.
    • Una declaración using crea una instancia de SpiDevice mediante una llamada a SpiDevice.Create y pasando hardwareSpiSettings. Este objeto SpiDevice representa el bus SPI. La declaración using garantiza que el objeto se deseche y que los recursos de hardware se liberen correctamente.
    • Otra declaración using crea una instancia de Mcp3008 y pasa SpiDevice en el constructor.
    • Se ejecuta un bucle while indefinidamente. En cada iteración:
      1. Se borra la consola.
      2. Se lee el valor de CH0 en el ADC mediante la llamada a mcp.Read(0).
      3. Escribe el valor sin procesar en la consola.
      4. Se escribe el valor en la consola con el formato de porcentaje.
        • Para calcular el porcentaje, el valor se divide por 10,23. MCP3008 es un ADC de 10 bits, lo que significa que devuelve 1024 valores posibles en el rango 0-1023. La división del valor por 10,23 representa el valor como un porcentaje.
        • El porcentaje se redondea al 0,1 más cercano.
      5. Se suspende durante 500 ms.
  4. Compile la aplicación. Si usa la CLI de .NET, ejecute dotnet build. Para realizar la compilación en Visual Studio, presione Ctrl+Mayús+B.

  5. Implemente la aplicación en el equipo de placa única como una aplicación independiente. Para obtener instrucciones, vea Implementación de aplicaciones .NET en Raspberry Pi. Asegúrese de conceder el permiso execute ejecutable mediante chmod +x.

  6. Para ejecutar la aplicación en Raspberry Pi, cambie al directorio de implementación y ejecute el archivo ejecutable.

    ./AdcTutorial
    

    Observe la salida a medida que gira la rueda del potenciómetro. Esto se debe a que el potenciómetro varía el voltaje proporcionado a CH0 en el ADC. El ADC compara el voltaje de entrada en CH0 con el voltaje de referencia proporcionado a VREF para generar un valor.

  7. Presione Ctrl+C para finalizar el programa.

Felicidades. Ha usado SPI para leer valores de un conversor analógico-digital.

Obtención del código fuente

El código fuente de este tutorial está disponible en GitHub.

Pasos siguientes