Flutter GPIO控制插件gpiod的使用

Flutter GPIO控制插件gpiod的使用

在本教程中,我们将展示如何在Flutter中使用gpiod插件来控制GPIO引脚。gpiod是一个基于Linux的GPIO访问库,通过libgpiod实现。为了使用该插件,你需要确保系统上安装了libgpiod.so

安装libgpiod

首先,你需要在你的Linux系统上安装libgpiod。你可以通过以下命令安装:

sudo apt install gpiod

接下来,你需要构建libproxy_gpiod.so。进入proxy_gpiod目录并运行以下命令:

cd proxy_gpiod
./build.sh

获取GPIO芯片列表

首先,我们需要获取系统上所有可用的GPIO芯片。每个芯片都有一个名称、标签以及与之关联的GPIO线数量。

final gpio = ProxyGpiod.getInstance();

final chips = gpio.chips;

for (final chip in chips) {
    print("chip name: ${chip.name}, chip label: ${chip.label}");

    for (final line in chip.lines) {
        print("  line: $line");
    }
}

获取特定GPIO线的信息

每个GPIO线也有与其相关的某些信息,这些信息可以通过GpioLine.info获取。如果该线路未被你拥有或请求,则这些信息可能会随时更改。

final gpio = ProxyGpiod.getInstance();

final chip = gpio.chips.singleWhere((chip) => chip.label == 'pinctrl-bcm2835');

final line = chip.lines[22];

print("line info: ${await line.info}");

控制GPIO线

要控制一个GPIO线(读取或写入值或监听边缘事件),你需要使用GpioLine.requestInputGpioLine.requestOutput方法来请求它。

输入模式

final gpio = ProxyGpiod.getInstance();
final chip = gpio.chips.singleWhere((chip) => chip.label == 'pinctrl-bcm2835');
final line = chip.lines[22];

// 请求为输入模式。
line.requestInput();
print("line value: ${line.getValue()}");
line.release();

// 现在我们请求为输出模式。
line.requestOutput(initialValue: true);
line.setValue(false);
line.release();

// 再次请求为输入模式,并且这次我们还监听边缘事件。
line.requestInput(triggers: {SignalEdge.falling, SignalEdge.rising});

print("line value: ${line.getValue()}");

// 如果没有请求触发器,line.onEvent将不会发出任何事件。
// 这个循环会永远运行。
for (final event in line.onEvent) {
  print("got GPIO line signal event: $event");
}

line.release();

示例代码

以下是一个完整的示例代码,展示了如何使用gpiod插件来控制GPIO引脚。

import 'package:gpiod/proxy_gpiod.dart';

void main() async {
  try {
    final gpio = ProxyGpiod.getInstance();
    _status(gpio.chips);
    await _led(gpio.chips);
    await _pirTest(gpio.chips);
    await _button(gpio.chips);
    _status(gpio.chips);
  } catch (e, st) {
    print('Error $e $st');
  }
}

Future _pirTest(List<GpioChip> chips) async {
  print('PIR');
  final lineLED =
      chips.singleWhere((chip) => chip.label == 'pinctrl-bcm2835').lines[14];
  final linePIR =
      chips.singleWhere((chip) => chip.label == 'pinctrl-bcm2835').lines[15];

  /// 请求BCM 14作为输出。
  lineLED.requestOutput(consumer: "flutter_gpiod test", initialValue: true);

  for (var i = 0; i < 2; i++) {
    /// 脉冲线。
    /// 设置为非活动状态。(低电压=接地)
    lineLED.setValue(false);
    await Future.delayed(Duration(milliseconds: 500));
    lineLED.setValue(true);
    await Future.delayed(Duration(milliseconds: 500));
  }
  lineLED.setValue(false);

  linePIR.requestInput(
      consumer: "PIR",
      triggers: {SignalEdge.falling, SignalEdge.rising});

  /// 永久记录线路事件。
  linePIR.onEvent.listen((event) {
    print("PIR: $event");
    lineLED.setValue(event.edge == SignalEdge.falling);
  });
}

