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

Elixir言語で組み込み開発にトライ

Avatar for myasu myasu
November 16, 2024

 Elixir言語で組み込み開発にトライ

Avatar for myasu

myasu

November 16, 2024
Tweet

More Decks by myasu

Other Decks in Technology

Transcript

  1. お前、誰よ? myasu • おしごと ◦ 医療系システム・その他特注機器開発(ソフトハードメカ開発 ◦ 生産技術@製造業( 10数年ほど。工場作る、生産設備作るなど •

    プログラム言語: ◦ C#、Python、Elixir、Rust、Go、Delphi、M電機PLC 他 • コミュニティ(主に岡山・香川) ◦ ハードウェア「NervesJP」 (設立) ◦ ロボット「瀬戸内ROS勉強会」 (設立) ◦ ハードウェア「えれくら」 (運営) @trihome @myasu yasuhiro.miyake.5076 @etcinitd @myasu 2
  2. 活動 自主製作・自主開発が趣味。 • 技術同人誌の制作 • 出展 a. モノ作り系・MakerFaire b. オープンソースカンファレンス

    • 技術系勉強会参加、発表など (”勇者ロボ”の開発もお手伝いしてます・右上 コミケで頒布 技術系同人誌 モノづくり展示会 3
  3. プログラム言語 Elixir ってなに? • Erlangの仮想マシン上で動作するプログラミング言語 ◦ Erlang: 欧州のエリクソン社で、電話交換機の制御のために開発 ◦ Erlangの仮想マシン:

    Erlang VM BEAMと呼びます • 2011年にJosé Valim氏により開発 ◦ 氏はもともとRuby on Railsの開発メンバ ◦ RubyやClojureの影響を受けながら、 Elixirが作られた 参考:https://github.com/voluntas/japanese-erlang-elixir-companies、    Elixir実践入門、Elixir実践ガイド、他 6 Erlang Elixir clojerl Erlang VM JAVA Scala Clojure JAVA VM
  4. プログラム言語 Elixir の特徴 • Rubyに影響を受けた言語 ◦ Erlangに比べて文法が分かりやすい • アクターモデルにより大量の並列処理を実行 ◦

    BEAM上で動く、複数のプロセス間でメッセージをやりとり • Supervisorによるプロセス監視 ◦ 個々のプロセスを監視、クラッシュしたら速やかに再起動 • そのほか ◦ 稼働中のシステムを停止せずプログラムを変更できるホットスワップなど 7 参考:https://github.com/voluntas/japanese-erlang-elixir-companies、    Elixir実践入門、Elixir実践ガイド、他
  5. Erlangの特徴とElixir • gen_server ◦ 状態管理をメッセージパッシングにより排他的に行う軽量プロセス • supervisor ◦ 軽量プロセスを監視、管理(起動・復旧) これらの仕組みにより、並行処理を安全に書ける

    不得意な点 • C言語に比べると遅い→高速な画像処理・演算に特化したライブラリを提供 8 Application supervisor gen_server メッセージ supervisor gen_server gen_server メッセージ 参考:https://github.com/voluntas/japanese-erlang-elixir-companies、    Elixir実践入門、Elixir実践ガイド、他
  6. プログラム言語 Elixir ってなに? Elixir(Erlang)の活用例 • Discordの大規模リアルタイム通信 • Nintendo Switchのプッシュ通知システム •

    らくらく連絡網のメッセージング基盤 • ニコ動、ニコ生のコンテンツ配信システム、などなど・・・ 9 参考:https://github.com/voluntas/japanese-erlang-elixir-companies、他
  7. 特徴的なコードの書き方 文字列の処理の例 11 "Open Source Conference 2024 Ehime" |> String.upcase()

    |> String.split(" ") |> Enum.reverse() |> Enum.join(" ") |> IO.puts() パイプ ” |> ” を使うと 前の行の返り値が 次の行の関数の第1引数に入る 大文字化 スペース区切りで分割 逆順に並べ替え 文字列に一本化 書き出し (実行例:paiza.io)
  8. 特徴的なコードの書き方 パターンマッチ パターンマッチ・関数 • 宣言 • 呼び出し 12 {a, b}

    = {1, 2} def osc_date(:yamaguchi, year = 2024), do: Date.new(year, 11, 9) def osc_date(:ehime, year = 2024), do: Date.new(year, 11, 16) def osc_date(_, _), do: raise(“unknown event”) osc_date(:ehime) 返り値 “2024,11,16” aには1が、bには2が入る osc_date(:kagawa) 返り値 “unknown event”
  9. Nervesとは Elixirベースの組み込み Linux 開発を支援するためのフレームワーク 特徴 • コンパクトなファームウェア ◦ サイズ <

    100MB ◦ 最小限のLinux(Buildroot) + ドライバ + Elixir実行環境 • 主要なマイコンボードをサポート • 電源断の対策 ◦ ルートファイルシステムがリードオンリー https://nerves-project.org/ https://github.com/nerves-project/ 14
  10. サポートしているマイコンボードの例 Nerves Project 公式 https://github.com/nerves-project/nerves?tab=readme-ov-file#hardware • Raspberry Pi 系 •

    X86_64 • BeagleBone、MangoPi • その他、Linuxの動くマイコンボード ◦ Buildrootを使用、公式サポートがなくても移植可能 15 (写真:SwitchScience、秋月電子、 RS)
  11. Nerves フレームワークのうれしさ Linuxをそのまま使う • アプリケーションを個々に立ち上げる ◦ 設定が散らかる ◦ バージョン管理も意識 ▪

    各アプリケーション、ファーム、、、 • 突然の電源断対策が必要 • ハード移行が大変 16 Nervesを使うことで • Elixir アプリケーション開発に専念 • 設定はElixirプロジェクトに内包 • ライブラリなどのバージョンは Elixir の mix.lock で管理 • 電源断対策ずみ • ハード移行が比較的容易 Elixir アプリ Erlang VM Linux カーネル アプリA アプリB アプリC Linux カーネル
  12. Linux × Elixir開発のうれしさ アプリケーションを”概ね”変えずにハードを移行 (概ね・・・ハードウェア入出力等は各ハードごとに調整が必要) 17 Elixir アプリ Erlang VM

    Linux カーネル Elixir アプリ Erlang VM Linux カーネル Elixir アプリ Erlang VM Linux カーネル (写真:SwitchScience、秋月電子、 RS) Raspi用カーネル・ パッケージ GRISP用カーネル・ パッケージ Beagle用カーネル・ パッケージ
  13. 組み込み開発を意識したしくみ 実際の”モノ”を、試行錯誤しながら作るうえでの、うれしい仕組み • 冗長 A/B パーティション(ファームウェアのA面B面) ◦ ファームウェア転送毎に切り替え ◦ •

    IoT デバイス開発のライブラリ Elixir Circuits ◦ GPIO, I2C, SPI, UART のライブラリが用意されている ◦ • ホットスワップ ◦ プログラムを止めずに、コードを書き換え ◦ • Nerves HubによるOTA(Over The Air update) ◦ リリース後のオンライン保全 18
  14. 実用例1 Nerves公式 https://nerves-project.org/cases/ • Smart farming devices at Farmbot https://farm.bot/ • Hop:

    Beer Kiosk System • LeTote: Web-based kiosk system to drive warehouse productivity 19 (写真:Wikipedia, NervesProject)
  15. 産業用途で使われる機器 • FA設備 ◦ いろいろな製品を量産する機械。工場の中。 • 構成部品 =FA機器 (Factory Automation) • スイッチ、ランプ、センサーなど

    ◦ 誘導電動機、空圧・油圧機器、ガス、液体・・・ • 頑丈! ◦ 少々荒い使い方をしても、壊れない • 電源、基本はDC24V ◦ あるいはAC100V, 200V, 三相・・・ ◦ マイコンなど電子機器をつなげるには、ひと工夫必要 23 (写真:MITSUBISHI,Panasonic, IDEC, PATLITE)
  16. 産業用途で使われる制御機器 • PLC (プログラマブル ロジック コントローラ) ◦ 安いものだと1万円程度から ◦ 入出力10点くらいから ◦

    20年くらいは販売が継続 ◦ ネットワーク無し。オプションで+ 2万円くらい ◦ オプション付けると色々出来る。けどあっという間にン十万円(!) • タッチパネル ◦ モノクロ3インチで2万円弱から ◦ カラー15インチで30万円以上(!) • 耐障害性、安定性、長期供給は保証 ◦ 10~30年は稼働し続けられること! ◦ 30年後でも、これらの部品が置き換えできること! 24 (写真:Siemens, DIGITAL)
  17. RaspberryPi を PLCっぽく使ってみよう PLCの考え方を取り込んでみよう!     モジュールを追加して機能拡張する概念→ • RaspberryPiにFA用機器を直接接続する ◦ 電圧の違い(3.3V ~

    24V)を相互変換する機能 • 機能拡張しやすい仕組みの取り入れ ◦ Seeed社のGROVE System ◦ CONTECの拡張ボード ◦ など 26 CPU IO AD Ether ・・・
 (写真:Siemens, Seeed Studio)
  18. センサの信号
 FA機器とRaspberryPiの接続 28 (写真:Siemens, DIGITAL) FA用センサなど
 FA用表示灯など
 DC24Vで動作する機器
 RaspberryPi
 3.3Vで動作する部品


    フォトカプラで
 電気的に絶縁
 フォトカプラで
 電気的に絶縁
 トランジスタ
 アレイで
 電流増幅
 表示灯の信号
 表示灯を点灯
 センサの信号

  19. いきなり自作は難しい・・・拡張 市販の拡張ユニットを活用 • WaveShare(安価) ◦ https://www.sengoku.co.jp/mod/sgk_cart/search.php?maker=WaveShare • コンテック(充実) ◦ https://www.contec.com/jp/lp/daq-control/raspberry-pi-cpi-series

    • ビット・トレード・ワン ◦ リレー制御拡張基板 ◦ https://bit-trade-one.co.jp/product/module/adrsru/ • ラトックシステム ◦ 入出力(デジタル・アナログ) ◦ https://www.ratocsystems.com/products/rasppi.html 30 (写真:ビット・トレード・ワン、ラトックシステム)
  20. いきなり自作は難しい・・・便利な製品 • WAGO・CC100 ◦ リアルタイムLinux ◦ CODESYS(NodeRedのようなビジュアル開発) ◦ Dockerも使える •

    横河電機・e-RT3 Plus ◦ Ubuntu Linuxがそのまま動作 ◦ 横河電機PLC機器と連携容易 31 (写真:横河電機、ハーティングページ) https://www.yokogawa.co.jp/solutions/products-platforms/ control-system/real-time-os-controller/
  21. いきなり自作は難しい・・・便利な製品 • M5Stack ◦ マイコンボード+画面+ボタン+ IO+・・・ ◦ Grove System並の豊富なセンサー類 ◦

    FA向けの拡張オプションも充実 • ハーティング・RevPiシリーズ ◦ 産業向けRaspberry Piを搭載 ◦ PLCと同じようにIO拡張可能 32 (写真:SwitchScience、ハーティング)
  22. 制御機器の特徴を比較 34 PLC Raspberry Pi 記述言語 ラダー Python, Ruby, C,

    C++ ... ”RUN中書き込み” できる できない デジタル入出力の電圧 24V 3.3V→別途24V変換必要 操作者に対する 入出力機器 FA用タッチパネル 液晶モニタ マウス、キーボード 電源の操作 いきなり入・切OK シャットダウンの操作必要
  23. 電源の配慮 • RaspberryPiは”パソコン” ◦ 必ずシャットダウンが必要 • 工場現場で”電源のぶち切り” ◦ SDカードが壊れて、起動しなくなる可能性大 ◦

    自動シャットダウンユニット、 UPSなど必要 ▪ 市販品の例:ADRSZUP ゼロワン 電源保持基板 | Bit Trade One, LTD (bit-trade-one.co.jp) ◦ SDカードを”読み込み専用”化 ▪ 設定例 :Raspberry Pi OSのrootfs ROM 化 35
  24. 盤のなかみ FA部品を活用して制御盤に仕上げる 37 •サーキットプロテクタ
  (IDEC、富士電機)
 •端子台
  (東洋技研、WAGO)
 RaspberryPi
 GROVE Hat


    •プラボックス
  (日東工業、タカチ)
 •アルミフレーム
  (NICオートテック)
 •ゴム足
  (タキゲン)
 •コンセント
  (パナソニック)
 •ランプ、スイッチ
  (IDEC、オムロン)
 •タワー表示灯
 (日恵製作所、
  シュナイダーエレクトリック) 
 •DINレール、配線ダクト
 (篠原電気)
 300mm
 500mm

  25. Raspberry Piの言語 RaspberryPiのOS → Linux (UNIX)ベース • ソフトウェアPLC ◦ CODESYS、OpenPLC • プログラミング言語

    ◦ Python (圧倒的なWebの情報量) ◦ C/C++言語 ◦ Rust ◦ Go ◦ Elixir ◦ ・・・(その他多数) 40
  26. 機能比較(ふたたび) 42 PLC Raspberry Pi 記述言語 ラダー Python, Ruby, C,

    C++ ... ”RUN中書き込み” できる できない デジタル入出力の電圧 24V 3.3V→別途24V変換必要 操作者に対する 入出力機器 FA用タッチパネル 液晶モニタ マウス、キーボード 電源の操作 いきなり入・切OK シャットダウンの操作必要
  27. 機能比較・Elixirを追加 43 PLC Raspberry Pi 記述言語 ラダー Python, Ruby, C,

    C++ ... Elixir / Nerves ”RUN中書き込み” できる できない できる デジタル入出力の電圧 24V 3.3V→別途24V変換必要 操作者に対する 入出力機器 FA用タッチパネル 液晶モニタ マウス、キーボード 電源の操作 いきなり入・切OK シャットダウンの操作必要 いきなり入・切OK
  28. ラダー言語 → Elixir言語(Nerves) • ✅実行を止めずにプログラム書き換え (recompile, hotswap) • ✅変数のリアルタイムモニタ • ソースコードは丸ごとストレージに保存 (しなくても良い)

    • ✅シリアル通信、Ethernetの取扱も容易 • OTAもできる • その他デバッグツール ◦ https://elixir-lang.jp/getting-started/debugging.html 45 (写真:https://elixir-lang.jp)
  29. 実行中デバッグの実際 「ソース修正→ビルド→転送」・開発中の試行錯誤の時間を短縮 • 分担 ◦ 組み込み機器の入出力: RaspberryPi ◦ 開発途中の処理ロジック:開発パソコン •

    試行錯誤の初期段階:Node.Connectによる方法 ◦ RaspberryPiとパソコンをネットワークで繋いでおく ◦ マイクロサービス通信でやりとり • 試行錯誤の最終段階:hotswap※による方法 ◦ 修正したコード→ビルド→その部分だけRaspberryPiのメモリに転送→その部分のVMを再起動 出来上がったロジックから順番にRaspberryPiに書き込み 46 このあたり、いろんな手 法を試行錯誤中です ※https://github.com/kentaro/mix_tasks_upload_hotswap
  30. 実行中デバッグのイメージ 47 アナログ入力 アナログ出力 node.connect 維持・監視 デジタル入力 デジタル出力 node.connect 維持・監視

    シーケンス制御 正常運転 シーケンス制御 異常処置 シーケンス制御 正常運転 シーケンス制御 異常処置 デバイス1 デバイス2 開発PC 1. Node.Connectで”同じ空間”に いる状態 2. まずは開発PC/Elixirでコード 作成、実行 3. できたところから、デバイスに Upload 4. 開発PC側で実行、修正 &recompile→そのまま実行 継続 5. Exibee側に修正必要なら、 hotswapで更新して様子見 →OKならUpload node.connect 維持・監視
  31. 問題 (個人的な意見です) • Elixir言語の知名度が、まだ低い ◦ Elixirならではの”うれしさ”が共有しにくい? ◦ • 一番享受しそうな界隈の人が入ってくる、ハードルが高い ◦

    Arduinoを使う人 ▪ LinuxなどのOSの扱いに抵抗感? ▪ 止められない”RUN中デバッグ”が不要なら、享受できるうれしさが少ない ▪ ◦ 産業系コンピュータPLCを本業で使う人 ▪ 業界的に、新しい技術を取り込み難い雰囲気? ▪ 50
  32. 課題 • Elixir言語の認知度アップ ◦ いろいろな媒体で紹介が増えた ◦ 「知ってる!」ひとが増えてきた! ◦ ◦ ここ2・3年でいろいろな本が出てる

    → ▪ 技術評論社「Elixir実践入門」 ▪ インプレス「Elixir実践ガイド」「ElixirではじめるIoT開発入門」 ◦ ◦ 国内のElixirコミュニティも活発!(後述) • これから、組み込み開発的なことに関わることになりそうな人にオススメ ◦ 普段からOSSを使い慣れている。Linux、Github、VSCode・・・などの使用にも抵抗がない ◦ ハードウェア制御(バックエンド)だけで無く、操作パネル(ユーザーインターフェース)も作る 51 (写真:技術評論社、インプレス)
  33. まとめ • Elixir言語 ◦ 耐障害性、高可用性、分散処理 • Nerves ~ Elixirで組み込みLinux開発 ◦ 組み込みLinux、ハードウェアライブラリ、冗長 A/B

    パーティション • 組み込み開発の実際 ◦ 産業機器を例に、Elixirの有用性の紹介 • Elixir / Nervesが使える”うれしさ”と”課題” 53