Rust (rppal) I2C에서 L 치카

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.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로 아날로그 입력 ~실패편

  • 참고 자료


  • htps : // / cs. 미안해 rts. m / rpa l / 0. 11.3 / rpa l / 0 x. HTML
  • htps : // m 에에에. m선. jp / 등 sp 베 ry 파이 2c ぃ th る スター パル l /
  • htps : // v.ぁsss d. jp / arc c ぇ s / r st er pp-pu b sh - mp--a ws-io t /
  • 좋은 웹페이지 즐겨찾기