ラズパイでADコンバータMCP3425の使い方

この記事では、Raspberry PiとADコンバータMCP3425を使ってアナログ電圧を読み取る方法を解説していく。MCP3425はI2C通信となるので、Raspberry PiでI2C通信を使える設定を済ませておこう。

I2Cの設定がまだの方はこちらの記事を参考に

本記事ではRaspberry Pi zero WHを使用したが、もちろん他のRaspberry Piでも構わない。

Raspberry Pi Zero W - ヘッダー ハンダ付け済み - ラズベリー・パイ ゼロ W ワイヤレス
Raspberry Pi Zero W - ヘッダー ハンダ付け済み - ラズベリー・パイ ゼロ W ワイヤレス

Amazon

ラズパイとMCP3425の配線

アナログ電圧の用意

今回はMCP3425の動作確認のみなので、センサーは使わず、図のように分圧抵抗で作ったアナログ電圧を使ってみた。3.3Vはラズパイから供給する。

分圧抵抗で作ったアナログ電圧
分圧抵抗で作ったアナログ電圧

MCP3425は作動入力だが話を簡単にするため、VinマイナスをGNDに落とし、Vinプラスのみを使った。上の回路図では3.3Vを10kΩで2等分しているので、Vinプラスは1.65Vの電圧となる。

ラズパイとMCP3425の配線

次にラズパイとMCP3425の配線図を示す。

ラズパイとMCP3425の配線
ラズパイとMCP3425の配線

MCP3425役割ラズパイ接続先ラズパイ物理ピン
1Vin+分圧抵抗へ--
2VssGND6番
3SCLGPIO35番
4SDAGPIO23番
5Vdd+3.3V1番
6Vin-GND--

MCP3425各ピンの役割
MCP3425各ピンの役割

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

ラズパイGPIO役割図
ラズパイGPIO役割図

MCP3425が認識されているか確認する

ここまでの設定で、ラズパイと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内部構造
MCP3425内部構造

コンフィギュレーションレジスタ

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

MCP3425のコンフィギュレーションレジスタ
MCP3425のコンフィギュレーションレジスタ

下の表が、コンフィギュレーションレジスタにおける各ビットの役割。

ビット役割
0/1PGA
2/3サンプルレート
4変換モード
5/6未使用
7RDY

【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についてもっと詳しく知りたい方はデータシートを参考に

MCP3425で電圧を読み取ってみよう!

MCP3425から電圧を読み取るPythonプログラムがこちら。データの上位と下位バイトが逆に収納されているので、swap16関数で入れ替えている。またデータが2の補数(2進数の0と1を入れ替え、1を足したもの)であるため、sign16関数で符号付き16ビットを10進数に変換している。

import smbus
import time
i2c = smbus.SMBus(1)
addr=0x68
config = 0b10011000
Vref=2.048
 
i2c.write_byte(addr, config) #16bit
time.sleep(0.2)
 
def swap16(x):
    return (((x << 8) & 0xFF00) | ((x >> 8) & 0x00FF))

def sign16(x):
    return ( -(x & 0b1000000000000000) | (x & 0b0111111111111111) )
  
while True:
    data = i2c.read_word_data(addr, config)
    raw = swap16(int(hex(data), 16))
    raw_s = sign16(raw)
    volts = round((Vref * raw_s / 32767), 4)
    print(volts)
    time.sleep(1)
プログラムを実行すると「1.6055V」と表示された。テスターでの実測値が「1.657V」だったので「0.05V」の誤差があるが良しとしよう。

この記事で使った関連製品はこちら

Raspberry Pi Zero W - ヘッダー ハンダ付け済み - ラズベリー・パイ ゼロ W ワイヤレス
Raspberry Pi Zero W - ヘッダー ハンダ付け済み - ラズベリー・パイ ゼロ W ワイヤレス

Amazon
正規代理店商品 Raspberry Pi 4 Model B (8GB) made in UK element14製 技適マーク入
正規代理店商品 Raspberry Pi 4 Model B (8GB) made in UK element14製 技適マーク入

Amazon

Raspberry Piの参考書

Raspberry Pi クックブック 第2版 (Make:PROJECTS)
Raspberry Pi クックブック 第2版 (Make:PROJECTS)

本書は、全世界で多くのユーザーの支持を集めているマイコンボード「Raspberry Pi」を使いこなすためのレシピ集です。ハードウェアの基本、オペレーティングシステムの使い方、ネットワーク接続、Pythonプログラミングの基本を紹介した上デ、実際の作品製作に必要になる、高度なPythonプログラミング、GPIO(汎用入出力)、モーター、センサー、ディスプレイなどの使い方へと解説を進めていきます。

Amazon
写真や図解でよくわかる ラズパイZeroを使い倒す本 Raspberry Pi Zero/Zero W対応
写真や図解でよくわかる ラズパイZeroを使い倒す本 Raspberry Pi Zero/Zero W対応

本書ではRaspberry Pi Zero / Zero Wの概要から必要な周辺機器の説明、OSの導入やセットアップなどといった準備、そしてLinuxに初めて触れる人に向けてLinuxの基礎やシェルの操作などを解説しています。また、準備が整ったら実際に電子部品をRaspberry Pi Zero / Zero Wで制御する方法も解説しました。

KindleAmazon
Raspberry Pi ZeroによるIoT入門- Zero W 対応
Raspberry Pi ZeroによるIoT入門- Zero W 対応

本書は、大人から子供まで、初心者の方でも、ラズパイZeroとラズパイZero WをIoTのデバイスとして使いこなせるようになることを目的とした入門書です。また、ラズパイZeroとラズパイZero WをUSBケーブル1本でパソコンに接続できる便利な「Zero over USB」について、日本で初めて詳しく解説しました。

Amazon

参考サイト

最後まで読んでいただきありがとうございました。

「この記事が参考になったよ」という方は、ぜひ記事をシェアをしていただけるととても嬉しいです。

今後も有益な記事を書くモチベーションにつながりますので、どうかよろしくお願いいたします。↓↓↓↓↓↓↓

あなたにおすすめ