Future _led(List<GpioChip> chips) async {
  print('LED');
  final line14 =
      chips.singleWhere((chip) => chip.label == 'pinctrl-bcm2835').lines[14];

  /// 请求BCM 14作为输出。
  line14.requestOutput(consumer: "flutter_gpiod test", initialValue: true);

  for (var i = 0; i < 5; i++) {
    /// 脉冲线。
    /// 设置为非活动状态。(低电压=接地)
    line14.setValue(false);
    await Future.delayed(Duration(milliseconds: 500));
    line14.setValue(true);
    await Future.delayed(Duration(milliseconds: 500));
  }
  line14.release();
}

Future _button(List<GpioChip> chips) async {
  print('BUTTON');
  final line =
      chips.singleWhere((chip) => chip.label == 'pinctrl-bcm2835').lines[17];

  line.requestInput(
      consumer: "BUTTON",
      activeState: ActiveState.high,
      triggers: {SignalEdge.falling, SignalEdge.rising});

  /// 永久记录线路事件。
  line.onEvent.listen((event) {
    print("Button: $event");
  });
}

Future _status(List<GpioChip> chips) async {
  for (var chip in chips) {
    print("$chip");

    var index = 0;
    for (var line in chip.lines) {
      final info = line.info;
      if (info.consumer != null) {
        print("$index:  ${line.info}");
      }

      index++;
    }
  }
}

更多关于Flutter GPIO控制插件gpiod的使用的实战教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter GPIO控制插件gpiod的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


在Flutter中,如果你想通过GPIO(通用输入输出)控制硬件设备,可以使用 gpiod 插件。gpiod 是一个用于与Linux GPIO字符设备接口进行交互的库。以下是如何在Flutter中使用 gpiod 插件的基本步骤。

1. 添加依赖

首先,你需要在 pubspec.yaml 文件中添加 gpiod 插件的依赖。

dependencies:
  flutter:
    sdk: flutter
  gpiod: ^0.1.0  # 请检查最新版本

然后运行 flutter pub get 来获取依赖。

2. 导入库

在你的Dart文件中导入 gpiod 库。

import 'package:gpiod/gpiod.dart';

3. 初始化GPIO

在使用GPIO之前,你需要初始化GPIO芯片。

void main() async {
  final gpioChip = GpioChip('gpiochip0');  // 根据你的系统选择合适的GPIO芯片
  await gpioChip.open();
  
  // 使用GPIO
  final gpioLine = gpioChip.getLine(17);  // 选择GPIO引脚,例如GPIO17
  await gpioLine.requestOutput(initialValue: 0);  // 设置为输出模式,初始值为低电平

  // 控制GPIO
  await gpioLine.setValue(1);  // 设置高电平
  await Future.delayed(Duration(seconds: 1));
  await gpioLine.setValue(0);  // 设置低电平

  // 释放资源
  await gpioLine.release();
  await gpioChip.close();
}

4. 控制GPIO

你可以使用 setValue 方法来控制GPIO引脚的电平状态。1 表示高电平,0 表示低电平。

await gpioLine.setValue(1);  // 设置高电平
await Future.delayed(Duration(seconds: 1));
await gpioLine.setValue(0);  // 设置低电平

5. 读取GPIO

如果你需要读取GPIO引脚的状态,可以使用 getValue 方法。

final value = await gpioLine.getValue();
print('GPIO value: $value');

6. 释放资源

在使用完GPIO后,记得释放资源。

await gpioLine.release();
await gpioChip.close();

7. 处理异常

在实际应用中,建议添加异常处理机制,以确保程序的健壮性。

try {
  await gpioLine.setValue(1);
} catch (e) {
  print('Error setting GPIO value: $e');
}

8. 运行应用

确保你的设备支持GPIO,并且你有权限访问GPIO设备。然后运行你的Flutter应用。

flutter run
回到顶部