https://algyan.connpass.com/event/197306/
Elixir/Nerves(ナーブス)体験ハンズオン! 堅牢な組込みソフトウェアをお手軽に開発できる、Edgeデバイス・プラットフォームを体感してみよう!
応用編 - 2020/12/27ALGYAN × Seeed ×NervesJPハンズオン!1【オンライン】豪華プレゼント付! Elixir/Nerves(ナーブス)体験ハンズオン! - connpassCreative Commons
View Slide
(本日のハンズオン・スライド一覧)● すべてhttps://algyan.connpass.com/event/197306/presentation/● 基本編https://docs.google.com/presentation/d/1u7V6aR0wrWs23oGmNq6Scl6M_WRpa0eyB4lSqyOsbRM2
環境測定にチャレンジ!- 応用編 -3
応用編の進め方1. 温湿度センサを接続2. 温度を測る(↓余裕があれば)3. 湿度を測る4. GPIOと連携する4
1. 温湿度センサを接続5
温湿度センサ AHT20Industrial Grade Temperature&Humidity Sensor● I2C接続(アドレス:0x38)● 温度範囲:-40 ~ + 85 ℃● 湿度範囲:0 ~ 100%● 動作電圧:DC 2.0~5.5V6
つなぎ方右の写真にならって温湿度センサを繋いでください※RaspberryPiの 電源はONのまま でOKです。7AHT20温湿度センサLED押しボタンI2Cコネクタ(3つのうち どれでもOK)
測定~WebAPI送信まで2. まずは「温度」8
進め方1. GitHubからソースを持ってくる2. ソースの一部を編集する(あなたのハンドル名に書き換え)3. ファームウェアをビルドする4. Nerves (on RaspberryPi) へアップロードする5. Nerves (on RaspberryPi) にSSH経由でログインする6. 温度を測るコマンドを実行して、動作確認する7. 測った温度を、Azure上のWebAPIに送るコマンドを実行する8. Webページで結果を見て、動作確認する(以降のページで解説します)9
ソースを持ってくる1※VSCodeの下のターミナル(Dev Containerのコンソール)で作業してね!10こちらで操作
ソースを持ってくる2※コマンド入力して欲しい箇所には、文字の背景に薄い黄色を付けてます (コンソールに帰ってくるメッセージは黒文字のままにしてます)1. 現在いるディレクトリを確認# pwd/workspaces/nerves-algyan-devcontainer2. ホームディレクトリに移動(注:コンテナ内はrootユーザです)# pushd ~ (チルダ ”~”の前には、スペースが一個入ってます)# pwd/root11
ソースを持ってくる31. GitHubからcloneする# git clone https://github.com/NervesJP/nervesjp_basis2. 最初に居たディレクトリから見えるように、シンボリックリンクを置く# ln -s /root/nervesjp_basis /workspaces/nerves-algyan-devcontainer/nervesjp_basis3. 最初に居たディレクトリに戻って、プロジェクトのディレクトリに移動# popd# cd nervesjp_basis# pwd/workspaces/nerves-algyan-devcontainer/nervesjp_basis12※末尾はスラッシュ無し!!ラズパイ4以外の方はお知らせを!!
ソースの一部を編集ソース名:lib/sensor/web.ex9行目:@my_name "nervesjp_algyan" ご自分のハンドル名に修正13
ソースの一部を編集ソースを保存したときに、VSCodeの右下にメッセージが出る!→お気になさらず・・・ ここ14
コンパイル~アップロードまで1(Dev Containerの)ターミナルから、以下を順番に実行# mix deps.get ←ライブラリの依存関係の処理(約 1~2分程度)# mix firmware ←ビルド (初回 約 5分程度)# mix upload ←ネットワーク経由でラズパイにアップロード (約 2分程度)15
コンパイル~アップロードまで2ライブラリの依存関係の処理# mix deps.get16・・・(省略)・・・
コンパイル~アップロードまで3ビルド# mix firmware17・・・(省略)・・・進捗確認シートK列「ビルド」をチェック!
ビルドに時間が掛かるので・・・ここで一息。(休憩)18
コンパイル~アップロードまで4ネットワーク経由でRaspberryPiにアップロード# mix upload19
コンパイル~アップロードまで5※ラズパイが見つからない!ホスト名「nerves.local」で繋がらないときはIPアドレスを直接指定できます# mix upload [IPアドレス]20IPアドレスの調べ方: 自宅のルータの接続一覧を参考に・・・<その他の調べ方はこちら>
SSH経由でログイン# ssh nerves.local・・・iex(1)>(あるいは)# ssh [IPアドレス]21
接続確認1接続しているI2Cデバイスのアドレスが分かりますiex(6)> Circuits.I2C.detect_devicesDevices on I2C bus "i2c-1":* 4 (0x4) ← GROVE Base HAT* 56 (0x38) ← AHT202 devices detected on 1 I2C buses22
接続確認2IPアドレスも分かりますiex(8)> ifconfiglo: flags=[:up, :loopback, :running]inet 127.0.0.1 netmask 255.0.0.0eth0: flags=[:up, :broadcast, :running, :multicast] ← 有線LANinet 192.168.0.4 netmask 255.255.255.0 broadcast 192.168.0.255wlan0: flags=[:up, :broadcast, :running, :multicast] ← 無線LANinet 192.168.11.100 netmask 255.255.255.0 broadcast 192.168.11.25523
温度を測定するコマンドラインに入力 ※[TAB]キーで補完できるよ!iex(1)> NervesjpBasis.Sensor.Aht20.print_temp> temp: 24.1 (degree Celsius):ok24
Web APIに送るコマンドラインに入力iex(2)> NervesjpBasis.Sensor.Web.senddata> send: [name: nervesjp_algyan] / temp: 23.5 (degree Celsius):ok25
Webページをチェックhttps://phx.japaneast.cloudapp.azure.com/chart-temperature26自分のハンドル名とデータが表示された!(縦軸)温度℃進捗確認シートL列「温度送信」をチェック!
入力の省略iex(1)> NervesjpBasis.Sensor.Aht20.print_temp入力が長いので、「NervesjpBasis.Sensor」を省略したい・・・iex(4)> alias NervesjpBasis.Sensor.Aht20 ←「alias」を使うNervesjpBasis.Sensor.Aht20iex(5)> Aht20.print_humi> humi: 27.3 (%)):ok27
ソースファイル解説1● aht20.exセンサAHT20の制御モジュール28read_from_aht20/0 I2C通信で温・湿度測定temp/0 温度の値だけを取得print_temp/0 温度の値を文字列で表示humi/0 湿度の値だけを取得print_humi/0 湿度の値を文字列で表示convert/1 RAWデータを℃・%に換算
ソースファイル解説2● web.exWebAPIとのやりとりモジュール29body/1 JSON部の生成header/0 ヘッダ部の生成post/2 POSTするsenddata/0 温度を取得してPOSTまで
測定~WebAPI送信まで2. 次は「湿度」30
進め方1. 湿度を測るコマンドを実行して、動作確認する2. 一旦、Nervesからログアウトする3. 先ほど使った「測った湿度を、Azure上のWebAPIに送る」関数を修正。a. ファイル「web.ex」 23行目付近「senddata」関数b. 温度と湿度を送るようコードを書き換えc. ビルド、アップロード4. Nervesにログインする5. 測った温度を、Azure上のWebAPIに送るコマンドを実行する6. Webページで結果を見て、動作確認する(以降のページで解説します)31
湿度を測定するコマンドラインに入力iex(1)> NervesjpBasis.Sensor.Aht20.print_humi> humi: 34.7 (%):ok32
一旦、RaspberryPiからログアウトコマンドラインに入力iex(1)> exitConnection to nerves.local closed.33
senddata関数を修正ソースファイル「web.ex」を開く(場所は右記のイラストを参考に・・・)34
senddata関数を修正この関数を修正して、湿度情報を送るようにする3525行目付近
修正箇所その1<修正前>{:ok, {temp, _}} = Aht20.read_from_aht20()<修正後>{:ok, {_, humi}} = Aht20.read_from_aht20()36
修正箇所その2<修正前>IO.puts(" > send: [name: #{@my_name}] / temp: #{inspect(temp)} (degree Celsius)")<修正後>IO.puts(" > send: [name: #{@my_name}] / temp: #{inspect(humi)} (%)")37
修正箇所その3<修正前>post(temp, @url_temp)<修正後>post(humi, @url_humi)38
ビルド~アップロードまでビルドからアップロードまで一気にすすめる# mix firmware && mix upload39
SSH経由でログイン# ssh nerves.local・・・iex(1)>(あるいは)# ssh [IPアドレス]40
Web APIに送るコマンドラインに入力iex(2)> NervesjpBasis.Sensor.Web.senddata> send: [name: nervesjp_algyan] / humi: 43.4 (%):ok41
Webページをチェックhttps://phx.japaneast.cloudapp.azure.com/chart-humidity42自分のハンドル名とデータが表示された!(縦軸)湿度%進捗確認シートM列「湿度送信」をチェック!
ボタンを押したら、測定とデータ転送3. さらに応用編43
進め方1. ボタンの検出をスタートする2. ボタンを押すa. (以下を自動的に実行)b. 温度を測るコマンドを実行するc. 測った温度をAzure上のWebAPIに送る3. Webページで結果を見る4. ここまでの詳細を、簡単に解説44
ボタンの検出をスタートするコマンドラインに入力iex(3)> NervesjpBasis.Sensor.Webbtn.start_link{:ok, #PID<0.1944.0>}45
ボタンを押す> 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列「ボタン送信」をチェック!
ソースファイル解説3● webbtn.exボタン入力の受付モジュール※Elixirの特徴「並行処理」の仕組みを使って ボタン検出をバックグラウンドで実行してます。47
ソースファイル解説448start_link バックグラウンドの処理を起動init/1 初期化の処理(起動時に自動呼び出し)handle_info/2 ボタンを押したときのイベント処理
お疲れ様でした!今回は、ここまで~49進捗確認シートO列に「今日の感想」をご記入ください!!
いくつか補足します~後片付け50
ソースファイル解説5● web.exWebAPIとのやりとりモジュール51body/1 JSON部の生成header/0 ヘッダ部の生成post/2 POSTするsenddata/0 温度を取得してPOSTまで
ソースファイル解説5● web.exWebAPIとのやりとりモジュール52body/1 JSON部の生成header/0 ヘッダ部の生成post/2 POSTするsenddata/0 温度と”湿度を”取得してPOSTまでここを修正してみる
ソースファイル解説5● web.exWebAPIとのやりとりモジュール53body/1 JSON部の生成header/0 ヘッダ部の生成post/2 POSTするsenddata/0 温度と”湿度を”取得してPOSTまで“answer”をチェックアウトすると回答例が載ってます
Raspberry Piの止め方1. そのまま電源を切って頂いてOKです。(Nervesは電断対応されているので、ぶち切りOKです。2. どうしてもコマンドで止めたい場合・・・iex> System.stop(停止して、SSHにログインできなくなる)54
本日のソースファイルをコピー1Dockerのコンテナを消してしまうと、/rootディレクトリ以下のデータが消えてしまいます・・・1. 現在いるディレクトリを確認# pwd/workspaces/nerves-algyan-devcontainer55
本日のソースファイルをコピー21. シンボリックリンクを消す# rm ./nervesjp_basis2. /rootディレクトリの中の「nervesjp_basis」ディレクトリをコピーして持ってくる# cp -r /root/nervesjp_basis /workspaces/nerves-algyan-devcontainer/3. これで、本日の作業ディレクトリ「nervesjp_basis」が、ホストOS側の、dev containerのフォルダに移りました。56
(補足)Q. なぜ、わざわざ /root ディレクトリで、cloneして作業したの?A. ホストOSがWindowsの場合、 Windows側のフォルダの中でビルドすると、 ビルド時間が大変長くなるため・・・(ビルドの度に、5分以上掛かる^^;57
ファームウェアの書き込み方法1. SDカードライタをダウンロードhttps://github.com/fhunleth/fwup/releases/tag/v1.8.32. ファームウェアをダウンロードhttps://github.com/NervesJP/nervesjp_basis/releases/tag/v1.03. アップロード※コマンドプロンプトを管理者で開く引数にファームウェアを指定C:\...> fwup nervesjp_basis.fw 58
コミュニティーについて今後の自己研鑽にご興味がありましたら、是非ご参加下さい1. IoT ALGYANhttps://algyan.connpass.com/2. Seeed UGhttps://seeed.connpass.com/3. NervesJPhttps://nerves-jp.connpass.com/ Slack59
スタッフの皆様、ご参加頂いた全ての皆様、有り難うございました!@myasu60