**********************************************************************
セッションS2d ワーク
テーマ:Nerves Training: Elixir.Circuitsによる外部デバイスの制御
コーディネータ:高瀬 英希 氏(京都大学/JSTさきがけ),
菊池 豊 氏(高知工科大学 地域連携機構)
日時:2019/9/6(金) 9:00~10:10
参加人数:21名
**********************************************************************

■概要
・Nerves Trainingを行う
・Elixir.Circuitsでデバイスを制御する(前半・本セッション)
・mixでNervesアプリを開発する NervesHubでOTAを実行する(後半)

■自己紹介(講師・TA)
 ・高瀬 英希 (京都大学/JSTさきがけ)
 ・菊池 豊 (高知工科大学 地域連携機構)
 ・山崎 進 (北九州市立大学 国際環境工学部)
 ・Justin Schneck (Nerves Project)

■準備と概念の説明
・Nerves Training:本家のTrainingは6時間掛かりのボリュームがある
今回は2.5時間しか無いため、Elixir.Circutsを使うところ、
mixコマンドでプロジェクトを開発してNervesHubでOTAデプロイを行うところまでを行う

・資料:(一般には非公開)
 ・Google Spreadsheetで進捗を管理する

・NervesKeyが取り付けられたラズパイ0をUSBケーブルでPCに接続する
 ラズパイの外側のポートは使用しない
 内側のGadget Portを使用

・Host:開発用のPC
・Target:ラズパイ
・SDカードからファームをブートする

・NervesHub:ネットワーク通信によりクラウド越しにHostとTargetを繋ぐ

・Trainingのポリシー:極力コピペは控えて、コードやコマンドは手打ちすること。そのほうが実際の身につく

■Nervesのブートとホストからの接続、実行

・zipファイル内のnerves_training_id_rsaを~/.sshに配置しchmod 600で権限を付与

・ラズパイをUSBケーブルでPCに接続して、ssh nerves.localでssh接続→iexが立ち上がる
iexはelixirのインタプリタで、通常Ctrl+Cを2回押すと終了するがラズパイ上で
起動しているiexはexitコマンドで終了することになっている

RingLogger.next:これまでのログを表示する
RingLogger.attach:これからシステムログを表示する
RingLogger.detach:システムログを表示しない

◆トラブル:ssh接続できない
・virtualboxの場合、拡張プラグインを入れる必要がある可能性がある
device usbをboxに全部渡さないとethernetが使えない
・USBケーブルが壊れているorパワー不足が原因であることも多い


■Elixir.Circuitsを使う
・GPIOは簡単だが遅い
LEDやボタンを検知するには向いている(ので今回はCircuits.GPIOを使う)

・Hex: Elixirのライブラリやパッケージを配布するシステム

・GPIOの割り当て:ボタン2つ、方向キー5つ
 ・Circuits.GPIO.open関数でGPIOをopenしpin番号、inputかoutputか、pullupか
  pulldownかを指定する
 ・Circuits.GPIO.read関数でGPIOの状態を読むことができる
 ・Circuits.GPIO.set_interruptsでボタンの状態を表示する
  (ボタンを押すと0,離すと1)

 ・GenServer:Elixirの、プロセスを生成してこのプロセスにデータを送る、プロセス生成の機能

・ボタンの値が変わればそれを表示する関数を持つモジュールを定義し、実行してみる

・i2c:組み込みは色々な通信規格がある
i2cのライブラリ:Circuits.I2C・・・バスの名前を探すことなどができる


(セッションS3dに続く)