Windows、Linux、macOS コンピューターで .NET IoT ライブラリを使用する

.NET IoT ライブラリは、Raspberry Pi やその他の IoT デバイスのコードを開発するために一般的に使用されます。 ただし、FTDI FT232H などの USB シリアル変換アダプターを使用して、Windows、Linux、macOS PC 用のコードを開発するために使用することもできます。 この記事では、.NET IoT ライブラリを使用して、FT232H アダプターに接続されているデバイスと通信する方法について説明します。

ヒント

この記事では FTDI FT232H アダプターを使用しますが、FT2232H、FT4232H、FT4222 など、.NET IoT ライブラリでサポートされている任意の USB シリアル変換アダプターを使用できます。 詳細については、サポートされているデバイス バインディングの一覧を確認してください。

前提条件

USB シリアル変換アダプターの D2XX ドライバーがインストールされていることを確認します。ドライバーについては、FTDI Web サイトを参照してください。

Note

Windows デバイスでは、アダプターを接続すると、ドライバーが自動的にインストールされます。 デバイス マネージャーで、[ユニバーサル シリアル バス コントローラー] の下の一覧に表示されている [USB シリアル コンバーター] という名前のデバイスを確認します。 このデバイスのドライバー プロバイダーは FTDI になっているはずです。

使用可能なデバイスを一覧表示する

GPIO、I2C、または SPI デバイスを作成する前に、接続されている USB シリアル変換アダプターを特定する必要があります。 次のコードは、接続されている FTDI デバイスを一覧表示します。

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

上記のコードでは、FtCommon.GetDevices() メソッドによって、接続されているすべての FTDI デバイスの一覧が返されます。

GPIO デバイスを使用する

チュートリアル「LED を点滅させる」のハードウェア実装を次に示します。これは、FTDI FT232H アダプターを使用して LED を制御します。

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

上記の画像では、LED 回路は元のチュートリアルと非常によく似ています。 唯一の違いは、Raspberry Pi のピン 18 ではなく FT232H アダプターのピン D7 に LED が接続されていることです。

チュートリアルのコードも元のチュートリアルと似ています。

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

上のコードでは以下の操作が行われます。

  • インスタンス Ft232HDevice は、FtCommon.GetDevices() から最初に返されたデバイス ID をコンストラクターに渡すことによって作成されます。
  • controller という名前の GpioController のインスタンスは、Ft232HDevice インスタンスで CreateGpioController() を呼び出すことによって作成されます。 この GpioController インスタンスは、元のチュートリアルの GpioController インスタンスと同じ機能を実行します。
  • ピンの整数値は、Ft232HDevice インスタンスで GetPinNumberFromString() を呼び出し、英数字のピン名 D7 を返すことによって取得されます。
  • コードの残りの部分は、元のチュートリアルと同じです。

I2C を使用する

I2C 通信の場合、FT232H アダプターの D0 ピンと D1 ピンはそれぞれ SDL 回線と SCA 回線に使用されます。 FT232H アダプターの I2C セレクター スイッチを "オン" に設定する必要があります。

チュートリアル「センサーから環境条件を読み取る」のハードウェア実装を次に示します。これは、FTDI FT232H アダプターを使用して、BME280 センサーから温度、湿度、気圧を読み取ります。

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

上の図では、次の手順を実行します。

  • FT232H アダプターの D0 ピンと D1 ピンはそれぞれ BME280 ブレークアウト ボードの SDL ピンと SCA ピンに接続されます。
  • BME280 ブレークアウト ボードの I2C セレクター スイッチを "オン" に設定する必要があります。
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);
}

上のコードでは以下の操作が行われます。

  • インスタンス Ft232HDevice は、FtCommon.GetDevices() から最初に返されたデバイス ID をコンストラクターに渡すことによって作成されます。
  • I2cDevice のインスタンスは、Ft232HDevice インスタンスで CreateI2cDevice() を呼び出すことによって作成されます。 この I2cDevice インスタンスは、元のチュートリアルの I2cDevice インスタンスと同じ機能を実行します。
  • コードの残りの部分は、元のチュートリアルと同じです。

SPI デバイスを使用する

SPI 通信の場合、FT232H アダプターの D0D1D2D3 の各ピンはそれぞれ SCK、MOSI、MISO、CS 回線に使用されます。 FT232H アダプターの I2C セレクター スイッチを "オフ" に設定する必要があります。

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

チュートリアル「アナログ デジタル コンバーターから値を読み取る」のハードウェア実装を次に示します。これは、FTDI FT232H アダプターを使用して、MCP3008 ADC から値を読み取ります。

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

上の図では、次の手順を実行します。

  • FT232H アダプターの D0D1D2D3 の各ピンはそれぞれ MCP3008 の CLKDINDOUTCS/SHDN ピンに接続されます。
  • MCP3008 アダプターの I2C セレクター スイッチを "オフ" に設定する必要があります。
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);
}

上のコードでは以下の操作が行われます。

  • インスタンス Ft232HDevice は、FtCommon.GetDevices() から最初に返されたデバイス ID をコンストラクターに渡すことによって作成されます。
  • SpiDevice のインスタンスは、Ft232HDevice インスタンスで CreateSpiDevice() を呼び出すことによって作成されます。 この SpiDevice インスタンスは、元のチュートリアルの SpiDevice インスタンスと同じ機能を実行します。
  • コードの残りの部分は、元のチュートリアルと同じです。

コードを取得する

このチュートリアルのコードは、GitHub で入手できます