【Raspberry Pi】ADコンバータMCP3425の使い方

この記事では、Raspberry PiとADコンバータMCP3425を使ってアナログ電圧を読み取る方法を解説していく。MCP3425はI2C通信となるので、Raspberry PiでI2C通信を使える設定を済ませておこう。
Raspberry PiとMCP3425の配線
アナログ電圧の用意
今回はMCP3425の動作確認のみなので、センサは使わず、図のように分圧抵抗で作ったアナログ電圧を使ってみた。3.3Vはラズパイから供給する。

MCP3425は作動入力だが話を簡単にするため、VinマイナスをGNDに落とし、Vinプラスのみを使った。上の回路図では3.3Vを10kΩで2等分しているので、Vinプラスは1.65Vの電圧となる。
なお、本記事ではRaspberry Pi zero WH
を使用したが、もちろん他のRaspberry
Piでも構わない。
Raspberry PiとMCP3425の配線
次にRaspberry PiとMCP3425の配線図を示す。

——- | —- | ————– | —————- ||
1 | Vin+ | 分圧抵抗へ | – |
2 | Vss | GND | 6番 |
3 | SCL | GPIO3 | 5番 |
4 | SDA | GPIO2 | 3番 |
5 | Vdd | +3.3V | 1番 |
6 | Vin- | GND | – |

Raspberry PiではSDAとSCLが、それぞれGPIO2とGPIO3に割り当てられているので注意しよう。

MCP3425が認識されているか確認する
ここまでの設定で、Raspberry
PiとMCP3425が正しく接続されていれば、$ sudo i2cdetect -y 1
を実行することでMCP3425のアドレスが表示される。
$ 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: -- -- -- -- -- -- -- --
【注意】アドレスが表示されない場合
Raspberry Piを再起動してみよう。また、MCP3425ではVin+とVin-が未接続状態だとアドレスが表示されないので注意。
ADコンバータMCP3425の使い方
次にMCP3425の使い方を説明する。今回はポイントのみ理解できればよいので、必要最低限の説明をする。
差動入力
MCP3425は差動入力となっているので、アナログ電圧は下の式で計算される。ただしVin+とVin-の入力範囲はGNDを基準にプラスマイナス約2Vまで。今回、Vin-はGNDに接地しているので0Vとして計算する。
\[ V_{IN} = V_{IN+} - V_{IN-} \]

コンフィギュレーションレジスタ
MCP3425は、ゲインやサンプルレートを設定できるようになっている。設定方法はコンフィギュレーションレジスタに、8bitのデータを書き込むことで可能となる。

下の表が、コンフィギュレーションレジスタにおける各ビットの役割。
ビット | 役割 |
---|---|
0/1 | PGA |
2/3 | サンプルレート |
4 | 変換モード |
5/6 | 未使用 |
7 | RDY |
【bit0/1】入力ゲイン (PGA)
bit0とbit1では、入力ゲインの倍率を設定できる。アナログ電圧が小さい場合などに便利な機能だ。今回入力ゲインは1倍で使うので00
を書き込む。
bit0/1 | ゲイン |
---|---|
00 | 1倍 |
01 | 2倍 |
10 | 4倍 |
11 | 8倍 |
【bit2/3】ビットレートとサンプリングレート
bit2、bit3では、ビットレートとサンプリングレートの設定を行う。ビットレートが高ければ解像度は上がるが、1秒間にサンプリングできる回数が減ってしまう。逆に、サンプリング回数を増やしたい場合は、ビットレートが犠牲となる。今回は、サンプリングレート16bit、サンプリングレート15SPSを設定する。だから10
を書き込む。
bit2/3 | ビットレート | サンプリングレート |
---|---|---|
10 | 16bit | 15 SPS |
01 | 14bit | 60 SPS |
00 | 12bit | 240 SPS |
【bit4】変換モード
今回は連続変換モードを選択するので1
を書き込む。
bit4 | 動作 |
---|---|
1 | 連続変換モード。このビットが選択されると、デバイスはデータ変換を継続的に実行する。 |
0 | ワンショット変換モード。デバイスは単一の変換を実行し、別の書き込み/読み取りコマンドを受信するまで低電力スタンバイモードに入る。 |
【bit6/5】チャネルセレクション
チャネルの選択ができるビットのようだが、MCP3425は1チャネルしかないので使用されない。00
を書き込む。
【bit7】データレディフラグ
ワンショット変換モードの時に使うようだ。今回は連続変換モードなので1
を書き込む。
- 以上を合わせると、コンフィギュレーションレジスタに書き込む値は「10011000」となる。
MCP3425についてもっと詳しく知りたい方はデータシートを参考に。 http://akizukidenshi.com/download/ds/microchip/mcp3425.pdf
MCP3425で電圧を読み取ってみよう!
MCP3425から電圧を読み取るPythonプログラムがこちら。データの上位と下位バイトが逆に収納されているので、swap16関数で入れ替えている。またデータが2の補数(2進数の0と1を入れ替え、1を足したもの)であるため、sign16関数で符号付き16ビットを10進数に変換している。
import smbus
import time
= smbus.SMBus(1)
i2c =0x68
addr= 0b10011000
config =2.048
Vref
#16bit
i2c.write_byte(addr, config) 0.2)
time.sleep(
def swap16(x):
return (((x << 8) & 0xFF00) | ((x >> 8) & 0x00FF))
def sign16(x):
return ( -(x & 0b1000000000000000) | (x & 0b0111111111111111) )
while True:
= i2c.read_word_data(addr, config)
data = swap16(int(hex(data), 16))
raw = sign16(raw)
raw_s = round((Vref * raw_s / 32767), 4)
volts print(volts)
1) time.sleep(
プログラムを実行すると「1.6055V」と表示された。テスターでの実測値が「1.657V」だったので「0.05V」の誤差があるが良しとしよう。
参考サイト
https://www.denshi.club/pc/raspi/5raspberry-pi-zeroiot4a-d1-3.html
関連記事
- 【Raspberry Pi】ADコンバータMCP3008の使い方【SPI通信】
- Raspberry PiでSPI通信できるようにする設定【ADコンバータMAX1118】
- ADコンバータADS1115の使い方【ESP32・Arduino】
- M5StickC PLUSの内蔵ADコンバータで電圧測定
- 静電容量型の土壌湿度センサを使ってArduinoで土の水分量測定