前々から、Node-REDで使えるGroveノードを作りたいなーと思っている話を先日のNode-RED UG Tokaiで話したところ、
www.slideshare.net
わりと「いいんじゃね?」という感じだったので、Johnny-FiveとMRAAを比較して、
www.slideshare.net
よっしゃMRAAでやろう!となり、Raspberry PiにMRAA入れるところで盛大に苦労したので、ブログに書いておこうと思う。
やりたいこと
Raspberry Piで、Node-REDから(Node.jsから)呼び出しできるようMRAAをインストールする。
もやもや
apt install mraaみたいにサクッとインストールを期待していたのですが、、、MRAAのパッケージ無い。
Debian -- Package Search Results -- mraa
npmでMRAAありましたが、Node.js 7以降は未サポートorz
SeeedのパッケージリポジトリにMRAAありましたが、Node.js入っていないっぽい。&バージョン古いっぽい。
GitHub - Seeed-Studio/pi_repo: Package Repository for Raspberry Pi
仕方ないので、ここを見ながらソースをコンパイルし始めたのだが、、、まぁ、コンパイルが通らないわけです。
Build failure with Node.js 12.x · Issue #969 · intel-iot-devkit/mraa · GitHub
SWIG support for NodeJS v12 · Issue #1520 · swig/swig · GitHub
Node.jsのバージョンを変え、SWIGのバージョンを変え、SWIGにパッチ当てたり当てなかったりと、あれこれ試した結果、下記手順で動かすことができました。
Raspberry PiでMRAAを使えるようにする for Node.js
OSイメージは現時点最新の2019-09-26-raspbian-buster-lite.img。
とりあえず、パッケージを最新にしておきます。
sudo apt update sudo apt upgrade
nodesourceで、Node.js v10をインストールします。(参考)
最新のv12はダメ。SWIGが対応していない。
aptで入れるのはダメ。nodesourceで入れておかないと、Raspberry Pi用Node-REDスクリプトでアンインストールされてしまうので。
sudo sh -c 'curl -sL https://deb.nodesource.com/setup_10.x | bash -' sudo apt-get install -y nodejs
この時点の、nodeとnpmのバージョンはこれでした。
$ node -v v10.17.0 $ npm -v 6.11.3
MRAAのコンパイルに必要なパッケージをインストールします。(参考)
nodejs-devは無くてOK。(busterだとlibnode-devなんだけど、あえて入れなくても大丈夫だった。)
sudo apt-get install git build-essential swig3.0 python-dev cmake libjson-c-dev python3-dev
この時点の、SWIGは3.0.12-2。
$ dpkg -l | grep swig3.0 ii swig3.0 3.0.12-2 armhf Generate scripting interfaces to C/C++ code
SWIGに、Node.js V7以降のパッチを適用します。
wget https://git.yoctoproject.org/cgit.cgi/poky/plain/meta/recipes-devtools/swig/swig/0001-Add-Node-7.x-aka-V8-5.2-support.patch cd /usr/share/swig3.0 sudo patch -p2 <~/0001-Add-Node-7.x-aka-V8-5.2-support.patch cd
MRAAをコンパイル。
git clone https://github.com/intel-iot-devkit/mraa cd mraa mkdir build cd build cmake .. make
MRAAをインストール。
共有ライブラリが増えたので、ldconfigも実行します。
sudo make install sudo ldconfig
Node.jsから使えるようにシンボリックリンクを作成します。
mkdir ~/node_modules ln -s /usr/include/node/lib/node_modules/mraa ~/node_modules/mraa