Uso de bibliotecas de IoT de .NET en equipos Windows, Linux y macOS

Las bibliotecas de IoT de .NET se usan normalmente para desarrollar código para Raspberry Pi y otros dispositivos IoT. Sin embargo, también puede usarlos para desarrollar código para equipos Windows, Linux y macOS mediante un adaptador USB a serie, como FTDI FT232H. En este artículo se muestra cómo usar las bibliotecas de IoT de .NET para comunicarse con dispositivos conectados al adaptador FT232H.

Sugerencia

En este artículo se usa un adaptador FTDI FT232H, pero puede usar cualquier adaptador USB a serie compatible con las bibliotecas de IoT de .NET, como el FT2232H, FT4232H y FT4222. Consulte la lista de enlaces de dispositivos admitidos para obtener más información.

Requisitos previos

Asegúrese de que ha instalado los controladores D2XX para el adaptador USB a serie, que se encuentra en el sitio web de FTDI.

Nota:

Los dispositivos Windows pueden instalar automáticamente los controladores al conectar el adaptador. Compruebe el Administrador de dispositivos para ver un dispositivo denominado Convertidor de serie USB que aparece en Controladores de bus serie universales. El proveedor de controladores del dispositivo debe ser FTDI.

Lista de dispositivos disponibles

Para poder crear un dispositivo GPIO, I2C o SPI, debe identificar el adaptador USB a serie conectado. En el código siguiente se enumeran los dispositivos FTDI conectados:

using Iot.Device.FtCommon;

var devices = FtCommon.GetDevices();
Console.WriteLine($"{devices.Count} available device(s)");
foreach (var device in devices)
{
    Console.WriteLine($"  {device.Description}");
    Console.WriteLine($"    Flags: {device.Flags}");
    Console.WriteLine($"    Id: {device.Id}");
    Console.WriteLine($"    LocId: {device.LocId}");
    Console.WriteLine($"    Serial number: {device.SerialNumber}");
    Console.WriteLine($"    Type: {device.Type}");
}

if (devices.Count == 0)
{
    Console.WriteLine("No device connected");
    return;
}

En el código anterior, el método FtCommon.GetDevices() devuelve una lista de todos los dispositivos FTDI conectados.

Uso de un dispositivo GPIO

Esta es una implementación de hardware del tutorial de Blink un LED que usa el adaptador FTDI FT232H para controlar un LED:

A picture of a breadboard with an FT232H adapter, a resister, an LED, and connecting wires.

En la imagen anterior, el circuito LED es muy similar al tutorial original. La única diferencia es que el LED está conectado al pin D7 en el adaptador FT232H en lugar del pin 18 en Raspberry Pi.

El código del tutorial también es similar al tutorial original:

using System.Device.Gpio;
using Iot.Device.Ft232H;
using Iot.Device.FtCommon;

Console.WriteLine("Blinking LED. Press Ctrl+C to end.");

Ft232HDevice ft232h = new Ft232HDevice(FtCommon.GetDevices()[0]);
GpioController controller = ft232h.CreateGpioController();

int pin = Ft232HDevice.GetPinNumberFromString("D7");
controller.OpenPin(pin, PinMode.Output);
bool ledOn = true;
while (true)
{
    controller.Write(pin, ledOn ? PinValue.High : PinValue.Low);
    Thread.Sleep(1000);
    ledOn = !ledOn;
}

En el código anterior:

  • Para crear una instancia de Ft232HDevice, pase el primer identificador de dispositivo devuelto por FtCommon.GetDevices() al constructor.
  • Se crea una instancia de GpioController denominada controlador llamando a CreateGpioController() en la instancia Ft232HDevice. Esta instancia GpioController realiza las mismas funciones que la instancia GpioController del tutorial original.
  • El valor entero del pin se recupera llamando a GetPinNumberFromString() en la instancia Ft232HDevice y pasando el nombre de pin alfanumérico D7.
  • El resto del código es idéntico al tutorial original.

Uso de un dispositivo I2C

Para la comunicación I2C, los pines D0 y D1 del adaptador FT232H se usan para las líneas SDL y SCA, respectivamente. El conmutador del selector I2C en el adaptador FT232H debe establecerse en Activado.

