LoginSignup
2

More than 1 year has passed since last update.

posted at

updated at

Organization

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

はじめに

必要なもの

  • 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

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
What you can do with signing up
2