Usar bibliotecas IoT do .NET em computadores Windows, Linux e macOS

As bibliotecas de IoT do .NET geralmente são usadas para desenvolver código para Raspberry Pi e outros dispositivos IoT. Porém, você também pode usá-los para desenvolver código para computadores Windows, Linux e macOS usando um adaptador USB para serial, como o FTDI FT232H. Este artigo mostra como usar as bibliotecas IoT do .NET para se comunicar com os dispositivos conectados ao adaptador FT232H.

Dica

Este artigo usa um adaptador FTDI FT232H, mas você pode usar qualquer adaptador USB para serial compatível com as bibliotecas IoT do .NET, como o FT2232H, FT4232H e FT4222. Verifique a lista de associações de dispositivo com suporte para obter mais informações.

Pré-requisitos

Verifique se você instalou os drivers D2XX no seu adaptador USB para serial, que são encontrados no site FTDI.

Observação

Os dispositivos Windows podem instalar automaticamente os drivers quando você conecta o adaptador. Verifique no Gerenciador de Dispositivos se há um dispositivo chamado Conversor Serial de USB listado em controladores do Barramento Serial Universal. O provedor de driver do dispositivo deve ser FTDI.

Listar os dispositivos disponíveis

Antes de criar um GPIO, dispositivo I2C ou SPI, você deve identificar o adaptador USB para serial conectado. O código a seguir lista os 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;
}

No código anterior, o método FtCommon.GetDevices() retorna uma lista de todos os dispositivos FTDI conectados.

Usar um dispositivo GPIO

Aqui está uma implementação de hardware do tutorial Fazer um LED piscar que usa o adaptador FTDI FT232H para controlar um LED:

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

Na imagem anterior, o circuito de LED é muito semelhante ao tutorial original. A única diferença é que o LED está conectado ao pino D7 no adaptador FT232H em vez de fixar 18 no Raspberry Pi.

O código do tutorial também é semelhante ao 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;
}

No código anterior:

  • Uma instância Ft232HDevice é criada passando a primeira ID do dispositivo retornada por FtCommon.GetDevices() para o construtor.
  • Uma instância de GpioController controlador nomeado é criada chamando CreateGpioController() na instância Ft232HDevice. Essa instância GpioController executa as mesmas funções que a instância GpioController no tutorial original.
  • O valor inteiro do pino é recuperado chamando GetPinNumberFromString() na instância Ft232HDevice e passando o nome do pino alfanumérico D7.
  • O restante do código é idêntico ao tutorial original.

Usar um dispositivo I2C

Quanto à comunicação I2C, os pinos D0 e D1 no adaptador FT232H são usados nas linhas SDL e SCA, respectivamente. O seletor I2C no adaptador FT232H deve ser definido como On.

Aqui está uma implementação de hardware do tutorial Ler condições ambientais de um sensor que usa o adaptador FTDI FT232H para ler a temperatura, umidade e pressão barométrica de um sensor BME280:

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

Na imagem anterior:

  • Os pinos D0eD1 no adaptador FT232H são conectados aos pinos SDL e SCA no quadro de fuga BME280, respectivamente.
  • O seletor I2C no quadro de divisão BME280 está definido como On.
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);
}

No código anterior:

  • Uma instância Ft232HDevice é criada passando a primeira ID do dispositivo retornada por FtCommon.GetDevices() para o construtor.
  • Uma instância de I2cDevice é criada chamando CreateI2cDevice() na instância Ft232HDevice. Essa instância I2cDevice executa as mesmas funções que a instância I2cDevice no tutorial original.
  • O restante do código é idêntico ao tutorial original.

Usar um dispositivo SPI

Quanto à comunicação com SPI, os pinos D0, D1, D2 e D3 no adaptador FT232H são usados nas linhas SCK, MOSI, MISO e CS, respectivamente. O seletor I2C no adaptador FT232H deve ser definido como Off.

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

Aqui está uma implementação de hardware dos Valores de leitura de um tutorial de conversor analógico-digital que usa o adaptador FTDI FT232H para ler valores de um ADC MCP3008:

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

Na imagem anterior:

  • Os pinos D0, D1, D2e D3 no adaptador FT232H estão conectados aos pinos CLK, DIN, DOUT, e CS/SHDN no MCP3008, respectivamente.
  • O seletor I2C no quadro de MCP3008 de divisão está definido como Off.
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);
}

No código anterior:

  • Uma instância Ft232HDevice é criada passando a primeira ID do dispositivo retornada por FtCommon.GetDevices() para o construtor.
  • Uma instância de SpiDevice é criada chamando CreateSpiDevice() na instância Ft232HDevice. Essa instância SpiDevice executa as mesmas funções que a instância SpiDevice no tutorial original.
  • O restante do código é idêntico ao tutorial original.

Obter o código

O código deste tutorial está disponível no GitHub.