Condividi tramite


Usare le librerie IoT .NET nei computer Windows, Linux e macOS

Le librerie IoT .NET vengono comunemente usate per sviluppare codice per Raspberry Pi e altri dispositivi IoT. Tuttavia, è anche possibile usarle per sviluppare codice per PC Windows, Linux e macOS usando un adattatore da USB a seriale, ad esempio FTDI FT232H. Questo articolo illustra come usare le librerie IoT .NET per comunicare con i dispositivi connessi all'adapter FT232H.

Suggerimento

Questo articolo usa una scheda FTDI FT232H, ma è possibile usare qualsiasi adattatore da USB a seriale supportato dalle librerie IoT .NET, ad esempio FT2232H, FT4232H e FT4222. Per altre informazioni, vedere l'elenco delle associazioni di dispositivi supportate.

Prerequisiti

Assicurarsi di aver installato i driver D2XX per la scheda da USB a seriale, disponibili nel sito Web FTDI.

Nota

I dispositivi Windows possono installare automaticamente i driver quando si collega l'adapter. Controllare in Gestione dispositivi la presenza di un dispositivo denominato USB Serial Converter elencato in Controller Universal Serial Bus. Il provider di driver del dispositivo deve essere FTDI.

Elencare i dispositivi disponibili

Prima di poter creare un dispositivo GPIO, I2C o SPI, è necessario identificare la scheda da USB a seriale connessa. Il codice seguente elenca i dispositivi FTDI connessi:

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

Nel codice precedente il metodo FtCommon.GetDevices() restituisce un elenco di tutti i dispositivi FTDI connessi.

Usare un dispositivo GPIO

Ecco un'implementazione hardware dell'esercitazione Far lampeggiare un LED che usa l'adattatore FTDI FT232H per controllare un LED:

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

Nell'immagine precedente il circuito LED è molto simile all'esercitazione originale. L'unica differenza è che il LED è collegato al pin D7 sulla scheda FT232H invece del pin 18 sul Raspberry Pi.

Il codice per l'esercitazione è simile anche all'esercitazione originale:

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

Nel codice precedente:

  • Viene creata un'istanza Ft232HDevice passando il primo ID dispositivo restituito da FtCommon.GetDevices() al costruttore.
  • Un'istanza di GpioController denominato controller viene creata chiamando CreateGpioController() sull'istanza di Ft232HDevice. Questa istanza GpioController esegue le stesse funzioni dell'istanza GpioController nell'esercitazione originale.
  • Il valore intero del pin viene recuperato chiamando GetPinNumberFromString() sull'istanza Ft232HDevice e passando il nome del pin alfanumerico D7.
  • Il resto del codice è identico all'esercitazione originale.

Usare un dispositivo I2C

Per la comunicazione I2C, i pin D0 e D1 sulla scheda FT232H vengono usati rispettivamente per le linee SDL e SCA. L'interruttore del selettore I2C sull'adattatore FT232H deve essere impostato su On.

Ecco un'implementazione hardware dell'esercitazione Leggere le condizioni ambientali da un sensore che usa l'adattatore FTDI FT232H per leggere temperatura, umidità e pressione barometrica da un sensore BME280:

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

Nell'immagine precedente:

  • I pin D0 e D1 sulla scheda FT232H sono collegati rispettivamente ai pin SDL e SCA nella scheda di interruzione BME280.
  • L'opzione del selettore I2C nella scheda di interruzione BME280 è impostata su 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);
}

Nel codice precedente:

  • Viene creata un'istanza Ft232HDevice passando il primo ID dispositivo restituito da FtCommon.GetDevices() al costruttore.
  • Un'istanza di I2cDevice viene creata chiamando CreateI2cDevice() nell'istanza Ft232HDevice. Questa istanza I2cDevice esegue le stesse funzioni dell'istanza I2cDevice nell'esercitazione originale.
  • Il resto del codice è identico all'esercitazione originale.

Usare un dispositivo SPI

Per le comunicazioni SPI, i pin D0, D1, D2 e D3 sulla scheda FT232H vengono usati rispettivamente per le linee SCK, MOSI, MISO e CS. L'interruttore del selettore I2C sull'adattatore FT232H deve essere impostato su Off.

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

Ecco un'implementazione hardware dell'esercitazione Leggere i valori da un convertitore analogico-digitale che usa l'adattatore FTDI FT232H per leggere i valori da un MCP3008 ADC:

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

Nell'immagine precedente:

  • I pin D0, D1, D2 e D3 sulla scheda FT232H sono collegati rispettivamente ai pin CLK, DIN, DOUT e CS/SHDN su MCP3008.
  • L'opzione del selettore I2C nella scheda di interruzione MCP3008 è impostata su 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);
}

Nel codice precedente:

  • Viene creata un'istanza Ft232HDevice passando il primo ID dispositivo restituito da FtCommon.GetDevices() al costruttore.
  • Un'istanza di SpiDevice viene creata chiamando CreateSpiDevice() nell'istanza Ft232HDevice. Questa istanza SpiDevice esegue le stesse funzioni dell'istanza SpiDevice nell'esercitazione originale.
  • Il resto del codice è identico all'esercitazione originale.

Ottenere il codice

Il codice per questa esercitazione è disponibile in GitHub.