Nerves Training at Sapporo ハンズオンに参加してきました #サッポロビーム

2019.10.13

こんにちはCX事業本部のさかじです。
2019/10/5 行われたIoT開発フレームワークのハンズオンである"Nerves Training at Sapporo"の参加レポートになります。

Nerves Training at Sapporoとは

IoT開発フレームワーク『Nerves』のハンズオンが札幌にやってきます! NervesはIoTボード上で動作する最小構成のLinuxブートローダ+Elixir実行環境+各種デバドラのパッケージセットで、 Elixir × IoTの文脈で最も活発なプロジェクトです そんなNervesに関するトレーニング "Device to the Cloud with Nerves and NervesHub" の教材を takasehideki が開発者であるJustinとFrankから譲り受け、全国各地で広めているのがこのトレーニングです ElixirでIoTやるのに最もアツいNervesを学習するにはこれ以上ないコンテンツとなっております

申し込みサイト このトレーニングに関する資料

事前準備

  • Elixir/Erlang/Nerves環境のインストール
  • 私はWindows10 + VurtualBox + Ubuntu18.4を構築しトラブル対応のためMacBookでも環境を構築しておきました

  • 残念ながらWindows + VurtualBoxではうまくTargetを認識することができず、MacBookでハンズオンを進めました

概要紹介

  • 今回使用するのはRaspberry Pi Zero H/W + Adafruit OLED Bonnet

  • ゴールはRasPi Zero + Adafruit OLED Bonnetでゲームができるようになる(はず)
  • 開発環境、デプロイ方法、OTAの方法
  • Nerves HUBを使ってOTAできる https://www.nerves-hub.org/
  • 各技術について説明
    • Host
    • 自分のコンピュータでファームウェアを開発(クロスコンパイル)
    • Target
    • Hostで作成したファームウェアを書き込み動作させる
    • Toolchanin
    • System
    • Linuxルートファイルシステムを使用
    • しかしLinuxのソースコードは使っておらずオリジナルで作られている(Apache2.0)
    • 冗長性を持ったboot領域を持っておりデプロイで問題が発生しにくい
    • ファーウェアのサイズは~30MByte
    • 開発するハードウェアは決まっている。カスタムハードウェアは別途有償でサポート
    • 資料でどのデバイス(Host/Target)を操作するかを説明

Elixir.Circutisによる外部デバイスの制御

  • Host(PC)からSSHでデバイスへ接続
    • 仮想EthernetでRaspiberry Pi Zeroへ接続
    • ログインするとElixirのターミナルが立ち上がる
  • 外部インターフェースの説明
    • GPIO
    • 遅い
    • LED, ボタンの制御にあっている
    • Circuits.GPIO
      • R/Wできる
      • 状態変化で通知できる(割り込み)
      • Adafruit OLED Bonnetのボタンの状態を確認するプログラムを作ってみる
    • その他I/Oの説明(I2C/SPI/UARTなど)
    • どんなバス(I/O)使えば良いか?
    • I2Cを使ってみる
    • Adafruit OLED Bonnetのアドレスを見つけてみる
    • 詳しくはデータシートを見ましょう!
    • 簡単なコマンドでLEDのバックの色を変更可能

NervesによるIoT開発の基礎

  • ここからはホスト上で開発
  • クロスコンパイルしTargetへ書き込む手順の説明
  • Hello worldプログラムを作成して書き込み、動作確認
  • SSLの鍵などを埋め込みファームウェアを書き込む

NervesHubによるデプロイ

  • NurvesHubによるデプロイ方法の説明
    • X.509を使用
    • Nerves Keyを使用
  • HostへNervesHubへTargetを登録
  • NervsKeyへ証明書を書き込み
  • TargetをWifiを使用してNervesHubへ接続
  • Hostで作成したTarget用のファームウェアをNervesHubへpublish
  • Targetへデプロイされる
  • NervesHub上でログも監視可能

Scenic

Scenic

Scenicとは

Scenic is an application framework written directly on the Elixir/Erlang/OTP stack. With it, you can build client-side applications that operate identically across all supported operating systems, including MacOS, Ubuntu, Nerves/Linux, and more.

Scenic is primarily aimed at fixed screen connected devices (IoT), but can also be used to build portable applications.

  • NerversアプリケーションをHost上で起動できる環境
  • Host/Targetと別環境を起動して作成
  • Targetと同様の画面表示など可能
  • Fontサイズ、Fontを変更可能

Phoenix Channels

通信方式

  • Pub/Sub

ゲームを作る

  • Host PCでServerを作成
  • Host PCとTargetにクライアントを構築
  • 各モジュールの通信部分を追加してゲームを作成

参考サイト

最後に

ゲーム作成するところのSever/Clientの接続がうまくいかず終了時間がきてしまい残念な結果になってしまいましたが、Raspberry Pi Zeroと追加の機材で作れそうですので、また挑戦していきたいと思います。Elixirは使用したことがないためまだよくわかっていないのでそちらの勉強も必要なので、徐々に覚えていきたいと思います。
開催するために募集、機材貸し出しなど尽力いただきました、Nerves JPの高瀬様、Sapporo.beamのみなさまありがとうございました。
Webの開発と同じ感じでIoT機器を開発できるということでIoTの新しい選択肢なるのではないでしょうか。