Elixir Circuits I2C에서 L 치카

이 기사는 "#NervesJP Advent Calendar 2019"의 21 일째입니다.
어제는 @32hero씨의 「 Why Nerves|>Nerves를 사용하는 이유 찾기 」였습니다.

소개



Elixir를 사용하여 RaspberryPi의 하드웨어 제어 연습을 시도했습니다.



이번에는 Elixir CircuitsI2C 제어 샘플 을 사용하여 IO 익스팬더 IC 의 MCP23017 을 제어해 보겠습니다.

※Nerves가 아닌 것은, Ubuntu 환경이 지금, 수중에 없기 때문에···미안해! !

운영 환경



여기서 하드웨어 환경은 다음을 가정합니다.
  • Raspberry Pi 3+
  • Raspbian Buster (2019년 9월판)
  • Elixir 1.9.4

  • 명령줄
    ~ $ uname -a
    Linux RaspberryPi 4.19.75-v7+ #1270 SMP Tue Sep 24 18:45:11 BST 2019 armv7l GNU/Linux
    
    ~ $ iex
    Erlang/OTP 22 [erts-10.4] [source] [smp:4:4] [ds:4:4:10] [async-threads:1] [hipe]
    
    Interactive Elixir (1.9.4) - press Ctrl+C to exit (type h() ENTER for help)
    iex(1)> 
    

    회로



    RaspberryPi와 MCP23017 연결





    MCP23017과 LED 연결





    프로그램 아래 준비



    I2C 제어에 필요한 패키지를 설치합니다.

    명령줄
    pi@raspberrypi:~ $ sudo apt install i2c-tools -y
    

    I2C를 통해 MCP23017과 통신할 수 있는지 확인합니다.

    명령줄
    pi@raspberrypi:~ $ sudo i2cdetect -r -y 1
         0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f
    00:          -- -- -- -- -- -- -- -- -- -- -- -- --
    10: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
    20: 20 -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
    30: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
    40: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
    50: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
    60: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
    70: -- -- -- -- -- -- -- --
    

    회로도와 같이 연결되면 (A0, A1, A2 = LOW) MCP23017은 주소 0x20에 할당됩니다.

    MCP23017의 제어 방법



    명령의 구성은 <<レジスタ名, 設定値>>입니다.

  • 초기화 명령 보내기
  • MCP23017의 PORTA를 출력으로 설정 <<0x00, 0x00>>
  • (입력으로 하려면 <<0x00, 0xff>> )


  • 출력의 ON/OFF의 지령을 송신한다
  • PORTA 0~7ch ON <<0x12, 0xff>>
  • PORTA 0~7ch OFF <<0x12, 0x00>>


  • MCP23017의 주요 명령



    레지스터 이름
    *A는 MCP23017의 GPA0~7.
    *B는 MCP23017의 GBP0~7에 대응합니다.


    레지스터 이름

    기능


    IODIRA
    0x00
    입출력 방향 (0: 출력 1: 입력)

    IODIRB
    0x01


    GPIOA
    0x12
    출력 레지스터 (GPIO 값)

    GPIOB
    0x13



    프로그램 예



    Elixir로 I2C 제어



    기본 구문
    I2C.write(ref, 0x20, <<0x12, 0xff>>)
    



    인수
    역할
    예문


    두 번째
    대상의 I2C 주소
    0x20(MCP23017의 기본 주소)

    셋째
    명령
    0x12(GPIOA의 출력 레지스터), 0xff(8ch 전부 출력으로 한다)


    준비



    명령줄
    ~$ git clone https://github.com/elixir-circuits/circuits_i2c.git
    ~$ cd circuits_i2c/lib
    ~/circuits_i2c/lib $ touch circuits_i2c.ex
    

    빈 소스 파일 circuits_i2c.ex를 만들어 둡니다.

    소스 코드



    출력·점멸 동작



    circuit.ex
    defmodule Circuits do
    
        # "L" Chika
        def loop1(start, count_up, sleep_msec) do
            Stream.iterate( start, &( &1 + count_up ) ) |>
            Enum.map( fn count ->
    
                alias Circuits.I2C
                #I2Cを開く
                {:ok, ref} = I2C.open("i2c-1")
    
                # 初期化コマンドをI2C経由で送る
                # MCP23017のPORTAを、出力に設定
                I2C.write(ref, 0x20, <<0x00, 0x00>>)
    
                # PORTAの0~7chをHIGHに切替
                I2C.write(ref, 0x20, <<0x12, 0xff>>)
                :timer.sleep( sleep_msec )
                # PORTAの0~7chをLOWに切替
                I2C.write(ref, 0x20, <<0x12, 0x00>>)
                :timer.sleep( sleep_msec )
    
                end )
        end
    
    
        def main([]) do
            IO.puts "Hello I2C LED..."
            # 処理スタート
            loop1(0, 1, 500)
        end
    end
    

    실행



    LED가 500ms마다 깜박입니다.

    명령줄
    ~/circuits_i2c $  mix run -e "Circuits.main([])" 
    Hello I2C LED...
    

    Grove 표준 호환 보드





    Grove 규격(I2C) 호환의 보드를 만들어 보았습니다.

    ※12/21 시점, 아직 공개할 수 없습니다, 죄송합니다! !
    GitHub

    참고 자료


  • 카운터가있는 무한 루프를 작성하는 방법
  • htps : // 코 m / 피아 세레 x / MS / Ae b45 베아 6 df415 에 7 에 1 8

  • 좋은 웹페이지 즐겨찾기