LoginSignup
15
3

More than 3 years have passed since last update.

Nervesで湯婆婆を実装してみる

Last updated at Posted at 2020-11-10

はじめに :santa: :santa_tone1: :santa_tone2:

今年のごくワタクシ的Nervesニュース

0. 準備

  • まずはElixirをインストールしましょう
  • 手前味噌な記事ですがインストールなどをご参照ください
    • asdfでのインストールがオススメです
  • Nervesを始めるにはもう少し準備が必要です
  • 公式のInstallationがわかりやすいです
    • 公式のInstallationに書いていないこととしては、SSHの鍵を作るところが書かれていません
    • すでに~/.ssh/id_rsa.pub等がある場合はそれがそのまま使えます
    • そんなフォルダがそもそも無いよという場合は下記をご参照ください
  • 日本語がお好みの方は下記の記事を参照するのがよいでしょう

1. プロジェクト作成

$ mix nerves.new yubaba
$ cd yubaba
$ export MIX_TARGET=rpi2
$ mix deps.get
  • プロジェクトの雛形がつくられます
  • いっぱいファイルができます
  • Elixirがはじめての方はそんなものだと流してください
  • 慣れるといつもの景色にみえてきます
  • 私はrpi2を使っていますがその他のターゲットをお使いの方は、Targetsから値(TAG)を選んでください

2. プログラムを書く

Wi-Fi設定

  • LANケーブルで接続する場合は、下記の変更は必要ではありません
  • Wi-Fiで接続する場合には、下記を参考に、"wlan0"からはじまるタプル({...})のところにご利用のWi-Fi設定を書いてください
  • VintageNet Cookbook — WiFi
config/target.exs
config :vintage_net,
  regulatory_domain: "US",
  config: [
    {"usb0", %{type: VintageNetDirect}},
    {"eth0",
     %{
       type: VintageNetEthernet,
       ipv4: %{method: :dhcp}
     }},
    {"wlan0",
     %{
       type: VintageNetWiFi,
       vintage_net_wifi: %{
         networks: [
           %{
             key_mgmt: :wpa_psk,
             ssid: "your_ssid",
             psk: "your_psk"
           }
         ]
       },
       ipv4: %{method: :dhcp}
     }}
  ]

Yubabaモジュール

lib/yubaba.ex
defmodule Yubaba do
  def main do
    name = IO.gets("契約書だよ。そこに名前を書きな。\n") |> String.trim()

    IO.puts("フン。#{name}というのかい。贅沢な名だねぇ。")
    new_name = String.codepoints(name) |> Enum.random()

    IO.puts("今からお前の名前は#{new_name}だ。いいかい、#{new_name}だよ。分かったら返事をするんだ、#{new_name}!!")
  end
end
  • |>Pipe operatorと呼ばれるものでして、前の計算結果を次の関数の第一引数に入れて計算をしてくれます
  • 入力文字列から一文字を選ぶ(名前を奪う)ところは、String.codepoints/1関数で要素が1文字ずつのリストにして、そのリストの中から1要素を適当に選んでくれるEnum.random/1関数を使うことでnew_nameを求めています
  • Module.function/1なんていきなりさらっと書いていますが、/のうしろは引数の数です
    • Elixir界でよくみる表記方法です
  • カンの良い方はお気づきの通り、Elixirで湯婆婆を実装してみる で書いたコードと全く同じです
  • IoTだからと書き方を変えないといけないということに出くわすことはほとんどありません(そこまで複雑なことをやったことがないという理由もあります)

3. 実行

$ mix firmware
  • ↑このコマンドでファームウェアができます
  • microSDカードをホスト(開発マシン)に差し込んでファームウェアをmicroSDカードにこんがり焼きます
$ mix burn
  • こんがり焼き上がりましたら、Raspberry Pi 2に差し込んで電源ON !
  • 少し待つとping nerves.localが通るようになるとおもいます
  • このまま実行してもよいのですが、Elixirで湯婆婆を実装してみる と違うことをやってみましょう

7-2_目覚ましアラーム_honeko入.jpg

  • (この記事ではいろいろと繋いでいるもののことは一切説明しておりません:relaxed:)

4. プログラムを書く(その2)

  • Yubaba.main/0の呼び出しをrootfs_overlay/etc/iex.exsの末尾に追加します
  • こうしておくことでssh接続したときに、すぐに湯婆婆が動き(イゴキ)始めます
rootfs_overlay/etc/iex.exs
# Add Toolshed helpers to the IEx session
use Toolshed

if RingLogger in Application.get_env(:logger, :backends, []) do
  IO.puts """
  RingLogger is collecting log messages from Elixir and Linux. To see the
  messages, either attach the current IEx session to the logger:

    RingLogger.attach

  or print the next messages in the log:

    RingLogger.next
  """
end

Yubaba.main # add

5. ファームウェアアップデート

$ mix firmware
  • Raspberry Pi 2からmicroSDカードを抜いて、ホスト(開発マシン)に差し込んでmix burnで焼き直すこともできますが、もっと便利な方法をご紹介します
$ mix upload
  • このコマンドを使うことで、Raspberry Pi 2からmicroSDカードを差し込んだままでファームウェアのアップデートができるのです!
  • これは文字だけでは伝わりにくいのですがけっこう便利です

6. 実行

  • いよいよ実行します
  • mix upload後少し待って、ping nerves.localが通るようになったことを確認してください
$ ssh nerves.local                                                                                              
Interactive Elixir (1.10.4) - press Ctrl+C to exit (type h() ENTER for help)
Toolshed imported. Run h(Toolshed) for more info.
RingLogger is collecting log messages from Elixir and Linux. To see the
messages, either attach the current IEx session to the logger:

  RingLogger.attach

or print the next messages in the log:

  RingLogger.next

契約書だよ。そこに名前を書きな。
荻野千尋
フン。荻野千尋というのかい。贅沢な名だねぇ。
今からお前の名前はだ。いいかい、だよ。分かったら返事をするんだ、
  • sshしたら湯婆婆から名前を聞かれます!
  • :cry: 文字化けしました
  • 気を取り直して
$ ssh nerves.local                                                                                              
Interactive Elixir (1.10.4) - press Ctrl+C to exit (type h() ENTER for help)
Toolshed imported. Run h(Toolshed) for more info.
RingLogger is collecting log messages from Elixir and Linux. To see the
messages, either attach the current IEx session to the logger:

  RingLogger.attach

or print the next messages in the log:

  RingLogger.next

契約書だよ。そこに名前を書きな。
abc
フン。abcというのかい。贅沢な名だねぇ。
今からお前の名前はbだ。いいかい、bだよ。分かったら返事をするんだ、b!!
  • アスキー文字ならうまく行きました :tada::tada::tada:

Wrapping Up :lgtm: :qiita-fabicon: :lgtm:

  • だいぶ気が早いですがアドベントカレンダーネタを書きました
  • 文字化けのところはたぶん、Buildrootでしたっけ!? それでサムシングをカスタマイズすると解決できるのだとおもいます
  • 解決は他の方に任せるとしてこのへんで筆を置きます :santa: :santa_tone1: :santa_tone2:
  • Enjoy Elixir !!! :rocket::rocket::rocket:
  • 4日目は、@pojiroさんのなぜ僕はNervesに期待するのか です。続けてお楽しみください。
    • 熱い記事!!! :fire::fire::fire::rocket::rocket::rocket::rocket::rocket:
15
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
15
3