hotch-potch, Note to self

いろいろ作業記録

Rustでアナログ入力 ~失敗編

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のソースを眺めてみると、この辺りの条件で蹴っているみたい・・・ f:id:hotch-potch:20201229102913p:plain

rppal便利なので、修正パッチでも作ってみようかな。

参考資料