Rust (rppal) I2C에서 L 치카
14113 단어 RaspberryPiL치카MCP23017Rust
1. 소개
Rust와 rppal을 사용하여 RaspberryPi의 I2C 통신 단자에 연결된 IO 익스팬더 MCP23017을 조작해보십시오.
실행 환경
하드웨어
Raspberry Pi 4
OS
Raspbian Buster
rustc
Ver.1.47.0
IO 익스팬더
MCP23017
→ 이것을 RaspberryPi의 I2C 통신 단자에 연결했습니다.
$ uname -a
Linux raspi4 4.19.97-v7l+ #1294 SMP Thu Jan 30 13:21:14 GMT 2020 armv7l GNU/Linux
$ rustc --version
rustc 1.47.0 (18bf6b4f0 2020-10-07)
$ 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: -- -- -- -- -- -- -- --
2.LED 점멸 예
MCP23017의 포트 A의 핀 0~7에 연결된 LED를 1개씩 번갈아 흐르도록 점등하는 예입니다.
회로를 연결하는 방법은 이 기사을 참조하십시오.
(1) MCP23017의 주요 명령
레지스터 이름
*A는 MCP23017의 GPA0~7.
*B는 MCP23017의 GBP0~7에 대응합니다.
레지스터 이름
값
기능
IODIRA
0x00
입출력 방향 (0: 출력 1: 입력)
IODIRB
0x01
〃
GPIOA
0x12
출력 레지스터 (GPIO 값)
GPIOB
0x13
〃
(2) 준비
명령줄$ cargo new i2cexp --bin
Created binary (application) `i2cexp` package
$ cd i2cexp/
$
(3) 소스 코드
dependencies에 rppal
를 추가합니다.
Cargo.toml[package]
name = "rp-i2c"
version = "0.1.0"
authors = ["pi"]
edition = "2018"
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
[dependencies]
rppal = "0.11.3"
src/main.rsuse rppal::i2c::I2c;
use std::{thread, time};
//I2C接続先アドレス
const ADDR: u16 = 0x20;
//レジスタ:GPA側の入出力方向設定
const REG_CTRL_IODIRA: u8 = 0x00;
//レジスタ:GPA側の出力値設定
const REG_CTRL_GPIOA: u8 = 0x12;
//制御関数
fn led() -> Result<u8, rppal::i2c::Error> {
//I2Cを開く
let mut i2c = I2c::new()?;
i2c.set_timeout(100)?;
i2c.set_slave_address(ADDR)?;
//初期化コマンドをI2C経由で送る
//MCP23017のPORTAを、出力に設定
i2c.smbus_write_word(REG_CTRL_IODIRA, 0x00)?;
//ウェイトの設定:0.1秒
let ten_millis = time::Duration::from_millis(100);
//10回繰り返し
for _n in 1..10 {
//PORTAの0,2,4,8chをLOWに, 1,3,5,7をHIGHにする
i2c.smbus_write_word(REG_CTRL_GPIOA, 0xaa)?;
//ウェイト
thread::sleep(ten_millis);
//PORTAの0,2,4,8chをHIGHに, 1,3,5,7をLOWにする
i2c.smbus_write_word(REG_CTRL_GPIOA, 0x55)?;
//ウェイト1秒
thread::sleep(ten_millis);
}
//PORTAの0~7chをLOWにする
i2c.smbus_write_word(REG_CTRL_GPIOA, 0x00)?;
Ok(0)
}
//メイン
fn main() {
println!(" --- I2C Expander Test (Output) ---");
//実行
let result = led();
//実行結果の判断
match result {
Ok(v) => println!(" Done : {}", v),
Err(e) => println!(" Error : {}", e),
};
}
(4) 실행
명령줄pi@raspi4:~/gitwork/rust/i2cexp $ cargo run
Compiling i2cexp v0.1.0 (/home/pi/gitwork/rust/i2cexp)
Finished dev [unoptimized + debuginfo] target(s) in 1.48s
Running `target/debug/i2cexp`
--- I2C Expander Test (Output) ---
Done : 0
실행하면 아래와 같은 느낌으로 노란색 LED가 번갈아 깜박입니다.
4. 끝에
Rust의 임베디드 장비 연습으로 I2C 통신을 사용한 제어를 시도했습니다.
I2C를 사용할 수 있으면 센서 등 다양한 연결을 늘릴 수 있으므로 향후 작례를 늘려갑니다.
보충: 실패편
Rust와 rppal에서 Grove Base Hat for Raspberry Pi에 탑재된 AD 컨버터의 제어에 도전해 보았습니다만, 이쪽은 실패였습니다.
자세한 내용은 아래의 다른 기사를 참조하십시오.
$ uname -a
Linux raspi4 4.19.97-v7l+ #1294 SMP Thu Jan 30 13:21:14 GMT 2020 armv7l GNU/Linux
$ rustc --version
rustc 1.47.0 (18bf6b4f0 2020-10-07)
$ 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: -- -- -- -- -- -- -- --
MCP23017의 포트 A의 핀 0~7에 연결된 LED를 1개씩 번갈아 흐르도록 점등하는 예입니다.
회로를 연결하는 방법은 이 기사을 참조하십시오.
(1) MCP23017의 주요 명령
레지스터 이름
*A는 MCP23017의 GPA0~7.
*B는 MCP23017의 GBP0~7에 대응합니다.
레지스터 이름
값
기능
IODIRA
0x00
입출력 방향 (0: 출력 1: 입력)
IODIRB
0x01
〃
GPIOA
0x12
출력 레지스터 (GPIO 값)
GPIOB
0x13
〃
(2) 준비
명령줄
$ cargo new i2cexp --bin
Created binary (application) `i2cexp` package
$ cd i2cexp/
$
(3) 소스 코드
dependencies에
rppal
를 추가합니다.Cargo.toml
[package]
name = "rp-i2c"
version = "0.1.0"
authors = ["pi"]
edition = "2018"
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
[dependencies]
rppal = "0.11.3"
src/main.rs
use rppal::i2c::I2c;
use std::{thread, time};
//I2C接続先アドレス
const ADDR: u16 = 0x20;
//レジスタ:GPA側の入出力方向設定
const REG_CTRL_IODIRA: u8 = 0x00;
//レジスタ:GPA側の出力値設定
const REG_CTRL_GPIOA: u8 = 0x12;
//制御関数
fn led() -> Result<u8, rppal::i2c::Error> {
//I2Cを開く
let mut i2c = I2c::new()?;
i2c.set_timeout(100)?;
i2c.set_slave_address(ADDR)?;
//初期化コマンドをI2C経由で送る
//MCP23017のPORTAを、出力に設定
i2c.smbus_write_word(REG_CTRL_IODIRA, 0x00)?;
//ウェイトの設定:0.1秒
let ten_millis = time::Duration::from_millis(100);
//10回繰り返し
for _n in 1..10 {
//PORTAの0,2,4,8chをLOWに, 1,3,5,7をHIGHにする
i2c.smbus_write_word(REG_CTRL_GPIOA, 0xaa)?;
//ウェイト
thread::sleep(ten_millis);
//PORTAの0,2,4,8chをHIGHに, 1,3,5,7をLOWにする
i2c.smbus_write_word(REG_CTRL_GPIOA, 0x55)?;
//ウェイト1秒
thread::sleep(ten_millis);
}
//PORTAの0~7chをLOWにする
i2c.smbus_write_word(REG_CTRL_GPIOA, 0x00)?;
Ok(0)
}
//メイン
fn main() {
println!(" --- I2C Expander Test (Output) ---");
//実行
let result = led();
//実行結果の判断
match result {
Ok(v) => println!(" Done : {}", v),
Err(e) => println!(" Error : {}", e),
};
}
(4) 실행
명령줄
pi@raspi4:~/gitwork/rust/i2cexp $ cargo run
Compiling i2cexp v0.1.0 (/home/pi/gitwork/rust/i2cexp)
Finished dev [unoptimized + debuginfo] target(s) in 1.48s
Running `target/debug/i2cexp`
--- I2C Expander Test (Output) ---
Done : 0
실행하면 아래와 같은 느낌으로 노란색 LED가 번갈아 깜박입니다.
4. 끝에
Rust의 임베디드 장비 연습으로 I2C 통신을 사용한 제어를 시도했습니다.
I2C를 사용할 수 있으면 센서 등 다양한 연결을 늘릴 수 있으므로 향후 작례를 늘려갑니다.
보충: 실패편
Rust와 rppal에서 Grove Base Hat for Raspberry Pi에 탑재된 AD 컨버터의 제어에 도전해 보았습니다만, 이쪽은 실패였습니다.
자세한 내용은 아래의 다른 기사를 참조하십시오.
Rust와 rppal에서 Grove Base Hat for Raspberry Pi에 탑재된 AD 컨버터의 제어에 도전해 보았습니다만, 이쪽은 실패였습니다.
자세한 내용은 아래의 다른 기사를 참조하십시오.
참고 자료
Reference
이 문제에 관하여(Rust (rppal) I2C에서 L 치카), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/myasu/items/d725cc3862b15bcac111텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)