[翻訳] NervesとBakeを使った組み込みElixir


Wendy Smoakさんの2016年1月11日付のブログ記事Embedded Elixir with Nerves and Bakeの翻訳です。なおオリジナル記事はクリエイティブ・コモンズCC BY-NCでライセンスされています。
Wendyさんはここのところ続けてRaspberry Piで制御する「自動猫エサやり機(Automated Cat Feeder)の投稿を続けています。本記事はその最新版です。


ということで自動猫エサやり機のためのこのコードとハードウェアを組み合わせるところまできました。再現性の高いRaspberry Piインストール用のリリースを作るには、について見てみましょう。

前回の投稿では私は近接センサーとサーボを別々に使っていましたが、そこからしばらくたって今は一つに繋げています。

ElixirProximitySpinny from Wendy Smoak on Vimeo

そのためにはもう少しピンをServo HATにハンダ付けし、メス-メスのジャンパー線で近接センサーを取り付けます。

ビデオに出てくるパーツは以下のとおり。

  • Raspberry Pi 2 Model B
  • Adafruit PWM/Servo HAT
  • FiTech FS5103R 持続回転サーボ
  • VCNL4010 近接センサー
  • 5V 2A 電源 ×2
  • ヘッダピン
  • メス-メスのジャンパー線

残りの2本の線はHDMIとOurlinkワイヤレスアダプタが刺してある電源付きUSBハブに繋がるUSBです。この例では不要です。

このAdafruitのウィッシュリストがパーツリストです。見ての通り既に100ドルを超えているのにまだ何の役にも立たない状態です!きっともっと安いパーツで済んだはず…。

ここに至るまで私はRPi2上で開発を続けてきました。キーボードとモニタを繋いでみたり、SSHで通信してみたり。これがRPi2を何か始めるためのプラットフォームとして優れたものにしているのですが、本当に組み込みのアプリについてはいつも最適解とは言えません。

リモート開発に加え、私はインストールするためのビルドリリースを再現性高く作る方法を探していました。ここでNervesとBake(とexrmとbuildrootとerlinit他多数の裏方もですが)の出番です。

私が最初にNervesを知ったのはElixirConf 2015でのGarth Hitchen実践組み込みElixir(Embedded Elixir In Action)トークによってです。もし今までNervesについて聞いたことがないのならこのトークを見てください。待っててあげますから。

NervesとBakeは仮想マシンのメンテやターゲットプラットフォームのためのクロスコンパイルの苦労なしに組み込みデバイスのファームウェアをビルドするためにあります。

ほんのいくつかのコマンドでツールチェインやシステムを復帰させたりファームウェアイメージを作成してそれをSDカードに書きだせます。そのSDカードはRPiに挿すことができます。

Raspberry Pi上で直接開発していたプロジェクトを基にして私はソースをMac上にクローンしてwww.bakeware.io:上の手順に従いました。

注: この投稿は1月12日付けのbake 0.1.0に合わせて更新されています。Bakeプロジェクトは今もすごい速さで更新されているのでもし動かなかった場合はBakewareを見て更新事項を確認してください。

1: まずBakeをインストールします。コピペしてダウンロードと実行をするまえにスクリプトを把握してさらに見なおしておくことをおすすめします。少し読めばこれがbakefwupsquashfsをインストールすることがわかるはずです。現時点ではこれはRubyスクリプトですが、最終的にはElixirに変換されるでしょう。

$ wget https://bakeware.herokuapp.com/bake/install
# インストールされる中身のファイルを精査してから進みましょう:
$ ruby -e "$(curl -fsSL https://bakeware.herokuapp.com/bake/install)" 

注:現時点ではMacのみ対応。LinuxとWindowsへの対応予定。

2: プロジェクトのルートにBakefileを追加します。この場合ターゲットになるプラットフォームはただ一つRaspberry Pi2だけです。Bakefile内のdefault_targetを指定することで各コマンドに--target rpi2を付けずに済むようになります。

use Bake.Config

platform :nerves
default_target :rpi2

target :rpi2,
  recipe: {"nerves/rpi2", "~> 0.1"}

3: "system"と"toolchain"をダウンロードします。Bakefileにdefault_targetを含めたので何も指定する必要はありません。一つ以上のターゲットプラットフォームが必要な場合は--target allオプションを各コマンドに付けてください。

$ bake system get
$ bake toolchain get

ファイルがホームディレクトリの~/.nerves以下にダウンロードされたことにお気づきになると思います。正確にはそこに何が含まれるのか、どのように生成されるのかを示すドキュメントは見つけられなかったのですが、これでオーケーのはずです1
4: ターゲットプラットフォームのためのあなたのプロジェクトのコードを含んだファームウェアをコンパイルします。繰り返しますがデフォルトのターゲットプラットフォームは自動的に選択されます。

$ bake firmware

このコマンドで_imageの下に{あなたのプロジェクト名}-{プラットフォーム名}.fwという名前のファイルが生成されます。例えば私の場合だと_images/cat_feeder-rpi2.fwといった感じです。そしてファイルはとても小さいです。LinuxとErlangとElixirとプロジェクトのコードでわずか18MB以下です。

$ ll _images
-rw-r--r--   1 wsmoak  staff  17846793 Jan 10 17:23 cat_feeder-rpi2.fw

このファイルはmicro-SDカードに焼いてRaspberry Piに挿します。

あなた用のmicro-SDカードを焼くのはちょっとしたチャレンジかもしれません。Raspberry Piのウェブサイトの説明を見てください。いいニュースですが@fhunlethさんがその辺りの手間を簡単にするfwup(firmware update)というツールを書いてくださいました。ただひとつ、micro-SDカードをマウントして上書きするために権限を昇格させる2という点だけがちょっとした技になっています。

$ sudo fwup -a -i _images/cat_feeder-rpi2.fw -t complete

これでmicro-SDカード上にそのままRPiに挿せるちゃんとしたイメージが焼きこまれました。

micro-SDカードをRPiに挿せば約5秒で起動してあなたが書いたプログラムが走り出す、という素晴らしい状態になります。

私の見るところほんとにスゴイですねこれは。私は組み込み系プログラマーではありません。スイッチを入れるだけで物事が全てうまく行ったらいいなと思っていました。Nerves及びBakerWareチームの多大な努力によってその通りになったのです!

もっと知りたくなりましたか?ElixirのSlackチームにインビテーションをリクエストすれば#nerves及び#roboticsチャンネルに私たちはいます。Nerves Google Groupもありますが閑散としちゃってます3

さて、サーボで何か回してキャットフードを供給しないといけません。私が着目しているのはThingiverseAugur-based Cat Feederプロジェクトですが、こういう代用品か何かをSephra chocolate fountainで買っちゃったほうが早い気もしますね。

Copyright 2016 Wendy Smoak - This post first appeared on http://wsmoak.net and is CC BY-NC licensed.



  1. npmで-gオプション付きの場合と似てるのかもしれませんね。 

  2. sudo 

  3. 掲示板よりチャットが盛り上がるとは時代ですねえ...