Esta es una implementación de hardware del tutorial de Lectura de condiciones ambientales de un sensor que usa el adaptador FTDI FT232H para leer la temperatura, la humedad y la presión barométrica desde un sensor BME280:

A picture of a breadboard with an FT232H adapter, a BME280 breakout board, and connecting wires.

En la imagen anterior:

  • Los pines D0 y D1 del adaptador FT232H están conectados a los pines SDL y SCA en la placa adaptadora BME280, respectivamente.
  • El conmutador del selector I2C en la placa adaptadora BME280 está establecido en Activado.
using System.Device.I2c;
using Iot.Device.Bmxx80;
using Iot.Device.Bmxx80.PowerMode;
using Iot.Device.Ft232H;
using Iot.Device.FtCommon;

Ft232HDevice ft232h = new Ft232HDevice(FtCommon.GetDevices()[0]);
I2cConnectionSettings i2cSettings = new I2cConnectionSettings(0, Bme280.SecondaryI2cAddress);

using I2cDevice i2cDevice = ft232h.CreateI2cDevice(i2cSettings);
using Bme280 bme280 = new Bme280(i2cDevice);

int measurementTime = bme280.GetMeasurementDuration();

while (true)
{
    Console.Clear();

    bme280.SetPowerMode(Bmx280PowerMode.Forced);
    Thread.Sleep(measurementTime);

    bme280.TryReadTemperature(out var tempValue);
    bme280.TryReadPressure(out var preValue);
    bme280.TryReadHumidity(out var humValue);
    bme280.TryReadAltitude(out var altValue);

    Console.WriteLine($"Temperature: {tempValue.DegreesCelsius:0.#}\u00B0C");
    Console.WriteLine($"Pressure: {preValue.Hectopascals:#.##} hPa");
    Console.WriteLine($"Relative humidity: {humValue.Percent:#.##}%");
    Console.WriteLine($"Estimated altitude: {altValue.Meters:#} m");

    Thread.Sleep(1000);
}

En el código anterior:

  • Para crear una instancia de Ft232HDevice, pase el primer identificador de dispositivo devuelto por FtCommon.GetDevices() al constructor.
  • Se crea una instancia de I2cDevice mediante una llamada a CreateI2cDevice() en la instancia Ft232HDevice. Esta instancia I2cDevice realiza las mismas funciones que la instancia I2cDevice del tutorial original.
  • El resto del código es idéntico al tutorial original.

Uso de un dispositivo SPI

Para la comunicación SPI, los pines D0, D1, D2y D3 del adaptador FT232H se usan para las líneas SCK, MOSI, MISO y CS, respectivamente. El conmutador del selector I2C en el adaptador FT232H debe establecerse en Desactivado.

A picture of the back of the FT232H breakout depicting the SPI pins.

Esta es una implementación de hardware del tutorial de Lectura de los valores de lectura de un convertidor analógico a digital que usa el adaptador FTDI FT232H para leer valores de un ADC MCP3008:

A picture of a breadboard with an FT232H adapter, an MCP3008 chip, and connecting wires.

En la imagen anterior:

  • Los pines D0, D1, D2, and D3 del adaptador FT232H están conectadas a los pines CLK, DIN, DOUT y CS/SHDN en MCP3008, respectivamente.
  • El conmutador del selector I2C en la placa adaptadora MCP3008 está establecido en Desactivado.
using System.Device.Gpio;
using System.Device.Spi;
using Iot.Device.Adc;
using Iot.Device.Ft232H;
using Iot.Device.FtCommon;

var devices = FtCommon.GetDevices();
var ft232h = new Ft232HDevice(devices[0]);
var hardwareSpiSettings = new SpiConnectionSettings(0, 3) { ClockFrequency = 1_000_000, DataBitLength = 8, ChipSelectLineActiveState = PinValue.Low };
using SpiDevice spi = ft232h.CreateSpiDevice(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:

  • Para crear una instancia de Ft232HDevice, pase el primer identificador de dispositivo devuelto por FtCommon.GetDevices() al constructor.
  • Se crea una instancia de SpiDevice mediante una llamada a CreateSpiDevice() en la instancia Ft232HDevice. Esta instancia SpiDevice realiza las mismas funciones que la instancia SpiDevice del tutorial original.
  • El resto del código es idéntico al tutorial original.

Obtención del código

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