最近Intel Edisonのお世話になっています。JavaScriptで(ホストPCなしに)センサ・アクチュエータが動くのって本当に素敵ですね!

Intel EdisonやGalileoでは、GPIOなどを操作するためにmraaという低レイヤーな通信用ライブラリを使います。簡単に入手できる有名なセンサ・アクチュエータごとにmraaを使ったコードをライブラリ化し、APIを整備したのがupmです。opkg update && opkg install upmコマンドで最新版をインストールでき、オフィシャルに対応しているすべてのドライバが使えるようになります。

しかしながら、使いたいセンサ・アクチュエータがあるのにupmが対応していないケースがよくあります。そういった場合には、自分でupmを拡張するドライバを開発してGitHubでpull requestを送ることができます。しばらくするとupmにマージされ、そのうちIntel Edisonの初期設定で入るファームウェアでも当該センサ・アクチュエータが使えるようになります。みんな幸せになれますね。

mraaを使ってupmを拡張するための手順は一応すべてGitHubにあがっていますが、もう少し詳しく、日本語で解説してみます。なお、ホストPCでIntel Edison用にドライバをクロスコンパイルすることもできるかもしれませんが、とりあえず手軽に実機での開発方法を紹介します。今のところ、実機でも現実的な時間でコンパイルが終わってすぐ動作確認できるので、とくに問題を感じていません。

Intel Edisonを使ったマイコンアプリケーション開発

opkgでGitをインストール

まずはGitをインストールするために、パッケージマネージャopkgの参照先URLを増やします。(情報元: Edison opkg package repo created)

echo "src/gz all http://repo.opkg.net/edison/repo/all" >> /etc/opkg/base-feeds.conf
echo "src/gz edison http://repo.opkg.net/edison/repo/edison" >> /etc/opkg/base-feeds.conf
echo "src/gz core2-32 http://repo.opkg.net/edison/repo/core2-32" >> /etc/opkg/base-feeds.conf

そのうえで、Gitをインストールします。お手軽。

opkg update
opkg install git

mraaをgit clone, cmake, make install

情報元: Building libmraa

GitHubからソースコード一式を落としてきます。

cd ~/
mkdir github
cd github
git clone https://github.com/intel-iot-devkit/mraa.git

cmakeします。

cd ~/github/mraa/
mkdir build
cd build
cmake -DCMAKE_INSTALL_PREFIX:PATH=/usr ..

make installします。

cd ~/github/mraa/build/
make install

これで開発版のmraaがインストールされます。

環境変数を設定

upmのビルド時に参照される環境変数を設定します。

echo "PKG_CONFIG_PATH=$PKG_CONFIG_PATH:/home/root/github/mraa/build/lib/pkgconfig" >> ~/.profile
echo "CPLUS_INCLUDE_PATH=$CPLUS_INCLUDE_PATH:/home/root/github/mraa/build/include" >> ~/.profile
echo "LIBRARY_PATH=$LIBRARY_PATH:/home/root/github/mraa/build/lib" >> ~/.profile

このあとログインし直さない場合はsource ~/.profileで読み込んでから作業を続けましょう。

upmをgit clone, cmake, make install

情報元: Building UPM

GitHub上で本家upmリポジトリを自分のアカウントにforkしてからソースコード一式を落としてきます。forkしておかないと後々git pushできないので要注意です。

cd ~/github/
git clone https://github.com/arcatdmz/upm.git

cmakeします。僕はPythonを使わないので-DBUILDSWIGPYTHON=OFFオプションをつけています。

cd ~/github/upm/
mkdir build
cd build
cmake -DBUILDSWIGPYTHON=OFF -DCMAKE_INSTALL_PREFIX:PATH=/usr ..

ここまではmraaと一緒ですが、このあとそのままmake installするとけっこう時間がかかります。全ドライバをビルドするためです。

cd ~/github/upm/build/
make install

必要なドライバだけビルドするためには、そのサブフォルダに入ってmake installします。

cd ~/github/upm/build/src/grovecircularled/
make install

ビルド方法が分かったので、あとはドライバを書くだけですね!

upmを拡張する

情報元: Making a UPM module for MAX31855

upm/src/の中に新しいディレクトリを作ってC++のソースコードを書けばupmを拡張できます。例えば groveultrasonic: Initial implementation を見てみてください。これは、Groveの超音波測距センサを使えるようにしたドライバのpull requestです。

具体的には次のようにしてソースコードを書いていきます。

cd ~/github/upm/build/src
mkdir groveultrasonic
cd groveultrasonic
vi groveultrasonic.cxx

使えるAPIはmraaのドキュメントを見てみてください。

また、PythonやNode.js用のモジュールを作るため、C++のソースコード以外にもいくつかファイルが必要になります。初めは似た処理をしているドライバのディレクトリをコピーして、それを改変していくのがいいと思います。なお、ディレクトリ名はそのままドライバ名になります。(cf. 命名規則)

examples/c++/CMakeList.txt
C++用のサンプルコードをビルドするための情報が書いてある。
examples/c++/{modname}.cxx
C++用のサンプルコードを書く。MITライセンスの文面を忘れないように。//! [Interesting]で囲んだ範囲はサンプルコードとしてAPIリファレンスに転載される。
examples/{langname}/{modname}.py
{JavaScript,Python,Java}用のサンプルコードを書く。MITライセンスの文面を忘れないように。
src/{modname}/CmakeLists.txt
cmake用の設定を書く。ほぼコピペでよい。
src/{modname}/{modname}.{cxx,h}
C++でドライバを書く。本体。MITライセンスの文面を忘れないように。
src/{modname}/{js,py}upm_{modname}.i
JavaScript, Pythonバインディングのための設定ファイル。ほぼコピペでよい。

本家upmにpull requestを送る

ファイルが揃ったらgit commit --signoffします。--signoffオプションをつけることでupmへの貢献に関する規約に同意したとみなされます。

あとはforkした自分のリポジトリへgit pushして、GitHub上でpull requestを送ればそのうち本家に取り込まれるかもしれません。


One Response to “Intel Edisonで新しいセンサ・アクチュエータを使うためのドライバ開発”

  1. Norihisa Segawa

    色々、参考になります。(クロス開発環境の構築がなぜができない。。。)

    返信

Leave a Reply to Norihisa Segawa

  • (will not be published)