Elixir 초보자가 Nerves에서 심박수 측정 앱을 만들어보세요.

9878 단어 NervesElixir
이 기사는 #NervesJP Advent Calendar 2019의 18 일째 기사입니다.

Nerves Training at Sapporo 에서 Nerves 입문했습니다만, 여러가지 이벤트가 계속되어 복습을 게을리하고 있었기 때문에, 꽤 잊어 버렸습니다. 이 기회에 기억하는 것도 겸해 어플리케이션을 1로부터 만들어 봅니다. (라고 생각 했습니다만, 망설임으로 중간보고가 됩니다)

제목은 SORACOM Advent Calendar 2019 두번째 에서 다룬 Grove 심박 센서 입니다. 이 센서를 사용하여 심박수를 측정하는 응용 프로그램을 작성해 봅니다.

대상 보드에는 Raspberry Pi Zero W를 사용하여 Grove Base HAT을 얹습니다. 심박 센서는 D5 포트에 연결하고 디스플레이를 위해 I2C OLED 디스플레이 128x64I2C 포트에 연결해야 합니다.



개발 환경 작성은 #NervesJP Advent Calendar 2019 첫날 의 기사를 참조해 주세요. macOS (Catalina)를 사용했습니다.

프로젝트 만들기



먼저 mix라는 프로젝트 관리 명령을 사용하여 프로젝트를 만듭니다.
여기에서는 심박수를 측정하는 응용 프로그램에 대한 프로젝트 heartrate를 만들기로 결정합니다.
$ mix nerves.new heartrate

mix 명령의 두 인수의 의미는 다음과 같습니다.
  • nerves.new - nerves 프로젝트를 만드는 부속 명령
  • 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
    ...
    

    그런 타이밍(맥박)으로 타임스탬프가 표시되어 갑니다.

    같은 곳에서 오늘 시간이 부족합니다. 진행된 곳에서 수시로 갱신해 갑니다. 다음은 심박수 산출할 수 있었던 곳에서 갱신하고 싶습니다.

    좋은 웹페이지 즐겨찾기