Elixir Circuits I2C에서 L 치카
13102 단어 RaspberryPiNervesL치카ElixirMCP23017
어제는 @32hero씨의 「 Why Nerves|>Nerves를 사용하는 이유 찾기 」였습니다.
소개
Elixir를 사용하여 RaspberryPi의 하드웨어 제어 연습을 시도했습니다.
이번에는 Elixir Circuits 의 I2C 제어 샘플 을 사용하여 IO 익스팬더 IC 의 MCP23017 을 제어해 보겠습니다.
※Nerves가 아닌 것은, Ubuntu 환경이 지금, 수중에 없기 때문에···미안해! !
운영 환경
여기서 하드웨어 환경은 다음을 가정합니다.
명령줄
~ $ 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의 제어 방법
명령의 구성은 <<レジスタ名, 設定値>>
입니다.
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의 제어 방법
명령의 구성은 <<レジスタ名, 設定値>>
입니다.
초기화 명령 보내기
<<0x00, 0x00>>
<<0x00, 0xff>>
) 출력의 ON/OFF의 지령을 송신한다
<<0x12, 0xff>>
<<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.exdefmodule 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
참고 자료
I2C.write(ref, 0x20, <<0x12, 0xff>>)
~$ git clone https://github.com/elixir-circuits/circuits_i2c.git
~$ cd circuits_i2c/lib
~/circuits_i2c/lib $ touch circuits_i2c.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
~/circuits_i2c $ mix run -e "Circuits.main([])"
Hello I2C LED...
Grove 규격(I2C) 호환의 보드를 만들어 보았습니다.
※12/21 시점, 아직 공개할 수 없습니다, 죄송합니다! !
GitHub
참고 자료
Reference
이 문제에 관하여(Elixir Circuits I2C에서 L 치카), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/myasu/items/a4d033b5034cc3fb97c0텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)