Slide 1

Slide 1 text

Elixir で IoT 開発、 Nerves なら簡単にできる!? 関数型まつり2025 2025/06/14 https://fortee.jp/2025fp-matsuri/proposal/b952a4f0-7db5-4d67-a911-a7a5d8a840ac

Slide 2

Slide 2 text

自己紹介 ● 衣川 亮太 (きぬかわ りょうた) ● 愛知県岡崎市のアプリケーションプログラマ ○ Elixir / Nerves の開発を専らやっています ● X: @pojiro3 ● I love Elixir & Nerves ● 日本の Nerves コミュニティである Nerves JP に所属しています

Slide 3

Slide 3 text

アウトライン ● Nerves とはどんなもの?まずは見てみる! ● 関数型まつりで Elixir で IoT !?なんで? ● Elixir について ○ 「書きやすい」「Erlang が持つ強み」をもった関数型言語 ○ そんな Elixir は IoT 機器でも活きる ● Nerves とはどんなもの?その実際!! ● Nerves の構成、デモ、利用例 ● 始めるとしたら?

Slide 4

Slide 4 text

Nerves とはどんなもの? まずは見てみる!

Slide 5

Slide 5 text

まずは見てみる!で見る(た)こと ● Nerves on Rpi4 ● SSH 接続 ○ iex shell ( Elixir のシェル) ■ ifconfig ■ RingLogger.next ● デバイス操作(GPIO) ○ Circuits.GPIO.write_one("GPIO27", 1) ● ブラウザから操作 ● 電断 Nerves Linux カーネル Elixir アプリケーション Erlang VM ファイルシステム リポジトリ https://github.com/pojiro/fp_matsuri_2025

Slide 6

Slide 6 text

関数型まつりで Elixir で IoT !?なんで? ● サーバサイド の関数型言語と認識されている(と思う) Elixir を、 IoT (組み込み Linux として)に活かせる Nerves が素晴らしい技術だと思うのでその魅力を伝えたい ● そして Nerves や Nerves にインスパイアされたような仕組みをもつ技術に よって、ソフトとハードを組み合わせる敷居が低くなり、様々なアイデアが 形になったら嬉しい 5m

Slide 7

Slide 7 text

Elixir

Slide 8

Slide 8 text

Elixir ● 2011年から開発される関数型言語(動的型付け) ○ 最初の公式リリースは 2012.05 の v0.5.0 ○ 参考 Erlang は 1987年に first experiments ● 著者は元 Rails core team の José Valim さん ● Erlang VM 上で動作する言語で 「書きやすい」「Erlang が持つ強み」をもった言語 Java VM Java Scala Clojure Erlang VM Erlang Elixir Gleam

Slide 9

Slide 9 text

