Armadilloフォーラム

FlutterでGPIOを制御したい

k_watanabe

2024年10月3日 17時13分

お世話になっております。

現在Flutterでアプリを作成しておりまして、
そのアプリ内でFlutterを用いて、GPIOを制御したいと考えております。
こちら、可能でしょうか?

ご確認のほど、よろしくお願いいたします。

コメント

佐藤です。

> 現在Flutterでアプリを作成しておりまして、
> そのアプリ内でFlutterを用いて、GPIOを制御したいと考えております。
dart_periphery を使用すれば可能かと思います。

コマンドラインから flutter アプリプロジェクトの下にある app ディレクトリに移動して
以下のコマンドを実行すると使えるようになります。

[ATDE]$ cd <flutterアプリプロジェクト>/app
[ATDE]$ flutter-elinux pub add dart_periphery

API 仕様などは以下を確認してください。
https://pub.dev/packages/dart_periphery

佐藤様

ご回答いただきありがとうございました。

教えていただいたライブラリを使い、LED3を制御してみたいと思い、以下を試してみましたが、うまく動作しませんでした。
var gpio = GPIO(14, GPIOdirection.gpioDirOut);の箇所で止まってしまい、その後printがされなかったので、その部分が問題かなと考えています。
(ピン番号を15に変えたら最後までprintされました)

以下に現状のmain.dartとapp.confのソースコードになります。
こちらどこが問題でしょうか?
ご確認のほど、よろしくお願いいたします。

main.dart

import 'dart:io';
 
import 'package:dart_periphery/dart_periphery.dart';
 
void main() {
  var config = GPIOconfig.defaultValues();
  config.direction = GPIOdirection.gpioDirOut;
  print('Native c-periphery Version :  ${getCperipheryVersion()}');
  print('GPIO test');
  var gpio = GPIO(14, GPIOdirection.gpioDirOut);
 
  print('GPIO info: ${gpio.getGPIOinfo()}');
 
  print('GPIO native file handle: ${gpio.getGPIOfd()}');
  print('GPIO chip name: ${gpio.getGPIOchipName()}');
  print('GPIO chip label: ${gpio.getGPIOchipLabel()}');
  print('GPIO chip name: ${gpio.getGPIOchipName()}');
  print('GPIO chip label: ${gpio.getGPIOchipLabel()}');
 
  for (var i = 0; i < 10; ++i) {
    gpio.write(true);
    sleep(Duration(milliseconds: 200));
    gpio.write(false);
    sleep(Duration(milliseconds: 200));
  }
 
  gpio.dispose();
}

app.conf

set_image localhost/{{PROJECT}}:latest
 
add_devices /dev/ttymxc1
 
add_volumes /sys
 
# for gpio
add_devices /dev/gpiochip0
 
# for VPU and NPU
add_volumes /opt/firmware:/opt/firmware:ro
add_devices /dev/dri /dev/galcore
 
# for video decoding
add_devices /dev/mxc_hantro /dev/mxc_hantro_vc8000e /dev/ion
 
# for video
add_hotplugs video4linux
 
# for audio
add_devices /dev/snd
 
# for weston
add_volumes /run/udev:/run/udev:ro
add_hotplugs input
add_devices /dev/tty7
add_args --cap-add=SYS_TTY_CONFIG
 
# set timezone
add_args -e TZ=Asia/Tokyo
 
add_volumes /var/app/rollback/volumes/{{PROJECT}}:/vol_app
add_volumes /var/app/volumes/{{PROJECT}}:/vol_data
 
# Add environment variables set by Atmark Techno.
add_armadillo_env
 
# flutter can fail with success exit code
set_restart always
 
# set network
set_network host
 
# launch flutter app and weston at container startup
set_command sh -c 'flutter_launch > /dev/ttymxc1'

佐藤です。

LED3の制御であればgpioを使う必要はありません。
以下でできるかと思います。

import 'dart:io';
 
import 'package:dart_periphery/dart_periphery.dart';
 
void main() {
  var led = Led('led1');
  try {
    for (var i = 0; i < 10; ++i) {
      var inverse = !led.read();
      led.write(inverse);
      sleep(Duration(milliseconds: 200));
    }
  } finally {
    led.dispose();
  }
}

app.conf には以下を追加してください。

add_volumes /sys

app.conf を編集した後は、再度 [Generate development swu] で development.swu を作成して、
インストールし直してください。