I2C通信でADコンバータの値を読み込む (Raspberry Pi zero)




秋月で買ってきた、A/D コンバーター [ MCP3425 ] を使って初めてのI2C接続を試してみる。

Raspberry Pi zeroでI2Cを使えるようにするには、i2c-tools というライブラリをインストールすれば良いようだ。

$ sudo apt-get update
$ sudo apt-get install i2c-tools


サクッとインストールは終わるので、ついでに設定も終えてしまう。

$ sudo raspi-config で設定画面が開かれたら、[ 5.Interfacing Option ] -> [ P5 I2C ] -> [ Yes ] を選択する。

動作確認として諸先輩方のブログを拝読しながら、また、MCP3425の仕様書およびラズパイゼロのピン番号を読みながらなんとか配線を試みる。

I2Cデバイスが接続されている状態で $ sudo i2cdetect -r -y 1 と打つと、アドレスが表示されるとのこと。

MCP3425ではVin+とVin-に入力ソースを繋いであげないと通信エラーになってしまうので注意すること。

無事、アドレスが68と表示された。

$ sudo i2cdetect -y 1
     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f
00:          -- -- -- -- -- -- -- -- -- -- -- -- -- 
10: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
20: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
30: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
40: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
50: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
60: -- -- -- -- -- -- -- -- 68 -- -- -- -- -- -- -- 
70: -- -- -- -- -- -- -- --      


次に、PythonでもI2Cを使えるように次のようにライブラリをインストールする。

$ sudo apt-get install python-smbus
$ reboot


Python2でないと動かないライブラリのようだ。

さてプログラミングでゲイン値などの初期設定を変更できる。これらの設定は、I2C通信を開始する段階でMCP3425のコンフィギュレーションレジスタに8bitのデータを送り込むことで実現できるようだ。

bit0/1 bit2/3 bit4 bit5/6 bit7
PGA サンプルレート 変換モード 未使用 RDY

| PGA | GAIN |
--- ----
01 2倍
10 4倍
11 8倍

| サンプルレート | GAIN |
-------------- -----
01 14bit
00 12bit


動作確認として、こちらの記事のプログラミングを参考にさせてもらうことにした。

https://www.denshi.club/pc/raspi/5raspberry-pi-zeroiot4a-d1-3.html

MCP3425はなんと、GNDを基準にプラスマイナス約2Vの範囲でアナログ電圧を読み取ってくれるようだ。レンジとしては4V幅となるだろうか。ここでどこからともなく「トランスを使ったらどうかな?」というお告げが聞こえたが、あいにく手持ちがないので今回は分圧抵抗で我慢しよう。

単純な定電圧を入力値とすることにして、配線は次のように行った。



5Vを抵抗で5等分したのでそれぞれの抵抗の電位差は1Vとなる。

実行結果は次のようになった。ほぼ2Vで計算通りだ。

2.0031
2.0037
2.0037
2.0031
2.0037
2.0036
2.0037
2.0031
2.0036
2.0036
2.0031
2.0037




参考


* MCP3425の仕様書
* Raspberry Pi Zeroのピン番号
* https://www.denshi.club/pc/raspi/5raspberry-pi-zeroiot4a-d1-3.html
* https://hatobus.hatenablog.jp/entry/2017/08/02/215135