Armadilloフォーラム

コンテナ内のNodeJS(JavaScript)からのGPIO制御について

secual-mu

2024年5月27日 15時24分

U-Boot 2020.04-at21
Alpine Linux 3.19
Kernel 5.10.215-0-at on an armv7l (/dev/ttymxc2)
Dockerfileで指定のイメージ:docker.io/${ARCH}/debian:bullseye-slim
参照しているマニュアル:armadillo-iotg-a6e_product_manual_ja-2.9.0.pdf

コンテナ内のNodeJS(JavaScript)からGPIO制御(CON6のピン6/7を接点出力として利用)を実施したいと考えております。
現在、上記マニュアルを拝見し、環境構築/設定/インストール/動作確認を実施しております。(ピン番号/ピン名/GPIOチップ/GPIO番号は3.6.8.2を確認しております)

以下のサンプルソース(C言語)を利用し動作確認する限りは問題なく動作しております。

Armadillo Base OS:コンテナでC言語でGPIOを操作する方法 | Armadilloサイト
https://armadillo.atmark-techno.com/blog/15349/17313

よってコンフィグのadd_devices /dev/gpiochip5などの設定は問題なしと判断しています。(指定がないと上記サンプルもSegmentation faultとなり動作しないことも確認済み)

次にJavaScriptで試すために以下のサンプルを実装し実行しましたが、正常にシリアル通信が行えていないようです。(このサンプル以外にコマンド実行やその結果を取得するサンプルを実装し、node sample.jsなどとすることで正常に稼働していることは確認済みです)

サンプル(JavaScript)

const Gpio = require('onoff').Gpio;
const line_out = new Gpio(2, 'high'); // DO1
let loop = 0;
function controlDO1() {
    if (loop < 5) {
        if (loop % 2 === 0) {
            line_out.write(1, (err) => {
                console.log("DO1: High : err=", err);
            });
        } else {
            line_out.write(0, (err) => {
                console.log('DO1: Low : err=', err);
            });
        }
 
        setTimeout(() => {
            loop++;
            controlDO1();
        }, 5000);
    } else {
        line_out.unexport();
        console.log('GPIO pin cleanup completed');
    }
}
 
controlDO1();

上記サンプルソースコード中のrequire('onoff')のonoffというモジュール内では、以下のコマンド操作相当のことを実行していました。

echo 2 > /sys/class/gpio/export
echo out > /sys/class/gpio/gpio2/direction
 
echo 1 > /sys/class/gpio/gpio2/value
echo 0 > /sys/class/gpio/gpio2/value
 
echo 2 > /sys/class/gpio/unexport

これらのコマンドをコンソールから実行しても正常動作しませんでした。(上記コマンド操作で/sys/class/gpio/gpio2の生成や削除は問題ないようです)

また、3.6.8.3. 使用方法には、"/dev/gpiochipN を渡すと、GPION+1 を"という記述も確認しましたので、/dev/gpiochip5を設定していることからGPIO番号として6を指定し試しもしましたが動作しませんでした。

何か認識不足・誤り等ございますでしょうか?

またJavaScriptでの制御が難しい場合、
・C言語のサンプルをコマンドとして実装し、それをJavaScript側から呼び出し制御する。
・マニュアルにあるgpiosetコマンドを呼び出し制御する。
なども考えておりますが、2点目のgpiosetがコンテナ内からは呼べませんでした。(本体側では呼べるがコンテナ側ではcommand not foundになります)

こちらの解決方法もございましたらご教示いただけますと幸いです。

Reading package lists... Done
Building dependency tree... Done
Reading state information... Done
E: Unable to locate package libgpiod
root@df6e778bce53:/vol_app/src# apt install libgpiod2
Reading package lists... Done
Building dependency tree... Done
Reading state information... Done
libgpiod2 is already the newest version (1.6.2-1).
0 upgraded, 0 newly installed, 0 to remove and 0 not upgraded.
root@df6e778bce53:/vol_app/src# gpioset
bash: gpioset: command not found
root@df6e778bce53:/vol_app/src# g
g++                      gcov-dump                getopt                   gpgv                     gtk-encode-symbolic-svg
g++-10                   gcov-dump-10             getopts                  gprof                    gtk-launch
gcc                      gcov-tool                getpcaps                 grep                     gtk-query-settings
gcc-10                   gcov-tool-10             getty                    groupadd                 gtk-update-icon-cache
gcc-ar                   gdk-pixbuf-csource       git                      groupdel                 gunzip
gcc-ar-10                gdk-pixbuf-pixdata       git-receive-pack         groupmems                gyp
gcc-nm                   gdk-pixbuf-thumbnailer   git-shell                groupmod                 gzexe
gcc-nm-10                gencat                   git-upload-archive       groups                   gzip
gcc-ranlib               genl                     git-upload-pack          grpck
gcc-ranlib-10            getcap                   gmake                    grpconv
gcov                     getconf                  gold                     grpunconv
gcov-10                  getent                   gpasswd                  gtk-builder-tool
コメント

at_reika.yamazaki

2024年5月27日 19時27分

お世話になっております。
山崎です。

sysfs 経由で GPIO の設定を変更することは現在非推奨となっております。
そのため、基本的には libgpiod をご使用ください。
nodejs では以下の npm パッケージがご利用になれると思います。

・node-libgpiod
https://www.npmjs.com/package/node-libgpiod

こちらのサンプルコードを参考にして、試していただけますと幸いです。
以上、どうぞよろしくお願いいたします。

早速のご回答誠にありがとうございます。
無事、C言語のサンプルと同じ挙動になることを確認いたしました。