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:
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 vonFtCommon.GetDevices()
an den Konstruktor zurückgegeben wird. - Eine Instanz
GpioController
namens controller wird durch Aufrufen vonCreateGpioController()
in derFt232HDevice
-Instanz erstellt. DieseGpioController
-Instanz übt dieselben Funktionen wie dieGpioController
-Instanz im ursprünglichen Tutorial aus. - Der ganzzahlige Wert des Pins wird abgerufen, indem
GetPinNumberFromString()
für dieFt232HDevice
-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:
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 vonFtCommon.GetDevices()
an den Konstruktor zurückgegeben wird. - Eine Instanz von
I2cDevice
wird durch Aufrufen vonCreateI2cDevice()
in derFt232HDevice
-Instanz erstellt. DieseI2cDevice
-Instanz übt dieselben Funktionen wie dieI2cDevice
-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.
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:
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 vonFtCommon.GetDevices()
an den Konstruktor zurückgegeben wird. - Eine Instanz von
SpiDevice
wird durch Aufrufen vonCreateSpiDevice()
in derFt232HDevice
-Instanz erstellt. DieseSpiDevice
-Instanz übt dieselben Funktionen wie dieSpiDevice
-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.