Nervesを使ってRaspberry Pi 2でLEDをチカチカさせる 〜クリスマスの飾り付けをしよう〜


(この記事は、「#NervesJP Advent Calendar 2019」の10日目です)
昨日はnishiuchikazumaさんの「ElixirでラズパイのLEDをチカ〜RaspbianOSインストールから〜」です!
こちらもぜひぜひ!
私もチカチカさせてみます!

はじめに

作品

変更ポイント

diff --git a/mix.exs b/mix.exs
index 7eb5f71..1e02c45 100644
--- a/mix.exs
+++ b/mix.exs
@@ -61,7 +61,8 @@ defmodule HelloNerves.MixProject do
       {:poison, "~> 3.1"},
       {:oauther, "~> 1.1"},
       {:extwitter, "~> 0.8"},
-      {:cronex, github: "jbernardo95/cronex", ref: "345b57e14667a08280d790afdfbb359f467649df"}
+      {:cronex, github: "jbernardo95/cronex", ref: "345b57e14667a08280d790afdfbb359f467649df"},
+      {:circuits_gpio, "~> 0.4"}
     ]
   end
lib/hello_nerves/led.ex
defmodule HelloNerves.Led do
  def blink do
    turn_on()
    Process.sleep(500)
    turn_off()
    Process.sleep(500)

    spawn(HelloNerves.Led, :blink, [])
  end

  defp turn_on do
    Circuits.GPIO.write(gpio(), 1)
  end

  defp turn_off do
    Circuits.GPIO.write(gpio(), 0)
  end

  defp gpio do
    {:ok, gpio} = Circuits.GPIO.open(18, :output)
    gpio
  end
end
$ export MIX_TARGET=rpi2
$ mix deps.get
$ mix firmware
$ mix firmware.burn

して、Nerves on Raspberry Pi 2にsshで接続して

iex(1)> HelloNerves.Led.blink

なんてやると、LEDがチカチカずっとします。

閑話休題

lib/hello_nerves/led.ex
defmodule HelloNerves.Led do
  def start do
    spawn(Led, :blink, [])
  end

  def blink do
    {:ok, gpio} = Circuits.GPIO.open(18, :output)

    Stream.iterate(0, &(&1 + 1))
    |> Enum.each(fn _ ->
      Circuits.GPIO.write(gpio, 1)
      Process.sleep(500)
      Circuits.GPIO.write(gpio, 0)
      Process.sleep(500)
    end)
  end
end
  • ずっと無限にチカチカするものを作りたかっただけなのですが、最初に書いたのはこんな感じの(たぶん)無限ループでした
  • なんだか美しくないようにみえたのでのように書き直しました
  • どっちがいいのか、はたまたもっと良い書き方があるのかはわかっていません
  • ご指導ご鞭撻のほどよろしくお願いします

A very merry Christmas (war is over if you want it)

次回