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
コメント
secual-mu
at_reika.yamazaki
2024年5月27日 19時27分
お世話になっております。
山崎です。
sysfs 経由で GPIO の設定を変更することは現在非推奨となっております。
そのため、基本的には libgpiod をご使用ください。
nodejs では以下の npm パッケージがご利用になれると思います。
・node-libgpiod
https://www.npmjs.com/package/node-libgpiod
こちらのサンプルコードを参考にして、試していただけますと幸いです。
以上、どうぞよろしくお願いいたします。