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

投稿者: 加藤 淳
投稿日:
カテゴリ: programming

最近 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 を送ればそのうち本家に取り込まれるかもしれません。