1.はじめに
Rustを使って、RaspberryPiのハードウェア制御の練習をしてみました。 今回は、クレートrppalから、Grove Base Hat for Raspberry Piに搭載されているADコンバータを制御してみます。
結論・失敗
rppalは、i2cのアドレスの有効範囲を調べてるようです。
Grove Base Hat for Raspberry Piのアドレス0x04
は範囲外と判断されて、初期化の際にエラーとなります。
rppalの中の範囲判定のコードを直すか、rppal以外のクレートを使う必要があります。
(詳細は後述・・・)
2.ハードウェア
Seeed社のGROVE規格1の機器を、RaspberryPiに接続するインターフェース・ボードです。GPIO、I2C、UART、そしてアナログタイプの入力用として12bitのADコンバータも搭載しています。
I2C通信仕様
- Grove Base HATのアドレス:
0x04
$ i2cdetect -y 1 0 1 2 3 4 5 6 7 8 9 a b c d e f 00: -- 04 -- -- -- -- -- -- -- -- -- -- -- 10: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 20: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 30: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 40: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 50: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 60: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 70: -- -- -- -- -- -- -- --
I2C Registers | 値 |
---|---|
0x10 ~ 0x17 | ADC raw data |
0x20 ~ 0x27 | input voltage |
0x29 | output voltage (Grove power supply voltage) |
0x30 ~ 0x37 | input voltage / output voltage |
3.ソフトウェア
(1)下準備
プロジェクトを作ります。
$ cd gitwork $ cargo new I2chatad --bin $ cd I2chatad
クレートを追加します。
- rppal Raspberry Piの GPIO, I2C, PWM, SPI, UART を制御するためのクレートです。
$ cargo add rppal@0.11.3 Updating 'https://github.com/rust-lang/crates.io-index' index Adding rppal v0.11.3 to dependencies
とりあえずビルドして、Hello world
の表示まで確認します。
$ cargo run Updating crates.io index Downloaded libc v0.2.80 Downloaded rppal v0.11.3 Downloaded 2 crates (589.3 KB) in 6.20s Compiling libc v0.2.80 Compiling lazy_static v1.4.0 Compiling rppal v0.11.3 Compiling rp-i2c v0.1.0 (/home/pi/gitwork/rust/rp-i2c) Finished dev [unoptimized + debuginfo] target(s) in 44.45s Running `target/debug/rp-i2c` Hello, world!
(2)Grove Base Hat for Raspberry Piとの通信
ここで失敗・・・
こんな感じでエラーが出ます。
$ cargo run Compiling rp-i2c v0.1.0 (/home/pi/gitwork/rust/rp-i2c) Finished dev [unoptimized + debuginfo] target(s) in 4.77s Running `target/debug/rp-i2c` Error: Invalid slave address: 4
考察
GitHubのソースを眺めてみると、この辺りの条件で蹴っているみたい・・・
rppal便利なので、修正パッチでも作ってみようかな。