Elixir 초보자가 Nerves에서 심박수 측정 앱을 만들어보세요.
Nerves Training at Sapporo 에서 Nerves 입문했습니다만, 여러가지 이벤트가 계속되어 복습을 게을리하고 있었기 때문에, 꽤 잊어 버렸습니다. 이 기회에 기억하는 것도 겸해 어플리케이션을 1로부터 만들어 봅니다. (라고 생각 했습니다만, 망설임으로 중간보고가 됩니다)
제목은 SORACOM Advent Calendar 2019 두번째 에서 다룬 Grove 심박 센서 입니다. 이 센서를 사용하여 심박수를 측정하는 응용 프로그램을 작성해 봅니다.
대상 보드에는 Raspberry Pi Zero W를 사용하여 Grove Base HAT을 얹습니다. 심박 센서는
D5
포트에 연결하고 디스플레이를 위해 I2C OLED 디스플레이 128x64 을 I2C
포트에 연결해야 합니다.개발 환경 작성은 #NervesJP Advent Calendar 2019 첫날 의 기사를 참조해 주세요. macOS (Catalina)를 사용했습니다.
프로젝트 만들기
먼저 mix라는 프로젝트 관리 명령을 사용하여 프로젝트를 만듭니다.
여기에서는 심박수를 측정하는 응용 프로그램에 대한 프로젝트 heartrate
를 만들기로 결정합니다.
$ mix nerves.new heartrate
mix 명령의 두 인수의 의미는 다음과 같습니다.
$ mix nerves.new heartrate
heartrate
를 지정 이 명령을 실행하면 다음과 같이 프로젝트 작성이 진행됩니다.
* creating heartrate/config/config.exs
* creating heartrate/config/target.exs
* creating heartrate/lib/heartrate.ex
* creating heartrate/lib/heartrate/application.ex
* creating heartrate/test/test_helper.exs
* creating heartrate/test/heartrate_test.exs
* creating heartrate/rel/vm.args.eex
* creating heartrate/rootfs_overlay/etc/iex.exs
* creating heartrate/.gitignore
* creating heartrate/.formatter.exs
* creating heartrate/mix.exs
* creating heartrate/README.md
Fetch and install dependencies? [Yn] n
Your Nerves project was created successfully.
You should now pick a target. See https://hexdocs.pm/nerves/targets.html#content
for supported targets. If your target is on the list, set `MIX_TARGET`
to its tag name:
For example, for the Raspberry Pi 3 you can either
$ export MIX_TARGET=rpi3
Or prefix `mix` commands like the following:
$ MIX_TARGET=rpi3 mix firmware
If you will be using a custom system, update the `mix.exs`
dependencies to point to desired system's package.
Now download the dependencies and build a firmware archive:
$ cd heartrate
$ mix deps.get
$ mix firmware
If your target boots up using an SDCard (like the Raspberry Pi 3),
then insert an SDCard into a reader on your computer and run:
$ mix firmware.burn
Plug the SDCard into the target and power it up. See target documentation
above for more information and other targets.
프로젝트 작성의 결과로 다음 구성의 디렉토리
heartrate
가 완성됩니다.heartrate
├── README.md
├── config
│ ├── config.exs
│ └── target.exs
├── lib
│ ├── heartrate
│ │ └── application.ex
│ └── heartrate.ex
├── mix.exs
├── rel
│ └── vm.args.eex
├── rootfs_overlay
│ └── etc
│ └── iex.exs
└── test
├── heartrate_test.exs
└── test_helper.exs
프로젝트의 디렉토리로 이동합니다.
$ cd heartrate
heartrate/mix.exs
에 종속 라이브러리를 추가합니다. GPIO, I2C, OLED를 사용하므로 다음을 넣어 둡니다. # Run "mix help deps" to learn about dependencies.
defp deps do
[
# 以下3行を追加
{:circuits_gpio, "~> 0.4"},
{:circuits_i2c, "~> 0.1"},
{:oled, "~> 0.1.0"},
...
heartrate/lib/heartrate/worker.ex
를 다음의 내용으로 새롭게 작성합니다.내용은 심박 센서의 값이 0에서 1이 되는 Rising 시의 타임스탬프를 출력하는 것입니다.
defmodule Heartrate.Worker do
use GenServer
alias Circuits.GPIO
def start_link(_) do
GenServer.start_link(__MODULE__, [])
end
def init(_) do
{:ok, heart} = GPIO.open(5, :input)
# GPIO 5 が Rising になった時に割り込みをかける
GPIO.set_interrupts(heart, :rising)
{:ok, %{heart: heart}}
end
def handle_info({:circuits_gpio, 5, timestamp, value}, state) do
# GPIO 5 についての割り込みがかかったときのタイムスタンプを標準出力に出す
IO.puts("timestamp: #{timestamp}")
{:noreply, state}
end
end
우선, 여기까지 할 수 있었던 곳에서 빌드해 보겠습니다. 아래에서 대상 보드를 Raspberry Pi Zero로 설정합니다.
$ export MIX_TARGET=rpi0
그런 다음 종속 라이브러리를 가져옵니다. 처음에는 네트워크를 통해 필요한 라이브러리를로드하므로 시간이 걸립니다.
$ mix deps.get
드디어 빌드입니다.
$ mix firmware
성공하면 펌웨어
heartrate/_build/rpi0_dev/nerves/images/heartrate.fw
빌드가 끝나면 펌웨어를 업로드하는 스크립트를 생성합니다. 이제
heartrate/upload.sh
스크립트가 작성됩니다.$ mix firmware.gen.script
그런 다음 Raspberry Pi Zero와 PC를 USB 케이블로 연결하고 아래에서 업로드를 수행합니다.
$ ./upload.sh
업로드가 끝나면 ssh에서 Nerves로 들어갑니다.
$ ssh nerves.local
Interactive Elixir (1.9.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
iex([email protected])1> Heartrate.Worker.start_link([])
{:ok, #PID<0.1081.0>}
timestamp: 79308110000
timestamp: 80124570000
timestamp: 80940872000
timestamp: 81724341000
timestamp: 82515820000
timestamp: 83312481000
timestamp: 84102475000
timestamp: 84872619000
timestamp: 85665223000
timestamp: 86469945000
timestamp: 87261565000
timestamp: 88037570000
timestamp: 88834137000
timestamp: 89631551000
timestamp: 90419793000
...
그런 타이밍(맥박)으로 타임스탬프가 표시되어 갑니다.
같은 곳에서 오늘 시간이 부족합니다. 진행된 곳에서 수시로 갱신해 갑니다. 다음은 심박수 산출할 수 있었던 곳에서 갱신하고 싶습니다.
Reference
이 문제에 관하여(Elixir 초보자가 Nerves에서 심박수 측정 앱을 만들어보세요.), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/inachi/items/ff006fd20246f0a0a358텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)