$30 off During Our Annual Pro Sale. View Details »

ANS-HandsOn-202012

myasu
December 27, 2020

 ANS-HandsOn-202012

https://algyan.connpass.com/event/197306/

Elixir/Nerves(ナーブス)体験ハンズオン!
堅牢な組込みソフトウェアをお手軽に開発できる、Edgeデバイス・プラットフォームを体感してみよう!

myasu

December 27, 2020
Tweet

More Decks by myasu

Other Decks in Technology

Transcript

  1. 応用編 - 2020/12/27
    ALGYAN × Seeed ×
    NervesJPハンズオン!
    1
    【オンライン】豪華プレゼント付! Elixir/Nerves(ナーブス)体験ハンズオン! - connpass
    Creative Commons

    View Slide

  2. (本日のハンズオン・スライド一覧)
    ● すべて
    https://algyan.connpass.com/event/197306/presentation/
    ● 基本編
    https://docs.google.com/presentation/d/1u7V6aR0wrWs23oGmNq
    6Scl6M_WRpa0eyB4lSqyOsbRM
    2

    View Slide

  3. 環境測定にチャレンジ!
    - 応用編 -
    3

    View Slide

  4. 応用編の進め方
    1. 温湿度センサを接続
    2. 温度を測る
    (↓余裕があれば)
    3. 湿度を測る
    4. GPIOと連携する
    4

    View Slide

  5. 1. 温湿度センサを
    接続
    5

    View Slide

  6. 温湿度センサ AHT20
    Industrial Grade Temperature&Humidity Sensor
    ● I2C接続(アドレス:0x38)
    ● 温度範囲:-40 ~ + 85 ℃
    ● 湿度範囲:0 ~ 100%
    ● 動作電圧:DC 2.0~5.5V
    6

    View Slide

  7. つなぎ方
    右の写真にならって
    温湿度センサを繋いでください
    ※RaspberryPiの
     電源はONのまま
     でOKです。
    7
    AHT20
    温湿度センサ
    LED
    押しボタン
    I2Cコネクタ
    (3つのうち
     どれでもOK)

    View Slide

  8. 測定~WebAPI送信まで
    2. まずは「温度」
    8

    View Slide

  9. 進め方
    1. GitHubからソースを持ってくる
    2. ソースの一部を編集する(あなたのハンドル名に書き換え)
    3. ファームウェアをビルドする
    4. Nerves (on RaspberryPi) へアップロードする
    5. Nerves (on RaspberryPi) にSSH経由でログインする
    6. 温度を測るコマンドを実行して、動作確認する
    7. 測った温度を、Azure上のWebAPIに送るコマンドを実行する
    8. Webページで結果を見て、動作確認する
    (以降のページで解説します)
    9

    View Slide

  10. ソースを持ってくる1
    ※VSCodeの下のターミナル(Dev Containerのコンソール)で作業してね!
    10
    こちらで操作

    View Slide

  11. ソースを持ってくる2
    ※コマンド入力して欲しい箇所には、文字の背景に薄い黄色を付けてます
     (コンソールに帰ってくるメッセージは黒文字のままにしてます)
    1. 現在いるディレクトリを確認
    # pwd
    /workspaces/nerves-algyan-devcontainer
    2. ホームディレクトリに移動(注:コンテナ内はrootユーザです)
    # pushd ~    (チルダ ”~”の前には、スペースが一個入ってます)
    # pwd
    /root
    11

    View Slide

  12. ソースを持ってくる3
    1. GitHubからcloneする
    # git clone https://github.com/NervesJP/nervesjp_basis
    2. 最初に居たディレクトリから見えるように、シンボリックリンクを置く
    # ln -s /root/nervesjp_basis /workspaces/nerves-algyan-devcontainer/nervesjp_basis
    3. 最初に居たディレクトリに戻って、プロジェクトのディレクトリに移動
    # popd
    # cd nervesjp_basis
    # pwd
    /workspaces/nerves-algyan-devcontainer/nervesjp_basis
    12
    ※末尾はスラッシュ無し!!
    ラズパイ4以外の方はお
    知らせを!!

    View Slide

  13. ソースの一部を編集
    ソース名:lib/sensor/web.ex
    9行目:@my_name "nervesjp_algyan" 
    ご自分のハンドル名に修正
    13

    View Slide

  14. ソースの一部を編集
    ソースを保存したときに、VSCodeの右下にメッセージが出る!
    →お気になさらず・・・
             ここ
    14

    View Slide

  15. コンパイル~アップロードまで1
    (Dev Containerの)ターミナルから、以下を順番に実行
    # mix deps.get ←ライブラリの依存関係の処理(約 1~2分程度)
    # mix firmware ←ビルド (初回 約 5分程度)
    # mix upload ←ネットワーク経由で
    ラズパイにアップロード (約 2分程度)
    15

    View Slide

  16. コンパイル~アップロードまで2
    ライブラリの依存関係の処理
    # mix deps.get
    16
    ・・・(省略)・・・

    View Slide

  17. コンパイル~アップロードまで3
    ビルド
    # mix firmware
    17
    ・・・(省略)・・・
    進捗確認シート
    K列「ビルド」をチェック!

    View Slide

  18. ビルドに時間が掛かるので・・・ここで一息。
    (休憩)
    18

    View Slide

  19. コンパイル~アップロードまで4
    ネットワーク経由でRaspberryPiにアップロード
    # mix upload
    19

    View Slide

  20. コンパイル~アップロードまで5
    ※ラズパイが見つからない!
    ホスト名「nerves.local」
    で繋がらないときは
    IPアドレスを直接
    指定できます
    # mix upload [IPアドレス]
    20
    IPアドレスの調べ方:
     自宅のルータの接続一覧を参考に・・・
    <その他の調べ方はこちら>

    View Slide

  21. SSH経由でログイン
    # ssh nerves.local
    ・・・
    iex(1)>
    (あるいは)
    # ssh [IPアドレス]
    21

    View Slide

  22. 接続確認1
    接続しているI2Cデバイスのアドレスが分かります
    iex(6)> Circuits.I2C.detect_devices
    Devices on I2C bus "i2c-1":
    * 4 (0x4) ← GROVE Base HAT
    * 56 (0x38) ← AHT20
    2 devices detected on 1 I2C buses
    22

    View Slide

  23. 接続確認2
    IPアドレスも分かります
    iex(8)> ifconfig
    lo: flags=[:up, :loopback, :running]
    inet 127.0.0.1 netmask 255.0.0.0
    eth0: flags=[:up, :broadcast, :running, :multicast] ← 有線LAN
    inet 192.168.0.4 netmask 255.255.255.0 broadcast 192.168.0.255
    wlan0: flags=[:up, :broadcast, :running, :multicast] ← 無線LAN
    inet 192.168.11.100 netmask 255.255.255.0 broadcast 192.168.11.255
    23

    View Slide

  24. 温度を測定する
    コマンドラインに入力 ※[TAB]キーで補完できるよ!
    iex(1)> NervesjpBasis.Sensor.Aht20.print_temp
    > temp: 24.1 (degree Celsius)
    :ok
    24

    View Slide

  25. Web APIに送る
    コマンドラインに入力
    iex(2)> NervesjpBasis.Sensor.Web.senddata
    > send: [name: nervesjp_algyan] / temp: 23.5 (degree Celsius)
    :ok
    25

    View Slide

  26. Webページをチェック
    https://phx.japaneast.cloudapp.azure.com/chart-temperature
    26
    自分のハンドル名と
    データが表示された!
    (縦軸)温度℃
    進捗確認シート
    L列「温度送信」をチェック!

    View Slide

  27. 入力の省略
    iex(1)> NervesjpBasis.Sensor.Aht20.print_temp
    入力が長いので、「NervesjpBasis.Sensor」を省略したい・・・
    iex(4)> alias NervesjpBasis.Sensor.Aht20 ←「alias」を使う
    NervesjpBasis.Sensor.Aht20
    iex(5)> Aht20.print_humi
    > humi: 27.3 (%))
    :ok
    27

    View Slide

  28. ソースファイル解説1
    ● aht20.ex
    センサAHT20の制御モジュール
    28
    read_from_aht20/0 I2C通信で温・湿度測定
    temp/0 温度の値だけを取得
    print_temp/0 温度の値を文字列で表示
    humi/0 湿度の値だけを取得
    print_humi/0 湿度の値を文字列で表示
    convert/1 RAWデータを℃・%に換算

    View Slide

  29. ソースファイル解説2
    ● web.ex
    WebAPIとのやりとりモジュール
    29
    body/1 JSON部の生成
    header/0 ヘッダ部の生成
    post/2 POSTする
    senddata/0 温度を
    取得してPOSTまで

    View Slide

  30. 測定~WebAPI送信まで
    2. 次は「湿度」
    30

    View Slide

  31. 進め方
    1. 湿度を測るコマンドを実行して、動作確認する
    2. 一旦、Nervesからログアウトする
    3. 先ほど使った「測った湿度を、Azure上のWebAPIに送る」関数を修
    正。
    a. ファイル「web.ex」 23行目付近「senddata」関数
    b. 温度と湿度を送るようコードを書き換え
    c. ビルド、アップロード
    4. Nervesにログインする
    5. 測った温度を、Azure上のWebAPIに送るコマンドを実行する
    6. Webページで結果を見て、動作確認する
    (以降のページで解説します)
    31

    View Slide

  32. 湿度を測定する
    コマンドラインに入力
    iex(1)> NervesjpBasis.Sensor.Aht20.print_humi
    > humi: 34.7 (%)
    :ok
    32

    View Slide

  33. 一旦、RaspberryPiからログアウト
    コマンドラインに入力
    iex(1)> exit
    Connection to nerves.local closed.
    33

    View Slide

  34. senddata関数を修正
    ソースファイル「web.ex」を開く
    (場所は右記のイラストを参考に・・・)
    34

    View Slide

  35. senddata関数を修正
    この関数を修正して、湿度情報を送るようにする
    35
    25行目付近

    View Slide

  36. 修正箇所
    その1
    <修正前>
    {:ok, {temp, _}} = Aht20.read_from_aht20()
    <修正後>
    {:ok, {_, humi}} = Aht20.read_from_aht20()
    36

    View Slide

  37. 修正箇所
    その2
    <修正前>
    IO.puts(" > send: [name: #{@my_name}] / temp: #{inspect(temp)} (degree Celsius)")
    <修正後>
    IO.puts(" > send: [name: #{@my_name}] / temp: #{inspect(humi)} (%)")
    37

    View Slide

  38. 修正箇所
    その3
    <修正前>
    post(temp, @url_temp)
    <修正後>
    post(humi, @url_humi)
    38

    View Slide

  39. ビルド~アップロードまで
    ビルドからアップロードまで一気にすすめる
    # mix firmware && mix upload
    39

    View Slide

  40. SSH経由でログイン
    # ssh nerves.local
    ・・・
    iex(1)>
    (あるいは)
    # ssh [IPアドレス]
    40

    View Slide

  41. Web APIに送る
    コマンドラインに入力
    iex(2)> NervesjpBasis.Sensor.Web.senddata
    > send: [name: nervesjp_algyan] / humi: 43.4 (%)
    :ok
    41

    View Slide

  42. Webページをチェック
    https://phx.japaneast.cloudapp.azure.com/chart-humidity
    42
    自分のハンドル名と
    データが表示された!
    (縦軸)湿度%
    進捗確認シート
    M列「湿度送信」をチェック!

    View Slide

  43. ボタンを押したら、測定とデータ転送
    3. さらに応用編
    43

    View Slide

  44. 進め方
    1. ボタンの検出をスタートする
    2. ボタンを押す
    a. (以下を自動的に実行)
    b. 温度を測るコマンドを実行する
    c. 測った温度をAzure上のWebAPIに送る
    3. Webページで結果を見る
    4. ここまでの詳細を、簡単に解説
    44

    View Slide

  45. ボタンの検出をスタートする
    コマンドラインに入力
    iex(3)> NervesjpBasis.Sensor.Webbtn.start_link
    {:ok, #PID<0.1944.0>}
    45

    View Slide

  46. ボタンを押す
    > send: [name: nervesjp_algyan] / temp: 21.7 (degree Celsius)
    > send: [name: nervesjp_algyan] / temp: 21.7 (degree Celsius)
    > send: [name: nervesjp_algyan] / temp: 21.6 (degree Celsius)
    > send: [name: nervesjp_algyan] / temp: 21.7 (degree Celsius)
    > send: [name: nervesjp_algyan] / temp: 21.7 (degree Celsius)
    46
    送信中に点灯(200ms)
    押しボタンON
    ボタンを押すたびに送信
    進捗確認シート
    N列「ボタン送信」をチェック!

    View Slide

  47. ソースファイル解説3
    ● webbtn.ex
    ボタン入力の受付モジュール
    ※Elixirの特徴「並行処理」の仕組みを使って
     ボタン検出をバックグラウンドで実行してます。
    47

    View Slide

  48. ソースファイル解説4
    48
    start_link バックグラウンドの処理を起動
    init/1 初期化の処理
    (起動時に自動呼び出し)
    handle_info/2 ボタンを押したときのイベント
    処理

    View Slide

  49. お疲れ様でした!
    今回は、ここまで~
    49
    進捗確認シート
    O列に「今日の感想」を
    ご記入ください!!

    View Slide

  50. いくつか補足します~
    後片付け
    50

    View Slide

  51. ソースファイル解説5
    ● web.ex
    WebAPIとのやりとりモジュール
    51
    body/1 JSON部の生成
    header/0 ヘッダ部の生成
    post/2 POSTする
    senddata/0 温度を
    取得してPOSTまで

    View Slide

  52. ソースファイル解説5
    ● web.ex
    WebAPIとのやりとりモジュール
    52
    body/1 JSON部の生成
    header/0 ヘッダ部の生成
    post/2 POSTする
    senddata/0 温度と”湿度を”
    取得してPOSTまで
    ここを修正してみる

    View Slide

  53. ソースファイル解説5
    ● web.ex
    WebAPIとのやりとりモジュール
    53
    body/1 JSON部の生成
    header/0 ヘッダ部の生成
    post/2 POSTする
    senddata/0 温度と”湿度を”
    取得してPOSTまで
    “answer”をチェックアウトすると回答例が載ってます

    View Slide

  54. Raspberry Piの止め方
    1. そのまま電源を切って頂いてOKです。
    (Nervesは電断対応されているので、ぶち切りOKです。
    2. どうしてもコマンドで止めたい場合・・・
    iex> System.stop
    (停止して、SSHに
    ログインできなくなる)
    54

    View Slide

  55. 本日のソースファイルをコピー1
    Dockerのコンテナを消してしまうと、
    /rootディレクトリ以下のデータが消えてしまいます・・・
    1. 現在いるディレクトリを確認
    # pwd
    /workspaces/nerves-algyan-devcontainer
    55

    View Slide

  56. 本日のソースファイルをコピー2
    1. シンボリックリンクを消す
    # rm ./nervesjp_basis
    2. /rootディレクトリの中の「nervesjp_basis」ディレクトリを
    コピーして持ってくる
    # cp -r /root/nervesjp_basis /workspaces/nerves-algyan-devcontainer/
    3. これで、本日の作業ディレクトリ「nervesjp_basis」が、
    ホストOS側の、dev containerのフォルダに移りました。
    56

    View Slide

  57. (補足)
    Q. なぜ、わざわざ /root ディレクトリで、cloneして作業したの?
    A. ホストOSがWindowsの場合、
      Windows側のフォルダの中でビルドすると、
      ビルド時間が大変長くなるため・・・(ビルドの度に、5分以上掛かる^^;
    57

    View Slide

  58. ファームウェアの書き込み方法
    1. SDカードライタをダウンロード
    https://github.com/fhunleth/fwup/releases/tag/v1.8.3
    2. ファームウェアをダウンロード
    https://github.com/NervesJP/nervesjp_basis/releases/tag/v1.0
    3. アップロード
    ※コマンドプロンプトを管理者で開く
    引数にファームウェアを指定
    C:\...> fwup nervesjp_basis.fw 58

    View Slide

  59. コミュニティーについて
    今後の自己研鑽にご興味がありましたら、是非ご参加下さい
    1. IoT ALGYAN
    https://algyan.connpass.com/
    2. Seeed UG
    https://seeed.connpass.com/
    3. NervesJP
    https://nerves-jp.connpass.com/ Slack
    59

    View Slide

  60. スタッフの皆様、ご参加頂いた全ての皆様、有り難うございました!
    @myasu
    60

    View Slide