Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Elixir で IoT 開発、 Nerves なら簡単にできる!?

Elixir で IoT 開発、 Nerves なら簡単にできる!?

同じスライドのグーグルスライドへの共有リンクは以下、スライド内リンク先をたどりたい場合はこちらの方が便利

https://docs.google.com/presentation/d/1FrQRE5z7tGmb8XyvvKT3KOiItQsu60hvMbrjXZl4DOM/edit?slide=id.g35bb4a255a1_2_57#slide=id.g35bb4a255a1_2_57

Avatar for pojiro

pojiro

June 14, 2025
Tweet

More Decks by pojiro

Other Decks in Programming

Transcript

  1. 自己紹介 • 衣川 亮太 (きぬかわ りょうた) • 愛知県岡崎市のアプリケーションプログラマ ◦ Elixir

    / Nerves の開発を専らやっています • X: @pojiro3 • I love Elixir & Nerves • 日本の Nerves コミュニティである Nerves JP に所属しています
  2. アウトライン • Nerves とはどんなもの?まずは見てみる! • 関数型まつりで Elixir で IoT !?なんで?

    • Elixir について ◦ 「書きやすい」「Erlang が持つ強み」をもった関数型言語 ◦ そんな Elixir は IoT 機器でも活きる • Nerves とはどんなもの?その実際!! • Nerves の構成、デモ、利用例 • 始めるとしたら?
  3. まずは見てみる!で見る(た)こと • 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
  4. 関数型まつりで Elixir で IoT !?なんで? • サーバサイド の関数型言語と認識されている(と思う) Elixir を、

    IoT (組み込み Linux として)に活かせる Nerves が素晴らしい技術だと思うのでその魅力を伝えたい • そして Nerves や Nerves にインスパイアされたような仕組みをもつ技術に よって、ソフトとハードを組み合わせる敷居が低くなり、様々なアイデアが 形になったら嬉しい 5m
  5. 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
  6. Elixir の関数型言語として特徴 • 関数は first-class citizen ◦ 変数束縛可、関数引数可、関数戻値可 • 変数は不変、ただし再束縛可

    • map, reduce 等が標準で使える(Enum モジュール) • if, case は値を返す式(if は else がなければ nil を返す • マッチによる宣言的な記述(:ok = FpMatsuri2025.start()) ◦ マッチ不可なら MatchError 例外 • パイプラインオペレータ |> (部分適用ではなく第一引数に渡すだけ • 関数パターンマッチ(引数マッチでオーバーロード)
  7. (主観)書きやすい Elixir のコード • 関数はデータ変換器、パイプラインオペレータ ◦ "Fp Matsuri 2025" |>

    String.upcase() |> String.split(“ “) |> Enum.reverse() |> Enum.join(" ") "2025 MATSURI FP" • データ変換をデータを流すように書ける💡 • コードの足し引きがしやすい💡
  8. (主観)書きやすい 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 変数にマッチ コードの足し引き がしやすい💡 データ変換に 便利💡
  9. Erlang が持つ強み:並行志向 • 並行志向は Erlang VM の「軽量プロセス」によって実現される ◦ VM 上にプロセスが生成される、プロセスは状態を保持できる

    ◦ VM のスケジューラによって、プロセスの処理は並行に進められる • プロセス同士はメッセージパッシングでやりとりする(アクターモデル ◦ プロセスはメールボックスに届くメッセージを受信順に一つずつ処理する ▪ これによってプロセスの処理は排他になり、並行処理の悩みが低減される💡 Erlang VM 📨 📨 P 📮 PID: x P 📮 PID: y P 📮 PID: z spawn 関数で プロセスを生成 send 関数で メッセージを投げる receive 関数で メッセージを受け取る
  10. 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
  11. 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 並行志向 耐障害性 データ変換
  12. そんな Elixir は IoT 機器でも活きる • センサデータの取得 • データの変換 •

    データのアップロード • ボタンの入力応答 • モータの出力 sup gen gen gen センサ ボタン モータ メッセージパッシング メッセージパッシング 各GenServerを監視し、落ちたら再起動 • だいたいのことは並行処理になる(処理を排他に簡単に書けるのは便利 • 運用中は障害で落ちても、回復可能なら自動復旧して機能を提供し続けたい CO2 温度 湿度 モータ ボタン 例)温室 をIoT で監視制御
  13. でも、IoT 機器にするにはハードルがある • 不意の電源断の対策(ブレーカかもしれないし、スイッチで人間が切るかも • フィールドに散在する機器の更新 ◦ OS 更新(ex. セキュリティパッチ

    ◦ アプリの更新(OTA のような仕組みを自前で用意? • ファームウェアのまとめ上げ、管理 ◦ 各サービスの設定、バージョンの管理、他 上記のような開発の共通課題を解決して、 Elixir のアプリケーション開発のみに専念させてくれるのが Nerves 💡 20m
  14. 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 を利用している
  15. • 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 が動作するボード 気軽に始められる
  16. 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 アプリが利用する ライブラリ扱いとなる
  17. • 電断対策のユーザによるケアが不要 ◦ rootfs が リードオンリーであることより • すべての設定が Elixir アプリに閉じる

    ◦ ネットワーク設定含む • ファーム管理が用意 ◦ Elixir の mix.lock で nerves_system_*** 含めバージョンが管理される • ハード移行が容易 ▪ nerves_system_*** を切り替えればよい、 rpi4 -> bbb Elixir アプリと nerves_system_*** の分離 により可能になること Linux カーネル Elixir アプリケーション Erlang VM ファイルシステム nerves_system_***と呼ぶ *** は例えば rpi4 Elixir アプリが利用する ライブラリ扱いとなる
  18. 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/ が今後選択肢になりうる
  19. 組み込み機器を支える特徴 • 冗長 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/
  20. Nerves の利用例 @ SmartRent • SmartRent ◦ Nerves 著者のフランクさんとジョンさんが勤めるスマートホームソリューションの企業 •

    IoT Hub の合計運用台数は828K、 82万 8000台 ※2025/03/31 時点 • 内 10万台以上 が Elixir based な Nerves デバイス 残りは Java based なデバイス ◦ 彼らは、Elixir based な Nerves デバイスへの置き換えを予定
  21. B-104, B-105 トラックへ参加 • B-104 「ElixirでIoT!!」のこれまでとこれから ◦ 16:30 - 16:55

    • B-105 産業機械をElixirで制御する ◦ 17:00 - 17:25 Nerves を使って実際にモノを動かす話が紹介されるはず💡
  22. Nerves のテキストを読んでみる • Build a Weather Station with Elixir and

    Nerves ◦ Nerves のコア開発者 Frank さんが著者の一人 ◦ NervesJP で勉強会を実施し、そのときの動画あり ◦ ページ数:90 • 『ElixirではじめるIoT開発入門  Nervesプラットフォームで組み込み開発にトライ!』 ◦ 著者:三宅 泰宏さん (NervesJP メンバー🎉) ◦ 発行日:2023/12/08 ◦ 発行社:インプレス NextPublishing ◦ ページ数:78(印刷版)
  23. Elixir も Nerves もしっかり勉強してみる • Elixir 実践入門 ◦ 発行日: 2024/02/24

    ◦ Elixir でできる様々なこと(Nerves 含む) が書かれる一冊 ◦ NervesJP メンバーの高瀬さんが著者の一人です! ◦ 発表者はレビュワーとして協力しています!
  24. コミュニティに参加 • 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
  25. 寄り道)Application による分割統治 • Erlang VM 上では各 Application は独立して動作するので、 (VMが落ちない限りは)一つの App

    障害で全体が落ちることが無い ◦ App A で障害が起きたとしても、App B に影響を与えない VM
  26. • アプリケーションを個々に立ち上げる ◦ 設定が散る ◦ 各アプリケーションのバージョン管理 ▪ ファームのバージョン管理 • 電断対策が必要

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