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便利なので、修正パッチでも作ってみようかな。