Usar bibliotecas do .NET IoT em computadores Windows, Linux e macOS
As bibliotecas de IoT do .NET são comumente usadas para desenvolver código para o Raspberry Pi e outros dispositivos IoT. No entanto, você também pode usá-los para desenvolver código para PCs Windows, Linux e macOS usando um adaptador USB para serial, como o FTDI FT232H. Este artigo mostra como usar as bibliotecas do .NET IoT para se comunicar com dispositivos conectados ao adaptador FT232H.
Gorjeta
Este artigo usa um adaptador FTDI FT232H, mas você pode usar qualquer adaptador USB para serial suportado pelas bibliotecas .NET IoT, como o FT2232H, FT4232H e FT4222. Verifique a lista de ligações de dispositivos suportados para obter mais informações.
Pré-requisitos
Certifique-se de ter instalado os drivers D2XX para seu adaptador USB para serial, que são encontrados no site da FTDI.
Nota
Os dispositivos Windows podem instalar automaticamente os drivers quando você conecta o adaptador. Verifique o Gerenciador de Dispositivos para um dispositivo chamado USB Serial Converter listado em Controladores Universal Serial Bus. O provedor de driver do dispositivo deve ser FTDI.
Listar dispositivos disponíveis
Antes de criar um dispositivo GPIO, 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 FtCommon.GetDevices()
método retorna uma lista de todos os dispositivos FTDI conectados.
Usar um dispositivo GPIO
Aqui está uma implementação de hardware do Blink um tutorial LED que usa o adaptador FTDI FT232H para controlar um LED:
Na imagem anterior, o circuito LED é muito semelhante ao tutorial original. A única diferença é que o LED está conectado ao pino D7 no adaptador FT232H em vez do pino 18 no Raspberry Pi.
O código para o 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 o primeiro ID de dispositivo retornado peloFtCommon.GetDevices()
construtor. - Uma instância do
GpioController
controlador nomeado é criada chamandoCreateGpioController()
aFt232HDevice
instância. EstaGpioController
instância executa as mesmas funções que aGpioController
instância no tutorial original. - O valor inteiro do pino é recuperado chamando
GetPinNumberFromString()
aFt232HDevice
instância e passando o nome do pino alfanumérico D7. - O resto do código é idêntico ao tutorial original.
Usar um dispositivo I2C
Para comunicação I2C, os pinos D0 e D1 no adaptador FT232H são usados para as linhas SDL e SCA, respectivamente. O interruptor 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 temperatura, umidade e pressão barométrica de um sensor BME280:
Na imagem anterior:
- Os pinos D0 e D1 no adaptador FT232H são conectados aos pinos SDL e SCA na placa de breakout BME280, respectivamente.
- O interruptor seletor I2C na placa de breakout 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 o primeiro ID de dispositivo retornado peloFtCommon.GetDevices()
construtor. - Uma instância de
I2cDevice
é criada chamandoCreateI2cDevice()
aFt232HDevice
instância. EstaI2cDevice
instância executa as mesmas funções que aI2cDevice
instância no tutorial original. - O resto do código é idêntico ao tutorial original.
Usar um dispositivo SPI
Para comunicação SPI, os pinos D0, D1, D2 e D3 no adaptador FT232H são usados para as linhas SCK, MOSI, MISO e CS, respectivamente. O interruptor 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 MCP3008 ADC:
Na imagem anterior:
- Os pinos D0, D1, D2 e D3 no adaptador FT232H são conectados aos pinos CLK, DIN, DOUT e CS/SHDN no MCP3008, respectivamente.
- O interruptor seletor I2C na placa de breakout MCP3008 está definido como Desligado.
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 o primeiro ID de dispositivo retornado peloFtCommon.GetDevices()
construtor. - Uma instância de
SpiDevice
é criada chamandoCreateSpiDevice()
aFt232HDevice
instância. EstaSpiDevice
instância executa as mesmas funções que aSpiDevice
instância no tutorial original. - O resto do código é idêntico ao tutorial original.
Obter o código
O código para este tutorial está disponível no GitHub.