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

ANS-HandsOn-202012

51198d0c7643e9c6d8d491533eead6c9?s=47 myasu
December 27, 2020

 ANS-HandsOn-202012

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

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

51198d0c7643e9c6d8d491533eead6c9?s=128

myasu

December 27, 2020
Tweet

Transcript

  1. 応用編 - 2020/12/27 ALGYAN × Seeed × NervesJPハンズオン! 1 【オンライン】豪華プレゼント付!

    Elixir/Nerves(ナーブス)体験ハンズオン! - connpass Creative Commons
  2. (本日のハンズオン・スライド一覧) • すべて https://algyan.connpass.com/event/197306/presentation/ • 基本編 https://docs.google.com/presentation/d/1u7V6aR0wrWs23oGmNq 6Scl6M_WRpa0eyB4lSqyOsbRM 2

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

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

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

  6. 温湿度センサ AHT20 Industrial Grade Temperature&Humidity Sensor • I2C接続(アドレス:0x38) • 温度範囲:-40

    ~ + 85 ℃ • 湿度範囲:0 ~ 100% • 動作電圧:DC 2.0~5.5V 6
  7. つなぎ方 右の写真にならって 温湿度センサを繋いでください ※RaspberryPiの  電源はONのまま  でOKです。 7 AHT20 温湿度センサ LED

    押しボタン I2Cコネクタ (3つのうち  どれでもOK)
  8. 測定~WebAPI送信まで 2. まずは「温度」 8

  9. 進め方 1. GitHubからソースを持ってくる 2. ソースの一部を編集する(あなたのハンドル名に書き換え) 3. ファームウェアをビルドする 4. Nerves (on

    RaspberryPi) へアップロードする 5. Nerves (on RaspberryPi) にSSH経由でログインする 6. 温度を測るコマンドを実行して、動作確認する 7. 測った温度を、Azure上のWebAPIに送るコマンドを実行する 8. Webページで結果を見て、動作確認する (以降のページで解説します) 9
  10. ソースを持ってくる1 ※VSCodeの下のターミナル(Dev Containerのコンソール)で作業してね! 10 こちらで操作

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

    # pushd ~    (チルダ ”~”の前には、スペースが一個入ってます) # pwd /root 11
  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以外の方はお 知らせを!!
  13. ソースの一部を編集 ソース名:lib/sensor/web.ex 9行目:@my_name "nervesjp_algyan"  ご自分のハンドル名に修正 13

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

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

    firmware ←ビルド (初回 約 5分程度) # mix upload ←ネットワーク経由で ラズパイにアップロード (約 2分程度) 15
  16. コンパイル~アップロードまで2 ライブラリの依存関係の処理 # mix deps.get 16 ・・・(省略)・・・

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

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

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

  20. コンパイル~アップロードまで5 ※ラズパイが見つからない! ホスト名「nerves.local」 で繋がらないときは IPアドレスを直接 指定できます # mix upload [IPアドレス]

    20 IPアドレスの調べ方:  自宅のルータの接続一覧を参考に・・・ <その他の調べ方はこちら>
  21. SSH経由でログイン # ssh nerves.local ・・・ iex(1)> (あるいは) # ssh [IPアドレス]

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

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

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

  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
  28. ソースファイル解説1 • aht20.ex センサAHT20の制御モジュール 28 read_from_aht20/0 I2C通信で温・湿度測定 temp/0 温度の値だけを取得 print_temp/0

    温度の値を文字列で表示 humi/0 湿度の値だけを取得 print_humi/0 湿度の値を文字列で表示 convert/1 RAWデータを℃・%に換算
  29. ソースファイル解説2 • web.ex WebAPIとのやりとりモジュール 29 body/1 JSON部の生成 header/0 ヘッダ部の生成 post/2

    POSTする senddata/0 温度を 取得してPOSTまで
  30. 測定~WebAPI送信まで 2. 次は「湿度」 30

  31. 進め方 1. 湿度を測るコマンドを実行して、動作確認する 2. 一旦、Nervesからログアウトする 3. 先ほど使った「測った湿度を、Azure上のWebAPIに送る」関数を修 正。 a. ファイル「web.ex」 23行目付近「senddata」関数

    b. 温度と湿度を送るようコードを書き換え c. ビルド、アップロード 4. Nervesにログインする 5. 測った温度を、Azure上のWebAPIに送るコマンドを実行する 6. Webページで結果を見て、動作確認する (以降のページで解説します) 31
  32. 湿度を測定する コマンドラインに入力 iex(1)> NervesjpBasis.Sensor.Aht20.print_humi > humi: 34.7 (%) :ok 32

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

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

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

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

    {_, humi}} = Aht20.read_from_aht20() 36
  37. 修正箇所 その2 <修正前> IO.puts(" > send: [name: #{@my_name}] / temp:

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

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

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

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

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

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

  44. 進め方 1. ボタンの検出をスタートする 2. ボタンを押す a. (以下を自動的に実行) b. 温度を測るコマンドを実行する c.

    測った温度をAzure上のWebAPIに送る 3. Webページで結果を見る 4. ここまでの詳細を、簡単に解説 44
  45. ボタンの検出をスタートする コマンドラインに入力 iex(3)> NervesjpBasis.Sensor.Webbtn.start_link {:ok, #PID<0.1944.0>} 45

  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列「ボタン送信」をチェック!
  47. ソースファイル解説3 • webbtn.ex ボタン入力の受付モジュール ※Elixirの特徴「並行処理」の仕組みを使って  ボタン検出をバックグラウンドで実行してます。 47

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

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

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

  51. ソースファイル解説5 • web.ex WebAPIとのやりとりモジュール 51 body/1 JSON部の生成 header/0 ヘッダ部の生成 post/2

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

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

    POSTする senddata/0 温度と”湿度を” 取得してPOSTまで “answer”をチェックアウトすると回答例が載ってます
  54. Raspberry Piの止め方 1. そのまま電源を切って頂いてOKです。 (Nervesは電断対応されているので、ぶち切りOKです。 2. どうしてもコマンドで止めたい場合・・・ iex> System.stop (停止して、SSHに

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

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

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

    3. NervesJP https://nerves-jp.connpass.com/ Slack 59
  60. スタッフの皆様、ご参加頂いた全ての皆様、有り難うございました! @myasu 60