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:
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 daFtCommon.GetDevices()
al costruttore. - Un'istanza di
GpioController
denominato controller viene creata chiamandoCreateGpioController()
sull'istanza diFt232HDevice
. Questa istanzaGpioController
esegue le stesse funzioni dell'istanzaGpioController
nell'esercitazione originale. - Il valore intero del pin viene recuperato chiamando
GetPinNumberFromString()
sull'istanzaFt232HDevice
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:
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 daFtCommon.GetDevices()
al costruttore. - Un'istanza di
I2cDevice
viene creata chiamandoCreateI2cDevice()
nell'istanzaFt232HDevice
. Questa istanzaI2cDevice
esegue le stesse funzioni dell'istanzaI2cDevice
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.
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:
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 daFtCommon.GetDevices()
al costruttore. - Un'istanza di
SpiDevice
viene creata chiamandoCreateSpiDevice()
nell'istanzaFt232HDevice
. Questa istanzaSpiDevice
esegue le stesse funzioni dell'istanzaSpiDevice
nell'esercitazione originale. - Il resto del codice è identico all'esercitazione originale.
Ottenere il codice
Il codice per questa esercitazione è disponibile in GitHub.