はじめに
ElixirとNervesでRaspberry Piを氣樂にやってみましょう!
とりあえずRaspberry Piを買ってみたものの、何から始めていいのか分からず戸惑ってしまう方もいらっしゃると思います。僕もそうでした。
Raspberry Piは汎用コンピュータなので、いろんな方々が多様な形で楽しんでいます。選択肢が多いだけに決断ができないと何も始まりません。
僕はたまたま Elixirプログラミングが大好きだったので、迷わず ElixirとNervesでRaspberry Piを樂しむことにしました。
ElixirとNervesでRaspberry Piと聞くと一般に世の中に出回っているRaspberry Pi関連の情報にはあまり登場しないので、一見怖そうに見えるかもしれません。
しかしながら、Nervesは、オープンソースの自由ソフトウェアプロジェクトであり、Nerves コアチームのメンバーが実際に本番環境で使用しているので、その知見に基づいたおススメの設定や開発環境が漏れなく手に入るという点で大変コスパが良いと言えます。初見のプログラマーや組み込み技術者でも最低限の設定やコーディングで高度な組み込みシステムの構築ができてしまいます。
また、組み込みシステムの構築だけに特化されているので、そこに集中して取り組めます。
特にElixirプログラミング言語をやったことがある人はすぐにでも取り掛かれるでしょうし、まだElixirを試したことがない方にとっても、ElixirやErlang 仮想マシン (BEAM)について知る良い機会になると信じています。
さらに最近は、Nerves Livebookという予めビルドされたファームウェアが公開されているので、それをダウンロードしてmicroSD カードに焼くだけで簡単に氣樂にNervesを樂しめるようになりました。Livebook のノートブック上でコードを実際に実行しながら進められるので、ブラウザーで快適に 楽しくNerves を学べます。
Nerves(なあぶす)とは
- ElixirとErlang 仮想マシン (BEAM)を活用して高度な組み込みシステムを構築する新しい手法を定義
- デスクトップやサーバーシステムではなく、組み込みシステム向けに特化
- 基盤(platform)、枠組(framework)、道具(tooling) の 3 要素で成り立っている
構成要素 | 説明 |
---|---|
基盤 | Erlang 仮想マシン (BEAM)を直接起動する、最小限の Linux |
枠組 | 開発を効率よく行うための便利な関数を備えた Elixir モジュール |
道具 | ビルドの管理、ファームウェア の更新、デバイスの構成などを行うためのコマンドラインツール |
Qiita でも検索してみてください。
本や動画もあります。
是非お気軽に Nerves JP コミュニティーにお立ち寄りください!
英語が大丈夫な方には英語のコミュニティもあります。
Nerves Livebook とは
Nerves Livebookを使用すると、何も構築せずに実際のハードウェアで Nerves プロジェクトを試すことができます。
Livebook のノートブック上でコードを実際に実行しながら進められるので、ブラウザーで快適に 楽しくNerves を学べます。例えば、ブラウザ上でターゲットデバイスの Wi-Fi の設定ができます。
用語
用語 | 定義 |
---|---|
母艦マシン(host) | ソースコードの編集、ファームウェア のコンパイル、組立を行うコンピュータ |
ターゲット(target) | ファームウェア を構築する対象の機種 (例、Raspberry Pi Zero W、Raspberry Pi 4、Beaglebone Black など) |
ツールチェーン(toolchain) | コンパイラ、リンカー、binutils、C ランタイムなど、ターゲットのコードを構築するために必要なツール |
システム(system) | 特定のターゲット向けにカスタマイズおよびクロスコンパイルされた、無駄のない Buildroot ベースの Linux ディストリビューション |
ファームウェアバンドル(firmware bundle) | ファームウェア を焼くために必要なものすべてを含む単一のファイル |
ファームウェアイメージ(firmware image) | ファームウェアバンドル から構築される。パーティションテーブル、パーティション、ブートローダなどがここに含まれる。 |
最小要件
- 母艦マシン
- macOS、Linux、または Windows
- Linux を実行できるハードウェア (ターゲット)
-
microSD カード
- ターゲットデバイスに挿入するファームウェア記憶媒体
-
SD カードリーダー
- ファームウェアをmicroSD カードに焼く(burn)時に使用
- 母艦マシン に SD カードスロットがついている場合は不要
- 電源供給ケーブル
- ターゲットデバイスに電源を供給
- ない場合は USB ケーブルで代用可能
-
USB ケーブル(任意)
- ターゲットデバイスに電源を供給
- Raspberry Pi Zero、Raspberry Pi 4、Beagleboneを使用する場合は、ネットワーク接続にも使用可能
-
LAN ケーブル(任意)
- ターゲットデバイスにネットワーク接続
-
USB to TTL シリアルケーブル(任意)
- 直接ターゲットデバイスとシリアル通信するのに使用
USB ケーブルには見た目では分かりにくいですが、色んな種類(充電用、データ転送用など)があります。うまくいかない場合は、ケーブルを取り替えるだけで解決する場合があります。
コネクタの形状も多数存在します。お使いのデバイスのコネクタに合うものを入手してください。
母艦マシン
Nerves は、主に、macOS および様々な Linux ディストリビューション で使用されています。
Windows ユーザーの場合、仮想機械で Linux を実行したり、Linux 用 Windows サブシステムを使用したりして環境構築します。
Nerves Livebook の準備
有志の方々が Nerves Livebook のセットアップ方法ついてのビデオやコラムを制作してくださっています。ありがとうございます。
fwup をインストール
fwup は、ファームウェアイメージをmicroSD カードに焼いたりするのに使うコマンドラインユーティリティです。
母艦マシン の OS によりインストール方法が異なるので、ドキュメントをご参照ください。
ファームウェアイメージをダウンロード
まずはNerves Livebook Releasesページで、お手持ちのターゲットデバイスに対応するファームウェアイメージ(.fw
ファイル)をダウンロードします。例として、ターゲットがRaspberry Pi 4の場合にはnerves_livebook_rpi4.fw
をダウンロードします。
ファームウェアを microSD カードに焼く
ターゲットデバイス向けのファームウェアはデバイスに差し込まれたmicroSD カードから起動します。今からそのmicroSD カードを準備します。
先ほどダウンロードしたファームウェアイメージの存在するディレクトリに移動し、fwup を使用してファームウェアをmicroSD カードに焼きます。
fwup nerves_livebook_rpi4.fw
Use 15.84 GB memory card found at /dev/rdisk2? [y/N] y
Depending on your OS, you'll likely be asked to authenticate this action. Go ahead and do so.
|====================================| 100% (31.81 / 31.81) MB
Success!
Elapsed time: 3.595 s
fwupを実行するとmicroSD カードがフォーマットされ、microSD カード上のすべてのデータが失われますのでご注意ください。
環境変数NERVES_WIFI_SSID
、NERVES_WIFI_SSID
をセットすることにより、前もって WiFi 認証情報も一緒に microSD カードに書き込んでおくことができます。
ターゲットデバイスへの接続方法
ターゲットデバイスへの接続方法は複数考えられます。
- LAN ケーブル (イーサネット)
- USB ケーブル (USB ガジェットモード)
- USB to TTL シリアルケーブル (UART)
- Wi-Fi (無線 LAN)
お使いのターゲットデバイスによりサポートされている接続方法が異なります。
Nerves System | Gadget Mode | UART | Ethernet | Wi-Fi | |
---|---|---|---|---|---|
Raspberry Pi Zero | rpi0 | ✓ | ✓ | x | x |
Raspberry Pi Zero W | rpi0 | ✓ | ✓ | x | ✓ |
Raspberry Pi Zero 2 W | rpi3a | ✓ | ✓ | x | ✓ |
Raspberry Pi 3 Model B | rpi3 | x | ✓ | ✓ | ✓ |
Raspberry Pi 4 Model B | rpi4 | ✓ | ✓ | ✓ | ✓ |
BeagleBone-based boards | bbb | ✓ | ✓ | ✓ | ✓ (機種により USB WiFi ドングルが必要) |
MangoPi MQ Pro | mangopi_mq_pro | ✓ | ✓ | x | ✓ |
Wi-Fi での接続がうまくいかない事態に備え、他の通信方法ができるよう準備しておくと良いです。
USB ガジェットモードに対応しているデバイスをご使用の場合は、USB ケーブルを電源供給とネットワークの両方に利用できます。USB On-The-Go (OTG)ポートに接続するよう注意してください。
ファームウェアを起動
microSD カードをターゲットデバイスに挿入します。そしてデバイスの電源を入れます。
ノートブックを保存するためのデータファイルシステムを初期化するため、最初の起動はその後の起動よりも時間がかかることがあります。 特に大きな microSD カードで顕著です。
サポートされているほとんどのデバイスには LED が付いています。 Nerves Livebook では、ネットワークが切断されると点滅し、ネットワーク インターフェイス経由で接続できる場合は点灯に変わります。
ブラウザで Nerves Livebook にアクセス
デバイスの準備ができたら、ブラウザで http://nerves.local
にアクセスします。 パスワードはnerves
です。
同一のネットワーク上で複数の Nerves デバイスをご使用の場合はhttp://nerves.local
の代わりに、http://nerves-<シリアル番号の下四桁local
をお試しください。シリアル番号は、以下コマンドで入手できます。
cmd("boardid")
Nerves.Runtime.KV.get("nerves_serial_number")
ファームウェアをmicroSD カードに焼く時点で環境変数NERVES_SERIAL_NUMBER
に任意のシリアルナンバーを指定することもできます。
後は、Nerves Livebookを樂しむだけです。
例えば、ノートブック上でWi-Fiの設定をしてみてはいかがでしょうか。
戸惑うことがあっても大丈夫です。コミュニティの仲間と一緒に樂しみましょうよ。
さいごに一言
本記事は 闘魂 Elixir #67 の成果です。ありがとうございます。