ElixirでIoT開発を始める
はじめに
これは Elixir を用いた IoT 入門記事です。敷居をすごく低くしてますので、今まで IoT してなかった方も是非試してみてください。
ご案内は kochi.ex の kikuyuta です。よろしくおつきあいください。
全体の流れ
今回はボタンを押すとLEDが点灯するようなデバイスを作成してみます。この制御はもちろん Elixir で書きます。これを大まかに以下の流れで実現してみます。
- ハードウェアを準備します。ボタンとLEDとを持ってるデバイスであるコンピュータと、そのコンピュータを仕込んで準備するためのコンピュータを用意します。前者は世間でラズパイと呼ばれる小さなコンピュータを使います。後者はご自身のPCをお使いください。
- ファームウェアを準備します。ファームウェアとは一種のソフトウェアのことで、IoTデバイスであるラズパイがファームウェアのプログラムを実行します。ファームウェアを作成するには PC を使います。一旦 PC で作成したファームウェアを microSD カードに書き込んで、それをラズパイに挿すことでラズパイが実行できるようにします。
- ソフトウェアを実行。ボタンへの動作の状況を受け取ったりLEDを点灯・消灯させたりするアプリケーションとしてのソフトウェアが必要です。今回は、これを最初から上のファームウェアに入れておくことはしません。PC上のwebブラウザでElixirプログラムを作成し、プログラムとその結果をネットワーク経由で受け渡しします。
この資料を最後までクリアするとこんな感じで IoT デバイスがいごくようになります。
https://twitter.com/kikuyuta/status/1687074049250541568
ファームウェアとは
ファームウェア (firmware) という言葉は聞き慣れないかもしれません。IoT や組込系と呼ばれる分野特有の単語です。 ハードウェアに入れ込むソフトウェアは、一旦入れ込んでしまうと容易に変更がききません。一旦ハードウェアに取り込まれると、あたかも最初からそういうハードウェアがあったかの様に振る舞います。このようなソフトウェアは、通常のソフトウェアと比較して変更が容易でないことや、あたかもハードウェアの一部のように扱われることから、ハードウェアとソフトウェアの中間でファームウェアという言い方をします。
構成と特徴
ファームウェアを作成してIoTデバイスを動作させるのにはいくつもの技術的なハードルがあって、そこを越えるのがなかなか大変です。特にハードウェアに慣れてない技術者にとってはこれが厚い壁になります。
今回はこのファームウェアに特徴があります。まず、ファームウェア自体の構築・実装をスマートにする Nerves と呼ばれる Elixir ベースの IoT プラットフォームを使ってます。Nerves はファームウェアの概念を大きく進歩させる技術で、組込みに慣れてないエンジニアの参入障壁を改善する技術です。
そしてさらにこれに、Web 経由で対話的な Elixir プログラミングを可能にする技術である Livebook と、さらに Livebook を Nerves と組合せた Nerves Livebook が登場しました。ラズパイ上に Nerves Livebook を実行させることで、Web から IoT のプログラミングを楽しむことができるようにしたのが今回の仕掛けです。
能書きが長くなりました。以下、習うより慣れろでチャレンジしてみてください。
ハードウェアの準備
まずはハードウェアを準備します。以下を揃えてください。
-
PC(作業用のPCです。ノートPCが良いでしょう)
- 有線LANポートが必要です。無い場合は有線LANコネクタのあるUSBアダプタ経由でもよいです
- microSDカードの読み書きも必要です。これもUSBアダプタ経由で構いません
-
Raspberry Pi 4 Model B(IoTデバイスとして動作させるコンピュータです)
- いわゆるラズパイです。モデルがいくつかありますが 4 B というタイプを選んでください。メモリ容量はどれでも構いません(一番小さな4GBでもいごきます)
-
Raspberry Pi用の電源アダプタ
- ラズパイをはじめて買う方はラズパイ本体と一緒に準備するのを忘れずに。電源スイッチがついているのが便利です。
-
microSDカード(ラズパイを動作させるプログラムを入れておきます)
- 容量は小さくて構いません。4GBでも問題ありません。
- UTPのLANケーブル。PCとラズパイの接続用です。品質はCat5+で十分です。短いものでOK。
-
Grove関連パーツ類(後で詳しく述べます)
- Grove Base Hat for Raspberry Pi: ラズパイボードに乗っけて Grove System を使えるようにします
- Grove Button: Grove で接続できるボタンです。押すとオン、話すとオフのボタンです
- Grove LED: Grove で接続できるLEDです。リンクの先は赤色LEDですが、単色であれば何色でも良いです。
ラズパイ4B
ラズパイは通販で入手できます。今回は 4B というのを使います。
注意しないとならないのは、WiFiとBluetoothが日本の無線規格(いわゆる技適)に適合しているかです。海外通販で調達するとほぼNGです。国内通販・販売代理店で仕様をよく確認して購入しましょう。適合してないものを日本国内で使用してWiFiやBluetoothの電波を出してしまうと電波法違反になります。
なお、半導体の供給不足で2022年はほぼほぼ手に入らず、このところ入手できるようになりましたが、それでもコロナ前よりかなり価格が上がってます。
Grove 関連パーツ
IoT でちょっと遊ぼうとして面倒なのが入出力のデバイスをつなげるところです。ここでは Grove System という Seeed Studio社 のデバイス接続手法を使います。入出力デバイスをコネクタ付きケーブルで本体に接続するだけなので大変簡便です。
Grove の扱いは秋月電子通商やスイッチサイエンスでもありますが、これを書いている時点で今回のパーツを全部いっぺんに集められるのはマルツでした。
マルツで調達
マルツ で揃えるときはこちらを。
Seeed Studio で調達
なお Seeed Studio から購入することも可能です。
ファームウェアの準備
つぎにファームウェア(デバイスに入れこむソフトウェア)を準備します。このファームウェアはすでに仕込んで用意していますので、ダウンロードの上で、microSDカードに書き込んでください。
最初にIoTにふれるときに、このファームウェアまで到達するのに手間がかかり、心が折れてしまいそうになります。今回は準備してあるのを使うことで思いっきり省略ができます。最初に述べたことの繰り返しになりますが、このファームウェアは Nerves Livebook を使ったもので、Elixir による IoT 入門を簡単にできるようにあらかじめ作り込んであります。
microSD カードへの書込みツールを準備する
ファームウェアはラズパイに挿し込むmicroSDカードに書き込んで置く必要があります。ですので、まずは先に書込み用のツールを準備しましょう。ちなみにファームウェアを書きこむことを「焼く」と良く言うので覚えておきましょう。柔らかいソフトウェア(今回は用意してあるファームウェア)を堅いハードウェア(今回はmicroSDカード)に固着させる感じです。
ファームウェアをmicroSDカードに焼くには,以下を用います。
MacやLinux環境ではfwupで、Windows環境ではEtcherを用いることをお勧めします。
ファームウェアの microSD への書込み
書込みのツールが準備できたら、今回使うファームウェアをダウンロードして microSD に書込みます。書込んだ microSD カードは、後でラズパイに装着して実行します。このファームウェアには Nerves Livebook が仕込んでありますので、これをラズパイで動作させることで、Web 経由で IoT プログラミングができるようになります。
書込むツールによってダウンロードするファームウェア形式が異なりますので、以下、ツールごとに紹介していきます。
fwup で書込み
Githubのリポジトリよりv1.0.0のファームウェア nerves_livebook.fw をダウンロードしてください。
microSDを挿入したカードリーダーをPCに接続しておきます。
ダウンロードしたフォルダ/ディレクトリに移動し,
sudo fwup nerves_livebook.fw
を実行します。
管理者権限が求められますので、linux環境ではsudoを使ってください。Windows/WSL環境では権限を求めるウィンドウが表示されるのでOKで進んでください。MacOS で sudo
なしで実行すると管理者権限を持ってるかを確認するポップアップメニューが出てきますので、認証を通過してください。
Etcher で書込み
Githubのリポジトリよりv1.0.0のファームウェアnerves_livebook.img をダウンロードしてください。
microSDを挿入したカードリーダーをPCに接続しておきます。
- Etcherを起動し,「Flash from file」をクリックし,ダウンロードしたファイルを選択
- 「Select target」でmicroSDカードのドライブが表示されていることを確認してチェック
-
「Flash」をクリック
- 権限を求めるウィンドウが表示される場合はYesで
以上で準備は完了です。実際にいごかしてみましょう。
さあやってみよう
まず、入手したハードウェアを組み上げ、さらに microSD を挿して IoT デバイスを作ります。それを Ethernet 経由で接続することで自分の PC から IoT プログラミングができるようになります。具体的な IoT プログラミングとして、今回は以下をやりましょう。
-
なにはともあれ LED を光らせることをやってみます。これは Lチカ と言って IoT の基本の基本です。IoT の
hello world
でもあります。 - つぎにボタン入力を受け取ってみましょう。ボタンを押した状態と離した状態とをプログラム側で検出できるようになります。
- そしてボタンを押すとLEDが点く(離すと消える)プログラムを作成しましょう。
細かい作業は、以下の資料をみて順番にやってみてください。これはハンズオンの現地オフライン参加者向けに作成した資料が元で、この記事用に若干修正したものです。
最終的に出来上がるのは「ボタンを押してLEDが点く」というシンプルなプログラムです。これは GenServer という IoT には欠かせない重要な並行プロセスを司るライブラリを用いています。Elixir/Erlang を特徴づける「プロセスを使ったプログラミング」を体験してください。
まとめ
いかがでしたか。 Elixir の IoT プラットフォームである Nerves についてもっと知りたい・使いたい場合は NervesJP コミュニティへどうぞ。
- いつもはNervesJP の slackでワイガヤしてます
- イベントはNervesJP の connpass チャンネル でご案内します
より先に進むには以下の資料などを参考にしてください。
参考文献
さらなる深みにはまるには以下を御覧ください。
- ここで用いたスライドは日本ソフトウェア科学会第39回大会チュートリアルで用いたものです。
- 元々 Algyan というコミュニティでやったハンズオンがベースになっています
- ソースコードなどはGithubにおいてあります
- Nerves に関する Qiita 記事
謝辞
この入門は以下のみなさんの貢献でできてます。ありがとうございました。
- 高瀬 英希(東京大学/NervesJP)github Qiita
- 細合 晋太郎(東京大学/NervesJP)github Qiita
- 衣川 亮太(Tombo Works/NervesJP)github Qiita
- 三宅 泰宏(NervesJP/瀬戸内ROS勉強会/IoT ALGYAN岡山支部/kochi.ex)Qiita
- Awesome Yamauchi github Qiita
- 大栄 豊(株式会社オーバス(デンソー)/IoT ALGYAN本会運営委員)
- 松岡 貴志(Seeed)Qiita
- 西内 一馬(シティネット/NervesJP/kochi.ex)github Qiita
- 大崎 充博(シティネット/NervesJP/kochi.ex)github Qiita
- 菊池 豊(高知工科大学/NervesJP/kochi.ex)github Qiita
このページは Qiita #NervesJP Advent Calendar 2022 の22日目の記事を元に作成してます。
この内容の一部は国立研究開発法人情報通信研究機構の委託研究(04001)によります。