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:
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 porFtCommon.GetDevices()
para o construtor. - Uma instância de
GpioController
controlador nomeado é criada chamandoCreateGpioController()
na instânciaFt232HDevice
. Essa instânciaGpioController
executa as mesmas funções que a instânciaGpioController
no tutorial original. - O valor inteiro do pino é recuperado chamando
GetPinNumberFromString()
na instânciaFt232HDevice
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:
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 porFtCommon.GetDevices()
para o construtor. - Uma instância de
I2cDevice
é criada chamandoCreateI2cDevice()
na instânciaFt232HDevice
. Essa instânciaI2cDevice
executa as mesmas funções que a instânciaI2cDevice
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.
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:
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 porFtCommon.GetDevices()
para o construtor. - Uma instância de
SpiDevice
é criada chamandoCreateSpiDevice()
na instânciaFt232HDevice
. Essa instânciaSpiDevice
executa as mesmas funções que a instânciaSpiDevice
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.