Verwenden von .NET-IoT-Bibliotheken auf Windows-, Linux- und macOS-Computern

Die .NET-IoT-Bibliotheken werden häufig zum Entwickeln von Code für Raspberry Pi und andere IoT-Geräte verwendet. Sie können sie jedoch auch verwenden, um Code für Windows-, Linux- und macOS-PCs mit einem USB-to-Serial-Adapter wie FTDI FT232H zu entwickeln. In diesem Artikel erfahren Sie, wie Sie die .NET-IoT-Bibliotheken verwenden, um mit Geräten zu kommunizieren, die an den FT232H-Adapter angeschlossen sind.

Tipp

In diesem Artikel wird ein FTDI FT232H-Adapter verwendet. Sie können jedoch jeden USB-to-Serial-Adapter verwenden, der von den .NET-IoT-Bibliotheken unterstützt wird, z. B. FT2232H, FT4232H und FT4222. Weitere Informationen finden Sie in der Liste der unterstützten Gerätebindungen.

Voraussetzungen

Vergewissern Sie sich, dass Sie die D2XX-Treiber für Ihren USB-to-Serial-Adapter installiert haben, die auf der FTDI-Website zu finden sind.

Hinweis

Windows-Geräte installieren die Treiber möglicherweise automatisch, wenn Sie den Adapter anschließen. Suchen Sie im Geräte-Manager nach einem Gerät mit dem Namen Serieller USB-Konverter unter USB-Controller. Der Treiberanbieter des Geräts sollte FTDI sein.

Auflisten der verfügbaren Geräte

Bevor Sie ein GPIO-, 2C- oder SPI-Gerät erstellen können, müssen Sie den angeschlossenen USB-to-Serial-Adapter identifizieren. Der folgende Code listet die angeschlossenen FTDI-Geräte auf:

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

Im vorherigen Code gibt die FtCommon.GetDevices()-Methode eine Liste aller angeschlossenen FTDI-Geräte zurück.

Verwenden eines GPIO-Geräts

Hier ist eine Hardwareimplementierung des Tutorials Aufleuchtenlassen einer LED, das den FTDI FT232H-Adapter zum Steuern einer LED verwendet:

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

Im vorherigen Bild ähnelt der LED-Schaltkreis dem ursprünglichen Tutorial. Der einzige Unterschied besteht darin, dass die LED an Pin D7 auf dem FT232H-Adapter statt an Pin 18 auf dem Raspberry Pi angeschlossen ist.

Der Code für das Tutorial ähnelt auch dem ursprünglichen Tutorial:

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

Für den Code oben gilt:

  • Eine Instanz von Ft232HDevice wird erstellt, indem die erste Geräte-ID übergeben wird, die von FtCommon.GetDevices() an den Konstruktor zurückgegeben wird.
  • Eine Instanz GpioController namens controller wird durch Aufrufen von CreateGpioController() in der Ft232HDevice-Instanz erstellt. Diese GpioController-Instanz übt dieselben Funktionen wie die GpioController-Instanz im ursprünglichen Tutorial aus.
  • Der ganzzahlige Wert des Pins wird abgerufen, indem GetPinNumberFromString() für die Ft232HDevice-Instanz aufgerufen und der alphanumerische Pinname D7 übergeben wird.
  • Der restliche Code ist mit dem ursprünglichen Tutorial identisch.

Verwenden eines I2C-Geräts

Für die I2C-Kommunikation werden die D0- und D1-Pins auf dem FT232H-Adapter für die SDL- bzw. SCA-Leitungen verwendet. Der I2C-Selektorschalter auf dem FT232H-Adapter muss auf On festgelegt werden.

Hier ist eine Hardwareimplementierung des Tutorials Lesen von Umgebungsbedingungen aus einem Sensor, das den FTDI FT232H-Adapter verwendet, um Temperatur, Feuchtigkeit und Luftdruck aus einem BME280-Sensor zu lesen:

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

In der obigen Abbildung:

  • Die D0- und D1-Pins auf dem FT232H-Adapter sind an die jeweiligen SDL- und SCA-Pins auf dem BME280 Breakout Board angeschlossen.
  • Der I2C-Selektorschalter auf dem BME280 Breakout Board ist auf On festgelegt.
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);
}

Für den Code oben gilt:

  • Eine Instanz von Ft232HDevice wird erstellt, indem die erste Geräte-ID übergeben wird, die von FtCommon.GetDevices() an den Konstruktor zurückgegeben wird.
  • Eine Instanz von I2cDevice wird durch Aufrufen von CreateI2cDevice() in der Ft232HDevice-Instanz erstellt. Diese I2cDevice-Instanz übt dieselben Funktionen wie die I2cDevice-Instanz im ursprünglichen Tutorial aus.
  • Der restliche Code ist mit dem ursprünglichen Tutorial identisch.

Verwenden eines SPI-Geräts

Für die SPI-Kommunikation werden die Pins D0, D1, D2 und D3 auf dem FT232H-Adapter für die SCK-, MOSI-, MISO- und CS-Leitungen verwendet. Der I2C-Selektorschalter auf dem FT232H-Adapter muss auf Off festgelegt werden.

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

Hier ist eine Hardwareimplementierung des Tutorials Lesen von Werten aus einem Analog-zu-Digital-Konverter, das den FTDI FT232H-Adapter zum Lesen von Werten aus einem MCP3008-ADC verwendet:

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

In der obigen Abbildung:

  • Die Pins D0, D1, D2 und D3 auf dem FT232H-Adapter sind an die jeweiligen CLK-, DIN-, DOUT- und CS/SHDN-Pins auf MCP3008 angeschlossen.
  • Der I2C-Selektorschalter auf dem MCP3008 Breakout Board ist auf Off festgelegt.
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);
}

Für den Code oben gilt:

  • Eine Instanz von Ft232HDevice wird erstellt, indem die erste Geräte-ID übergeben wird, die von FtCommon.GetDevices() an den Konstruktor zurückgegeben wird.
  • Eine Instanz von SpiDevice wird durch Aufrufen von CreateSpiDevice() in der Ft232HDevice-Instanz erstellt. Diese SpiDevice-Instanz übt dieselben Funktionen wie die SpiDevice-Instanz im ursprünglichen Tutorial aus.
  • Der restliche Code ist mit dem ursprünglichen Tutorial identisch.

Abrufen des Codes

Der Code für dieses Tutorial ist auf GitHub verfügbar.