見出し画像

Node-REDからJetson NanoのGPIOを操作できるようにしてみた。

Node-REDからJetson NanoのGPIOを操作するためのノードを探したのですが、見つからなかったのでノードを自作しようと思い、いろいろと調査していくとPythonのJetson.GPIOライブラリはRPi.GPIOライブラリ互換という記載を見つけました。

The library has the same API as the RPi.GPIO library for Raspberry Pi in order to provide an easy way to move applications running on the Raspberry Pi to the Jetson board.

Node-REDのRPi gpioノードはPythonのRPi.GPIOライブラリを利用しているので、Jetson NanoのGPIOもそのまま利用できるのではないか、と仮説を立てました。
結論から先に言うと、少しごにょごにょすると利用できました!
(もちろん、そのままでは利用できません。)

Node-REDを起動するとRPi gpioノードのエラー(WARN)がログに出力されます。

[warn] ------------------------------------- context=service.node-red
[warn] [node-red/rpi-gpio] Info : Ignoring Raspberry Pi specific node

当然ですね。node-red/rpi-gpioの実態はnrgpioというPythonスクリプトです。

/usr/lib/node_modules/node-red/nodes/core/hardware/nrgpio
または
/usr/local/lib/node_modules/node-red/nodes/core/hardware/nrgpio

nrgpioは同じディレクトリの36-rpi-gpio.jsから起動されますが、36-rpi-gpio.jsの中でラズパイかどうかを/proc/cpuinfoの情報を参照して判定しており、その判定に失敗して先ほどのエラー(WARN)が出力されています。

var cpuinfo = fs.readFileSync("/proc/cpuinfo").toString();
if (cpuinfo.indexOf(": BCM") === -1) { throw "Info : "+RED._("rpi-gpio.errors.ignorenode"); }

ラズパイ(Raspberry Pi 3 Model B)の/proc/cpuinfoの情報を参照するとBCMの情報が含まれていますが、Jetson Nanoには含まれていないことが確認できます。

(ラズパイ)

$ cat /proc/cpuinfo 
processor	: 0
model name	: ARMv7 Processor rev 4 (v7l)
BogoMIPS	: 38.40
Features	: half thumb fastmult vfp edsp neon vfpv3 tls vfpv4 idiva idivt vfpd32 lpae evtstrm crc32 
CPU implementer	: 0x41
CPU architecture: 7
CPU variant	: 0x0
CPU part	: 0xd03
CPU revision	: 4

processor	: 1
model name	: ARMv7 Processor rev 4 (v7l)
BogoMIPS	: 38.40
Features	: half thumb fastmult vfp edsp neon vfpv3 tls vfpv4 idiva idivt vfpd32 lpae evtstrm crc32 
CPU implementer	: 0x41
CPU architecture: 7
CPU variant	: 0x0
CPU part	: 0xd03
CPU revision	: 4

processor	: 2
model name	: ARMv7 Processor rev 4 (v7l)
BogoMIPS	: 38.40
Features	: half thumb fastmult vfp edsp neon vfpv3 tls vfpv4 idiva idivt vfpd32 lpae evtstrm crc32 
CPU implementer	: 0x41
CPU architecture: 7
CPU variant	: 0x0
CPU part	: 0xd03
CPU revision	: 4

processor	: 3
model name	: ARMv7 Processor rev 4 (v7l)
BogoMIPS	: 38.40
Features	: half thumb fastmult vfp edsp neon vfpv3 tls vfpv4 idiva idivt vfpd32 lpae evtstrm crc32 
CPU implementer	: 0x41
CPU architecture: 7
CPU variant	: 0x0
CPU part	: 0xd03
CPU revision	: 4

Hardware	: BCM2835
Revision	: a32082
Serial		: 00000000XXXXXXXX
(Jetson Nano)

$ cat /proc/cpuinfo 
processor	: 0
model name	: ARMv8 Processor rev 1 (v8l)
BogoMIPS	: 38.40
Features	: fp asimd evtstrm aes pmull sha1 sha2 crc32
CPU implementer	: 0x41
CPU architecture: 8
CPU variant	: 0x1
CPU part	: 0xd07
CPU revision	: 1

processor	: 1
model name	: ARMv8 Processor rev 1 (v8l)
BogoMIPS	: 38.40
Features	: fp asimd evtstrm aes pmull sha1 sha2 crc32
CPU implementer	: 0x41
CPU architecture: 8
CPU variant	: 0x1
CPU part	: 0xd07
CPU revision	: 1

processor	: 2
model name	: ARMv8 Processor rev 1 (v8l)
BogoMIPS	: 38.40
Features	: fp asimd evtstrm aes pmull sha1 sha2 crc32
CPU implementer	: 0x41
CPU architecture: 8
CPU variant	: 0x1
CPU part	: 0xd07
CPU revision	: 1

processor	: 3
model name	: ARMv8 Processor rev 1 (v8l)
BogoMIPS	: 38.40
Features	: fp asimd evtstrm aes pmull sha1 sha2 crc32
CPU implementer	: 0x41
CPU architecture: 8
CPU variant	: 0x1
CPU part	: 0xd07
CPU revision	: 1

36-rpi-gpio.jsを修正し、この判定をスキップする(/proc/versionの情報を参照してJetsonだと判定させる)ことでnrgpioを起動させることにしました。

$ cat /proc/version
Linux kitazaki 4.9.140-tegra #1 SMP PREEMPT Wed Mar 13 00:32:22 PDT 2019 aarch64 aarch64 aarch64 GNU/Linux
$ diff 36-rpi-gpio.js 36-rpi-gpio.js_org 
11,12c11,12
<         var cpuinfo = fs.readFileSync("/proc/version").toString();
<         if (cpuinfo.indexOf("-tegra ") === -1) { throw "Info : "+RED._("rpi-gpio.errors.ignorenode"); }
---
>         var cpuinfo = fs.readFileSync("/proc/cpuinfo").toString();
>         if (cpuinfo.indexOf(": BCM") === -1) { throw "Info : "+RED._("rpi-gpio.errors.ignorenode"); }

また、PythonのRPi.GPIOライブラリおよびJetson.GPIOライブラリのインストール、Node-REDを起動するユーザ(下記の例ではenebular)へGPIOを操作できる権限を付与します。

$ sudo apt install python-pip python-rpi.gpio
$ pip install Jetson.GPIO

$ sudo groupadd -f -r gpio
$ sudo usermod -a -G gpio enebular
$ sudo cp /opt/nvidia/jetson-gpio/etc/99-gpio.rules /etc/udev/rules.d/
$ reboot

Node-REDを起動した後、rpi gpioノードを使用してJetson GPIOを操作できればOKです。(下記の例はrpi gpioとダッシュボード機能を利用してブラウザからLチカを試しています。)

良き Node-RED、Jetson GPIO ライフを!


この記事が気に入ったらサポートをしてみませんか?