LoginSignup
6
0

More than 1 year has passed since last update.

2021/12/18(土) の回です。
2021/12/19(日) 04:59 くらいに書き終わりました。
遅れて :pray::pray_tone1::pray_tone2::pray_tone3::pray_tone4::pray_tone5:

はじめに

Elixirを楽しんでいますか:bangbang::bangbang::bangbang:
Nervesを楽しんでいますか:bangbang::bangbang::bangbang:

タイトルはだいぶ大上段に構えました。
はじめに言っておくと、この記事の内容は、IoTの猛者だ! という方には物足りない記事だとおもいます。
次のような人には合うとおもいます。
タンスの肥やしになってしまっているRaspberry Piをお持ちの方です。
そういう方は、久々に引っ張り出してきて電子工作を久しぶりにやってみようかなあという気持ちを湧き起こす、血湧き肉躍る内容にしています。
ついでに、コワくない関数型言語Elixirの世界にどっぷり浸かってください。

What is Elixir?, What is Nerves?

いま、日本で一番Nervesを楽しんでいる三銃士です。

NervesJP勢、左から @myasu さん、 @takasehideki 先生、 @pojiro さん。

Nervesは、IoTをElixirで楽しめるナウでヤングでcoolなすごいやつです。

Nervesは、誤解を恐れずに言えばElixir専用OS!!! という言い方が一番しっくりきます。
だって、sshで中に入ったら iex> しかできないし で一生Elixirだけを楽しめます:rocket::rocket::rocket:

なんだろう:interrobang: と心がざわついた方、ワクワクが止まらない方、ロマンチックを止めたい方はぜひ、NervesJPのSlackワークスペースに飛び込んできてください。
IoTやNervesElixirが大好きなfolksたちが熱烈歓迎します :tada::tada::tada:

Let's join us!
$\huge{れっつじょいなす!}$

電子工作を楽しむ

ボタンを押したらLEDが光り、離したら消えるという動作をさせたいとおもいます。

Seeedさんの製品を使いまして、手先が「不器用ですから」な私でもはめ込み式で電子工作を楽しめます。

LEDをつなげるところは、「Raspberry Piで学ぶ電子工作1:book:を参考にしています。

部品 価格(2021/12/09)
Raspberry Pi用Grove Base Hat 1,244円
Grove ボタン - Grove Button 240円
ブレッドボード、抵抗、LED、ジャンパーワイヤー 忘れました(詰め合わせセットみたいなものを買いました)

Nerves Livebook Setup

簡単です。
動画を用意しました。
ご覧になってください。

詳しくは、ココをご参照ください。

わからないことがありましたらぜひ、NervesJPのSlackワークスペースに飛び込んできてください。
IoTやNervesElixirが大好きなfolksたちがあなたの訪れを熱烈歓迎します :tada::tada::tada:

プログラム(Notebookを書く)

スクリーンショット 2021-12-19 4.25.53.png

画像だと写経が苦行になるとおもいますので、コードを載せておきます。

点灯夫さん

巨人のエースナンバー18を背負っています。
私は世代的に桑田真澄投手を思い出します。

defmodule Lamplighter do
  def on do
    run(1)
  end

  def off do
    run(0)
  end

  defp run(state) do
    {:ok, gpio} = Circuits.GPIO.open(18, :output)
    Circuits.GPIO.write(gpio, state)
  end
end

ボタンを押した離しのイベントを受け止めるモジュール

思い切って僕の胸に飛び込んで来てほしい
巨人の背番号5番といえば、世代的に岡崎郁選手を思い出します。

が、ここは長嶋茂雄監督(当時)の胸に飛び込んできた清原和博選手の巨人時代の背番号5番を使います。

defmodule HelloNerves.Observer do
  use GenServer

  require Logger

  @input_pin 5

  def start_link(state \\ %{}) do
    GenServer.start_link(__MODULE__, state, name: __MODULE__)
  end

  @impl true
  def init(state) do
    {:ok, state}
  end

  @impl true
  def handle_info({:circuits_gpio, @input_pin, _timestamp, 1}, state) do
    Logger.debug("Received rising event on pin #{@input_pin}")
    Lamplighter.on()
    {:noreply, state}
  end

  @impl true
  def handle_info({:circuits_gpio, @input_pin, _timestamp, 0}, state) do
    Logger.debug("Received falling event on pin #{@input_pin}")
    Lamplighter.off()
    {:noreply, state}
  end
end

モジュールは定義しただけでは動きませぬ、Runです :rocket:

HelloNerves.Observer.start_link()

ボタン押したり、離したりしたら、HelloNerves.Observerに通知するプログラム

{:ok, input_gpio} = Circuits.GPIO.open(5, :input)
Circuits.GPIO.set_interrupts(input_gpio, :both, receiver: HelloNerves.Observer)

駆け足で説明しました。

何度でもいいます。
わからないことがありましたらぜひ、NervesJPのSlackワークスペースに飛び込んできてください。
IoTやNervesElixirが大好きなfolksたちがあなたの訪れを熱烈歓迎します :tada::tada::tada:

:tada::tada::tada:

Wrapping up :lgtm::lgtm::lgtm::lgtm::lgtm:

Enjoy Elixir :bangbang::bangbang::bangbang:
Enjoy Nerves :bangbang::bangbang::bangbang:

いま、日本で一番楽しんでいる人たちです。

ぜひ、NervesJPのSlackワークスペースに飛び込んできてください。
IoTやNervesElixirが大好きなfolksたちがあなたの訪れを熱烈歓迎します :tada::tada::tada:

追伸

上記の写真は、「次年度のSWESTのネタ試し!なWWEST(実行委員を中心とした内輪的なWinter Workshop Embedded System Technology)を下呂の水明館」での一コマです。
温泉、うらまやしいです〜2


  1. 本当のことを正確に言うと、私は古い本を持っています。奥付には、「2014年12月24日 第2刷発行」と書いてあります。 

  2. 野暮なことは言わないでください。わかってて書いています。本当にうらやましい。うらやましすぎて、ちゃんと言えなくなった様を表しています。 

6
0
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
6
0