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

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

-----

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

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

[![ElixirProximitySpinny.png](https://qiita-image-store.s3.amazonaws.com/0/46294/b17c2fe8-2b2d-916e-e091-784bb50a74b5.png)](https://vimeo.com/151323242)

[ElixirProximitySpinny](https://vimeo.com/151323242) from [Wendy Smoak](https://vimeo.com/user1032254) on [Vimeo](https://vimeo.com/)


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

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

 - Raspberry Pi 2 Model B
 - Adafruit PWM/Servo HAT
 - FiTech FS5103R 持続回転サーボ
 - VCNL4010 近接センサー
 - 5V 2A 電源 ×2
 - ヘッダピン
 - メス-メスのジャンパー線
 
残りの2本の線はHDMIとOurlinkワイヤレスアダプタが刺してある電源付きUSBハブに繋がるUSBです。この例では不要です。

この[Adafruitのウィッシュリスト](https://www.adafruit.com/wishlists/386047)がパーツリストです。見ての通り既に100ドルを超えているのにまだ何の役にも立たない状態です！きっともっと安いパーツで済んだはず…。

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

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

私が最初に[Nerves](http://nerves-project.org/)を知ったのはElixirConf 2015での[Garth Hitchen](https://twitter.com/ghitchens)の[実践組み込みElixir(Embedded Elixir In Action)]( https://www.youtube.com/watch?v=kpzQrFC55q4)トークによってです。もし今までNervesについて聞いたことがないのならこのトークを見てください。待っててあげますから。

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

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

Raspberry Pi上で直接開発していたプロジェクトを基にして私は[ソースをMac上にクローン](https://github.com/wsmoak/cat_feeder)して[www.bakeware.io](http://www.bakeware.io/):上の手順に従いました。

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

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

```bash
$ 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 `を付けずに済むようになります。

```ex
use Bake.Config

platform :nerves
default_target :rpi2

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

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

```bash
$ bake system get
$ bake toolchain get
```

ファイルがホームディレクトリの`~/.nerves`以下にダウンロードされたことにお気づきになると思います。正確にはそこに何が含まれるのか、どのように生成されるのかを示すドキュメントは見つけられなかったのですが、これでオーケーのはずです[^1]。
[^1]: npmで-gオプション付きの場合と似てるのかもしれませんね。

4: ターゲットプラットフォームのためのあなたのプロジェクトのコードを含んだファームウェアをコンパイルします。繰り返しますがデフォルトのターゲットプラットフォームは自動的に選択されます。

```bash
$ bake firmware
```

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

```bash
$ 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のウェブサイトの[説明](https://www.raspberrypi.org/documentation/installation/installing-images/mac.md)を見てください。いいニュースですが[@fhunleth](https://twitter.com/fhunleth)さんがその辺りの手間を簡単にする`fwup`(firmware update)というツールを書いてくださいました。ただひとつ、micro-SDカードをマウントして上書きするために権限を昇格させる[^2]という点だけがちょっとした技になっています。

[^2]: sudo

```bash
$ sudo fwup -a -i _images/cat_feeder-rpi2.fw -t complete
```
これでmicro-SDカード上にそのままRPiに挿せるちゃんとしたイメージが焼きこまれました。

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

[![ElixirProximitySpinnyBoot](https://qiita-image-store.s3.amazonaws.com/0/46294/c7c738b7-a3be-99e8-1a67-6fd0d6bd196f.png)](https://vimeo.com/151345328)

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

もっと知りたくなりましたか？ElixirのSlackチームに[インビテーションをリクエストすれば](https://elixir-slackin.herokuapp.com/)#nerves及び#roboticsチャンネルに私たちはいます。[Nerves Google Group](https://groups.google.com/forum/#!forum/nerves-project)もありますが閑散としちゃってます[^3]。

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

さて、サーボで何か回してキャットフードを供給しないといけません。私が着目しているのは[Thingiverse](https://www.thingiverse.com/)の[Augur-based Cat Feeder](http://www.thingiverse.com/thing:27854)プロジェクトですが、[こういう代用品](https://www.sephra.com/accessories-parts/plastic-auger-for-select-cf16e.html)か何かを[Sephra chocolate fountain](https://www.sephra.com/)で買っちゃったほうが早い気もしますね。

Copyright 2016 Wendy Smoak - This post first appeared on [http://wsmoak.net](http://wsmoak.net) and is [CC BY-NC](http://creativecommons.org/licenses/by-nc/3.0/) licensed.

---