アナログデジタルコンバータMCP3425を使ってアナログからデジタルに変換し、データを読み取る方法を紹介します。
使用するマイコンはRaspberry Pi、プログラム言語はPythonです。サンプルプログラムは、デジタルデータの読み取りだけでなく設定も行っています。
MCP3425の主な仕様と特長は以下の通りです。
仕様
入力数:1チャンネル
分解能:16ビット
変換方式:ΔΣ変換
電源:単一電源
入力:差動
特長
低ノイズ
高精度基準電圧内蔵
準備
MCP3425の購入
MCP3425は6端子のSOT-23と呼ばれる形状です。
MCP3425単体もしくはモジュールのどちらも購入出来ます。はんだ付けに自信がない人はモジュールの購入をお勧めします。
下の写真は秋月電子通商で購入したMCP3425モジュールです。今回は、このモジュールを使用してデータを読み込むサンプルプログラムを紹介します。
MCP3425モジュールとRaspberry Piの接続
接続図
ADのデジタル出力データ
アナログ信号(電圧)の入力ピンがVIN+とVIN-の2つあり、この2つの電圧の差(差動入力)をデジタル変換します。VIN-をGNDに接続してシングルエンドとして使用する事も出来ます。
以下の①~④の様に接続したときの大体のデジタル出力値を示します。
接続方法 | ADのデジタル出力データ |
VIN+とVIN-を接続して同じ電圧を入力 | 約0 |
VIN+を+1.65Vに接続。VIN-をGNDに接続 |
約+26400 |
VIN+を+2.2Vに接続。VIN-を+1.1Vに接続 | 約+17600 |
VIN+を+1.1Vに接続。VIN-を+2.2Vに接続 | 約-17600 |
※VIN+とVIN-のアナログ電圧の差が+2.048V(内部基準電圧)の時に、32768(16bit設定)のデジタルデータをを出力します。 VIN+とVIN-を入れ替えると-32767のデジタルデータを出力します。
①ADのデジタル出力 約 0
②ADのデジタル出力 約+26400
(シングルエンド入力)
③ADのデジタル出力 約+17600
④ADのデジタル出力 約-17600
Raspberry Piの通信設定とPythonの操作方法
Raspberry PiのI2C通信設定を有効にします。
下の記事でRaspberry Piの通信設定と、Pythonの基本操作を説明しています。
I2C通信プログラミング
プログラムコード
Pythonプログラムです。
import smbus
import time
#I2C設定
i2c = smbus.SMBus(1)
address = 0x68
#MCP3425設定
ret = i2c.write_byte(address, 0x98)
#繰り返し
while True:
#データ読み込み
dat = i2c.read_i2c_block_data(address, 0x98, 0x02)
#データ変換
count = dat[0] << 8 | dat[1]
#極性判断
if count >= 32768:
count -= 65536
#表示
print('count:' + str(count))
#一時停止
time.sleep(0.1)
プログラムの説明
プログラムの流れです。
- I2C通信の設定
- MCP3425の設定
- MCP3425からデータを取得
- 取得したデータの極性を判断して画面に表示
- 3.~4.を繰り返します
1.I2C通信の設定
#I2C設定
i2c = smbus.SMBus(1)
address = 0x68
i2c = smbus.SMBus(1)
インスタンス生成です。使用するBus1を指定します。
address = 0x68
アドレス指定です。MCP3425のアドレスは0x68(16進数)で、通信時に指定します。
Raspberry PiにMCP3425を接続した状態で、LXTerminalから「i2cdetect -y 1」コマンドを入力すると、アドレスが0x68であることを確認出来ます。
2.MCP3425の設定
#MCP3425設定
ret = i2c.write_byte(address, 0x98)
i2c.write_byte(address, 0x98)
0x98(CONFIGRATIONレジスタ)
設定内容
G1-G0:ゲイン(00:1V/V)
S1-S0:サンプルレート(10:15SPS)
/O/C:コンバージョンモード(1:連続)
C0-C1:チャンネル(00:未使用)
/RDY:ワンショット(1:無効)
データシートの『5.2 Configration Register』で詳細を確認できます。
/RDY | C1 | C0 | /O/C | S1 | S0 | G1 | G0 |
1 | 0 | 0 | 1 | 1 | 0 | 0 | 0 |
G1-G0:PGA Gain Selector Bits | |
00 | 1V/V |
01 | 2V/V |
10 | 4V/V |
11 | 8V/V |
S1-S0:Sample Rate Selection Bit | |
00 | 240SPS(12bits) |
01 | 60SPS(14bits) |
10 | 15SPS(16bits) |
3.MCP3425からデータを取得
#データ読み込み
dat = i2c.read_i2c_block_data(address, 0x00, 0x02)
dat = i2c.read_i2c_block_data(address, 0x00, 0x02)
0x00:ダミー
0x02:読み込むバイト数
データシートの『5.0 MCP3425デバイスの使用方法』で詳細を確認できます。
#データ変換
count = dat[0] << 8 | dat[1]
count = dat[0] << 8 | dat[1]
データは8bitの入れ物2つに入っています。これを16bitにします。
#極性判断
if count >= 32768:
count -= 65536
if(out_x >= 32768):
out_x = out_x – 65536
2の補数表現を符号ありに変換します。
16bitデータ | 符号なし | 符号あり |
1000000000000000 | 32768 | -32768 |
1000000000000001 | 32769 | -32767 |
: | : | : |
1111111111111110 | 65534 | -2 |
1111111111111111 | 65535 | -1 |
0000000000000000 | 0 | 0 |
0000000000000001 | 1 | 1 |
0000000000000010 | 2 | 2 |
: | : | : |
0111111111111110 | 32766 | 32766 |
0111111111111111 | 32767 | 32767 |
2の補数の詳しい説明はこちら
「2の補数」(2021年10月12日 (火) 17:00 UTCの版)『ウィキペディア日本語版』
#表示
print('count:' + str(count))
print(‘count:’ + str(count))
ADのカウント値を画面に表示します。
5.3.~4.を繰り返します。
#繰り返し
while True:
while True:
Stopボタンが押されるまで繰り返します。
※この『while True:』は、12行目のwhile文です。
プログラムの実行結果
プログラムを実行します。
①Runボタンを押します。
②ADデータを0.1秒間隔で画面に表示します。
③Stopボタンを押すとプログラムは終了します。
以上、MCP3425を使用してADのカウント値を画面に表示するサンプルでした。
まとめ
MSP3425からデジタル変換したデータを受け取るサンプルプログラムの解説をしました。
如何でしたでしょうか。
センサーだけでなく電圧信号をデジタルに変換して可視化できるようになるので、いろいろと使える機会が増えてくると思います。
プログラミングやソフトウェアの記事です。
コメント