Elixir の関数型言語として特徴 ● 関数は first-class citizen ○ 変数束縛可、関数引数可、関数戻値可 ● 変数は不変、ただし再束縛可 ● map, reduce 等が標準で使える(Enum モジュール) ● if, case は値を返す式(if は else がなければ nil を返す ● マッチによる宣言的な記述(:ok = FpMatsuri2025.start()) ○ マッチ不可なら MatchError 例外 ● パイプラインオペレータ |> (部分適用ではなく第一引数に渡すだけ ● 関数パターンマッチ(引数マッチでオーバーロード)

Slide 10

Slide 10 text

(主観)書きやすい Elixir のコード ● 関数はデータ変換器、パイプラインオペレータ ○ "Fp Matsuri 2025" |> String.upcase() |> String.split(“ “) |> Enum.reverse() |> Enum.join(" ") "2025 MATSURI FP" ● データ変換をデータを流すように書ける💡 ● コードの足し引きがしやすい💡

Slide 11

Slide 11 text

(主観)書きやすい Elixir のコード ● 関数パターンマッチ、引数でマッチ ○ def fp_matsuri_date(year = 2025), do: Date.new(year, 6, 14) ○ def fp_matsuri_date(year = 2026), do: raise(“not implemented yet”) ● バイナリパターンマッチ ○ <<変数名::フォーマット, …>> = データ     と書くと変数に値を切り出せる 4byte をリトルエンディアンの16bitの ch_0, ch_1 変数にマッチ コードの足し引き がしやすい💡 データ変換に 便利💡

Slide 12

Slide 12 text

Erlang が持つ強み:並行志向 ● 並行志向は Erlang VM の「軽量プロセス」によって実現される ○ VM 上にプロセスが生成される、プロセスは状態を保持できる ○ VM のスケジューラによって、プロセスの処理は並行に進められる ● プロセス同士はメッセージパッシングでやりとりする(アクターモデル ○ プロセスはメールボックスに届くメッセージを受信順に一つずつ処理する ■ これによってプロセスの処理は排他になり、並行処理の悩みが低減される💡 Erlang VM 📨 📨 P 📮 PID: x P 📮 PID: y P 📮 PID: z spawn 関数で プロセスを生成 send 関数で メッセージを投げる receive 関数で メッセージを受け取る

Slide 13

Slide 13 text

Erlang が持つ強み:耐障害性 ● 耐障害性は Erlang OTP が提供する gen_server, supervisor の補助を受けてユーザが担保する ○ GenServer(gen_server, generic server process ■ プロセス実装を一般化した behaviour ○ Supervisor ■ プロセスを監視、復旧する behaviour ■ 自身もプロセス ■ 監視対象の再起動戦略を決めることができる ● Erlang OTP ○ > OTP is set of Erlang libraries and design principles providing middle-ware to develop these systems.  ref. https://www.erlang.org/ 👆supervision tree 15m

Slide 14

Slide 14 text

Elixir ってサーバサイドでは? ● 通信機器向け Erlang 由来の並行志向、耐障害性を支えるOTP、 また、Elixir 製の Web フレームワーク Phoenix があり、 サーバサイドで使われることが多い ○ ex. Real time communication at scale with Elixir at Discord ■ from https://elixir-lang.org/cases.html サーバ data data data data data data data data data data 並行志向 耐障害性 データ変換

Slide 15

Slide 15 text

そんな Elixir は IoT 機器でも活きる ● センサデータの取得 ● データの変換 ● データのアップロード ● ボタンの入力応答 ● モータの出力 sup gen gen gen センサ ボタン モータ メッセージパッシング メッセージパッシング 各GenServerを監視し、落ちたら再起動 ● だいたいのことは並行処理になる(処理を排他に簡単に書けるのは便利 ● 運用中は障害で落ちても、回復可能なら自動復旧して機能を提供し続けたい CO2 温度 湿度 モータ ボタン 例)温室 をIoT で監視制御

Slide 16

Slide 16 text

でも、IoT 機器にするにはハードルがある ● 不意の電源断の対策(ブレーカかもしれないし、スイッチで人間が切るかも ● フィールドに散在する機器の更新 ○ OS 更新(ex. セキュリティパッチ ○ アプリの更新(OTA のような仕組みを自前で用意? ● ファームウェアのまとめ上げ、管理 ○ 各サービスの設定、バージョンの管理、他 上記のような開発の共通課題を解決して、 Elixir のアプリケーション開発のみに専念させてくれるのが Nerves 💡 20m

Slide 17

Slide 17 text

Nerves とはどんなもの? その実際!!

Slide 18

Slide 18 text

Nerves ● 2016年から開発される組み込み Linux 開発を Elixir で可能にする OSS ○ Nerves is an open-source platform that combines the rock-solid BEAM virtual machine and Elixir ecosystem to easily build and deploy production embedded systems. ref. https://nerves-project.org/ ● 現コアメンバー ○ Frank Hunleth @ SmartRent ○ Jon Carstens @ SmartRent ○ Connor Rigby ○ Masatoshi Nishiguchi (昌利 西口) ■ Nerves JP メンバー🎉 ○ Lars Wikman @ Underjord ■ https://nerves-project.org/newsletter/ 毎週配信 SmartRent は スマートホームソリューションの提供に Nerves を利用している

Slide 19

Slide 19 text

● Nerves Project 公式サポート:安価で入手可能な SBC が中心 ○ BeagleBone Black/Green/Green Wireless, Pocket Beagle ○ Raspberry Pi A+/B+, Zero/Zero W/Zero 2 W, 2B, 3A+, 3B/B+, 4, 5 ○ MangoPiMQPro ○ OSD32MP1-BRK ○ x86_64 ● Linux が動作する SBC であれば Nerves は移植可能なので、 公式サポートがなくても移植すれば使える💡 Nerves が動作するボード 気軽に始められる

Slide 20

Slide 20 text

Nerves の構成 ● Linux カーネル ○ Nerves に必要なドライバの追加 ● ルートファイルシステム ○ リードオンリー(squashfs) ○ ファイルを必要なものだけに限定 ● /sbin/init ○ Linux 上で プロセス ID 1 となる /sbin/init を独自の erlinit に差し替えており、 そのプロセスから Erlang VM を起動する あらゆる処理を Erlang VM から行うことで組み込み Linux であることを意識せずに Elixir アプリケーションの開発に専念できるようにしている💡 Nerves Linux カーネル Elixir アプリケーション Erlang VM ファイルシステム nerves_system_***と呼ぶ *** は例えば rpi4 Elixir アプリが利用する ライブラリ扱いとなる

Slide 21

Slide 21 text

● 電断対策のユーザによるケアが不要 ○ rootfs が リードオンリーであることより ● すべての設定が Elixir アプリに閉じる ○ ネットワーク設定含む ● ファーム管理が用意 ○ Elixir の mix.lock で nerves_system_*** 含めバージョンが管理される ● ハード移行が容易 ■ nerves_system_*** を切り替えればよい、 rpi4 -> bbb Elixir アプリと nerves_system_*** の分離 により可能になること Linux カーネル Elixir アプリケーション Erlang VM ファイルシステム nerves_system_***と呼ぶ *** は例えば rpi4 Elixir アプリが利用する ライブラリ扱いとなる

Slide 22

Slide 22 text

百聞は一見に如かず、論より Run Nerves Demo

Slide 23

Slide 23 text

Demo で見る(た)のは ● mix nerves.new ○ プロジェクト作成 ● mix firmware ○ ファームウェアの作成 ● mix burn ○ ファームウェアの SD への書き込み ○ パーティション A で起動, hello world ● mix upload ○ SSH 転送 ○ パーティション B で起動, hello fp_matsuri_2025 ● MIX_TARGET=bbb mix firmware ○ 別ターゲット用ファームウェアの作成 ● Nerves Hub 2.0 (2024.09.25 に 2.0.0 がリリース ○ OTA サーバ, OSS なので自身でホストができる ○ 自身でホストをしない場合は、 NervesCloud https://nervescloud.com/ が今後選択肢になりうる

Slide 24

Slide 24 text

組み込み機器を支える特徴 ● 冗長 A/B パーティション(ファームウェアのA面B面) ○ ファームウェア転送毎に切り替え ● IoT デバイス開発に欠かせないライブラリ群 Elixir Circuits ○ GPIO, I2C, SPI, UART のライブラリが用意されている ● OTA を可能とする Nerves Hub が OSS である ○ https://github.com/nerves-hub/nerves_hub_web ○ 自身でホスト ○ 自身でホストをしない場合は、 NervesCloud https://nervescloud.com/

Slide 25

Slide 25 text

Nerves でできること

Slide 26

Slide 26 text

Nerves の利用例 @ SmartRent ● SmartRent ○ Nerves 著者のフランクさんとジョンさんが勤めるスマートホームソリューションの企業 ● IoT Hub の合計運用台数は828K、 82万 8000台 ※2025/03/31 時点 ● 内 10万台以上 が Elixir based な Nerves デバイス 残りは Java based なデバイス ○ 彼らは、Elixir based な Nerves デバイスへの置き換えを予定

Slide 27

Slide 27 text

Nerves の利用例 https://nerves-project.org/cases/ Le Tote: 衣料品倉庫のRFIDと キオスクによる在庫管理 FarmBot: CNC農業プロジェクト Hop: 顔認証機能付きの キオスクビールサーバ

Slide 28

Slide 28 text

ウェザーステーション

Slide 29

Slide 29 text

制御マシン、キオスク端末 ● Nerves on ラズパイ CM4 ○ DI x2、DO x2 ○ RS232 x1、RS485 x1 ○ LTE モジュール

Slide 30

Slide 30 text

Elixir と Nerves で実現できること 💡上(Cloud)から下(端末)まで Elixir で開発💡 クラウド エッジ 端末

Slide 31

Slide 31 text

何からはじめよう?

Slide 32

Slide 32 text

B-104, B-105 トラックへ参加 ● B-104 「ElixirでIoT!!」のこれまでとこれから ○ 16:30 - 16:55 ● B-105 産業機械をElixirで制御する ○ 17:00 - 17:25 Nerves を使って実際にモノを動かす話が紹介されるはず💡

Slide 33

Slide 33 text

Nerves のテキストを読んでみる ● Build a Weather Station with Elixir and Nerves ○ Nerves のコア開発者 Frank さんが著者の一人 ○ NervesJP で勉強会を実施し、そのときの動画あり ○ ページ数:90 ● 『ElixirではじめるIoT開発入門  Nervesプラットフォームで組み込み開発にトライ!』 ○ 著者:三宅 泰宏さん (NervesJP メンバー🎉) ○ 発行日:2023/12/08 ○ 発行社:インプレス NextPublishing ○ ページ数:78(印刷版)

Slide 34

Slide 34 text

Elixir も Nerves もしっかり勉強してみる ● Elixir 実践入門 ○ 発行日: 2024/02/24 ○ Elixir でできる様々なこと(Nerves 含む) が書かれる一冊 ○ NervesJP メンバーの高瀬さんが著者の一人です! ○ 発表者はレビュワーとして協力しています!

Slide 35

Slide 35 text

コミュニティに参加 ● NervesJP ○ Connpass ■ https://nerves-jp.connpass.com/ ○ Slack ■ NervesJP Slackの招待リンク ● 世界 ○ Discord: Elixir Language の #nerves チャンネル ■ https://discord.com/channels/269508806759809042/592366299573649440 ○ elixir forum: nerves-forum ■ https://elixirforum.com/c/nerves-forum/74

Slide 36

Slide 36 text

関数型言語Elixirで 組み込み Linux 開発ができる Nerves に興味を持っていただけたら嬉しいです!

Slide 37

Slide 37 text

さらに知りたい場合の資料 ● Nerves と Linux の関係紹介

Slide 38

Slide 38 text

寄り道)Application による分割統治 ● Erlang VM 上では各 Application は独立して動作するので、 (VMが落ちない限りは)一つの App 障害で全体が落ちることが無い ○ App A で障害が起きたとしても、App B に影響を与えない VM

Slide 39

Slide 39 text

● アプリケーションを個々に立ち上げる ○ 設定が散る ○ 各アプリケーションのバージョン管理 ■ ファームのバージョン管理 ● 電断対策が必要 ● ハード移行が大変 ● Elixir アプリケーションを開発するのみ ○ 設定はElixirプロジェクトに閉じる ○ ライブラリなどのバージョンは Elixir の mix.lock で管理 ● 電断対策は Nerves に任すことができる ● Elixirアプリケーションと nerves_system_*** で分かれているため ハード移行が容易 組み込み Linux 開発の課題を解決 Linux カーネル Linux カーネル Elixir アプリケーション Erlang VM Buildrootで構築する nerves_system_*** ファイルシステム ファイルシステム nerves_system_*** は ライブラリとして提供される

Slide 40

Slide 40 text

アプリケーションを(概ね)変えずに ハードを移行 nerves_system_rpi3 https://www.raspberrypi.com/products/raspberry-pi-3-model-b-plus/ nerves_system_kr260 https://github.com/b5g-ex/nerves_system_kr260 nerves_system_zybo_z7_10 https://github.com/zeam-vm/nerves_system_zybo_z7_10 ※「概ね」と書いたのは、ハードウェア入出力等は各ハードで合わせる必要があるため Linux カーネル Elixir アプリケーション Erlang VM ファイルシステム Linux カーネル Elixir アプリケーション Erlang VM ファイルシステム Linux カーネル Elixir アプリケーション Erlang VM ファイルシステム