LoginSignup
7
3

More than 1 year has passed since last update.

Livebook Lチカをイゴかす (Elixir)

Last updated at Posted at 2021-07-10

はじめに

必要なもの

  • Raspberry Pi 4, microSD, 電源
  • LANケーブル
  • LED
  • 抵抗
  • ジャンパーワイヤー
  • ブレッドボード

ついでに温度・湿度を測定してみます

準備

  • ファームウェアを焼くツールをPCにインストールします
  • Burning the Firmware を参考にfwup or etcherをインストールします
  • 私が使っているPCは、macOS 10.15.7を使っています
  • Homebrewfwupをインストールしました
$ brew install fwup

ファームウェアをダウンロードする

ファームウェアを焼く

  • PCにてダウンロードしたファームウェアをmicroSDに焼きます
  • こんな感じです
$ fwup nerves_livebook_rpi4.fw

電源ON

Sketch_ブレッドボード.png

ssh接続(任意)

  • Livebookを動かすには不要な手順です
  • もしPCからNervesにsshで入りたい場合は以下のようにします
$ ssh livebook@nerves.local

or

$ ssh root@nerves.local
github.com/fhunleth/nerves_livebook/blob/v0.2.14/config/target.exs
config :nerves_ssh,
  user_passwords: [{"livebook", "nerves"}, {"root", "nerves"}],
  daemon_option_overrides: [
    {:auth_method_kb_interactive_data,
     {'Nerves Livebook',
      'https://github.com/fhunleth/nerves_livebook\n\nssh livebook@nerves.local # Use password "nerves"\n',
      'Password: ', false}}
  ]

Run

スクリーンショット 2021-07-10 20.33.27.png

  • 右上の[New notebook]という青のボタンを押します
  • そうするとこんなページが表示されます

スクリーンショット 2021-07-10 20.48.49.png

  • タイトルをAwesomeとでもつけて
  • + Sectionを押下して、Lチカとでも名前をつけておきましょう
  • そうすると、+ Elixirというボタンが押せるので押しましょう
  • そこにプログラムを書きます
defmodule Example do
  use GenServer

  def init(state) do
    {:ok, gpio} = Circuits.GPIO.open(25, :output)
    set_interval()
    {:ok, {gpio, state}}
  end

  defp set_interval() do
    Process.send_after(self(), :tick, 1000)
  end

  def handle_info(:tick, {gpio, state}) do
    Circuits.GPIO.write(gpio, state)
    set_interval()
    {:noreply, {gpio, flip(state)}}
  end

  defp flip(1), do: 0
  defp flip(0), do: 1
end

GenServer.start_link(Example, 0)

スクリーンショット 2021-07-10 20.54.08.png

  • ソースコードのちょっと上くらいにマウスカーソルをあわせると> Evaluateというボタンがでてくるので、迷わずおしましょう
  • 1秒間隔でチカチカ点滅します :tada::tada::tada:

output.gif

温度・湿度を測る

defmodule Aht20.Reader do
  alias Circuits.I2C

  @i2c_bus "i2c-1"
  @i2c_addr 0x38
  @initialization_command <<0xBE, 0x08, 0x00>>
  @trigger_measurement_command <<0xAC, 0x33, 0x00>>
  @two_pow_20 :math.pow(2, 20)

  def read do
    {:ok, ref} = I2C.open(@i2c_bus)

    I2C.write(ref, @i2c_addr, @initialization_command)
    Process.sleep(10)

    I2C.write(ref, @i2c_addr, @trigger_measurement_command)
    Process.sleep(80)

    ret = I2C.read(ref, @i2c_addr, 7)

    I2C.close(ref)

    value(ret)
  end

  defp value({:ok, val}), do: {:ok, convert(val)}

  defp value(_), do: :error

  defp convert(<<_, raw_humi::20, raw_temp::20, _>>) do
    humi = Float.round(raw_humi * 100 / @two_pow_20, 1)
    temp = Float.round(raw_temp * 200 / @two_pow_20 - 50.0, 1)

    {temp, humi}
  end
end

Aht20.Reader.read()

スクリーンショット 2021-07-10 20.58.51.png

  • 温度・湿度を測ることができています:rocket::rocket::rocket:

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

  • Enjoy Elixir:bangbang::bangbang::bangbang:
  • Lチカやってみました
  • ところでLチカのLって、Livebookのこと:interrobang::sweat_smile:

追伸

  • 私がやっていることって、ただLivebookを素のまま用意したサーバーでイゴかしているだけで、実はちっとも詳しいわけではないのですが、LT申し込んじゃったのでJosé Valimさんのツイートの内容を理解して、派手めなところのデモを中心に発表してみようとおもっています
  • 時間があればfhunleth/nerves_livebookのことも話そうとおもっています

NervesJP

https___qiita-user-contents.imgix.net_https%3A%2F%2Fqiita-image-store.s3.ap-northeast-1.amazonaws.com%2F0%2F240349%2F5ef22bb9-f357-778c-1bff-b018cce54948.png_ixlib=rb-1.2.png

7
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
7
3