Elixir Circuits를 사용하여 LED 작동

소개



이 기사는 Elixir Advent Calendar 2019의 13 일째입니다.

어제는 @ 쓰요시 84 씨의 iex를 편리하게 해킹 모음 이었습니다.

설마 최초의 Qiita 투고가 Elixir가 된다고는. 느낌으로 쓰고 있습니다.

참고



Elixir 입문 연재 시작 (Elixir 입문 모쿠지)
Elixir Circuits · GitHub
RaspberryPi에서 배우는 전자 공작3장 전자공작의 예비지식 및 Raspberry Pi에 의한 LED의 점등

환경


  • Raspberry Pi 3B+
  • Raspbian 10.1
  • Elixir 1.9.4 (compiled with Erlang/OTP 22)
  • Raspberry Pi에서 배우는 전자 공작 부품 세트

  • 환경 구축



    RaspberryPi, Elixir의 환경 구축은 다음 기사에서 배치
    @ Nishizu Kazuma 님의 Elixir에서 라즈파이 LED를 치카 ~ RaspbianOS 설치에서 ~

    하고 싶은 일


  • Raspberry Pi에서 Elixir Circuits를 사용하여 LED를 조작합니다.

  • RaspberryPi에서 배우는 전자 공작 을 참고로 Python 코드를 Elixir로 바꿉니다.

  • 목차


  • 시험 : 시스템 명령으로 기본 LED를 조작합니다.
  • 주제: Elixir Circuits를 사용하여 LED를 조작한다.
  • 준비하는 것
  • 배선도 및 회로도
  • Elixir Circuits 소개
  • Elixir로 코딩

  • 요약

  • 시험 : 시스템 명령으로 기본 LED를 조작합니다.



    우선 기반 LED를 사용해보십시오. Elixir의 설명을 확인하십시오.
    System.cmd에서 명령 실행
    % iex
    defmodule LedSystemCmd do
      def heartbeat do
        System.cmd("sudo",["su","-c","echo heartbeat > /sys/class/leds/led0/trigger"])
      end
    
      def none do
        System.cmd("sudo",["su","-c","echo none > /sys/class/leds/led0/trigger"])
      end
    
      def manual(x) do
        System.cmd("sudo",["su","-c","echo #{x} > /sys/class/leds/led0/trigger"])
      end
    end
    
    # ledを消す
    LedSystemCmdTest.none
    # ledを点滅
    LedSystemCmdTest.heartbeat
    # ledを指定の方法で操作
    LedSystemCmdTest.manual("none")
    

    주제: Elixir Circuits를 사용하여 LED를 조작합니다.



    준비하는 것


  • RaspberryPi 3 B+
  • 브레드보드*1
  • 저항(330Ω)*1
  • 적색 LED*1
  • 점퍼선(수컷-암컷)*2

  • 배선도·회로도



    ※ 배선은 RaspberryPi의 전원을 떨어뜨린 상태에서 실시한다.
    ※ 저항을 잊지 않는다. (잊으면 굽습니다. 구웠습니다.)
    ※ 전원 투입 전에 배선을 확인.





    Elixir Circuits 소개



    1.mix new로 적당한 프로젝트 만들기
  • mix new에서 led_circuits_001 디렉토리를 만듭니다.
    (이하 프로젝트 디렉토리라고 합니다.)
  • # led_circuits_001ディレクトリが作成されます。
    % mix new led_circuits_001
    * creating README.md
    * creating .formatter.exs
    * creating .gitignore
    * creating mix.exs
    * creating lib
    * creating lib/led_circuits001.ex
    * creating test
    * creating test/test_helper.exs
    * creating test/led_circuits001_test.exs
    
    Your Mix project was created successfully.
    You can use "mix" to compile it, test it, and more:
    
        cd led_circuits_001
        mix test
    
    Run "mix help" for more commands.
    

    2.mix deps.get에서 circuits_gpio 도입

    설명은 여기를 참조하십시오 circuits_gpio
  • mix.exs에 추가
  • mix deps.get 프로젝트 디렉토리에서 실행

  • mix.exs
    defmodule LedCircuits001.MixProject do
      use Mix.Project
    
      def project do
        [
          app: :led_circuits_001,
          version: "0.1.0",
          elixir: "~> 1.9",
          start_permanent: Mix.env() == :prod,
          deps: deps()
        ]
      end
    
      # Run "mix help compile.app" to learn about applications.
      def application do
        [
          extra_applications: [:logger]
        ]
      end
    
      # Run "mix help deps" to learn about dependencies.
      defp deps do
        [
          # {:dep_from_hexpm, "~> 0.3.0"},
          # {:dep_from_git, git: "https://github.com/elixir-lang/my_dep.git", tag: "0.1.0"}
          # この行を追記
          {:circuits_gpio, "~> 0.4"}
        ]
      end
    end
    
    # mix deps.get の実行
    % mix deps.get
    Resolving Hex dependencies...
    Dependency resolution completed:
    Unchanged:
      circuits_gpio 0.4.3
      elixir_make 0.6.0
    * Getting circuits_gpio (Hex package)
    * Getting elixir_make (Hex package)
    

    Elixir로 코딩


  • led_circuits001.ex에 모듈 설명
  • ltika (msec)로 지정된 초 (밀리 섹) 간격으로 LED가 깜박입니다.
  • 루프 함수는 재귀에서 무한 루프
  • 빠질 때는 ctrl+c

  • ※실제는 처리 종료시에 gpio를 초기화해야 합니다만 이번은 하고 있지 않습니다.

    led_circuits001.ex
    defmodule LedCircuits001 do
      def ltika(sleep_msec) do
    
        {:ok, gpio} = Circuits.GPIO.open(25, :output)
        loop(gpio, sleep_msec)
    
      end
    
      defp loop(gpio, sleep_msec) do
          Circuits.GPIO.write(gpio, 1)
          :timer.sleep(sleep_msec)
    
          Circuits.GPIO.write(gpio, 0)
          :timer.sleep(sleep_msec)
    
          loop(gpio, sleep_msec)
      end
    end
    
    # プロジェクトディレクトリで実行
    % iex -S mix
    # 関数実行
    iex(1)> LedCircuits001.ltika(500)
    

    요약


  • 우선은 mix new로 프로젝트 작성.
  • Elixir에서 GPIO나 I2C 두드리는 것은, Elixir Circuits를 사용하면 바삭바삭할 수 있어.
  • mix.exs에 추기하면 mix deps.get로 의존관계를 해결.
  • 루프를 브레이크 할 때 GPIO를 초기화하는 것이 좋다.
  • 이번에는 버튼 누름으로 L치카->다른 프로세스로.

  • 내일 Elixir Advent Calendar 2019 14일째 기사는 ㅎㅎ 씨의 Phoenix 프로젝트를 mix release로 패키징하고 docker 컨테이너에서 실행 입니다. 이쪽도 기대하세요!

    좋은 웹페이지 즐겨찾기