Raspberry Piにアナログ入力が無いことに不満を申す筆者です。Arduinoにはありますが性能が10ビット(0~1023)でこれまたなんとも心許ないです。さて、MCP3425では16ビットもの分解能を誇り、I2Cで通信することが可能なので容易に設定を行うことができます。更に、MCP3425はマイナス値も測ることが可能です。ここではI2Cの設定方法は記載しません(ググってみてください)。
1. – MCP3425の構成
はじめにMCP3425の構成を確認する必要がある。
上記画像ではMCP3425の役割とRaspberry Piに接続するための案内図。
MCP3425の方向は白い点を観て向きを確認。
実際に結線をして実際に動作しているかを確認コマンドで確認。
$ sudo i2cdetect -y 1
2. – 16Bitモードで計測を開始
PythonでMCP3425を操作する。電圧値が取得&表示されるプログラム。
$ vi mcp3425.py #!/usr/bin/env python # -*- coding: utf-8 -*- import smbus import time
bus = smbus.SMBus(1) bus.write_i2c_block_data(0x68, 0b10001000, [0x00]) time.sleep(1)
data = bus.read_i2c_block_data(0x68, 0x00, 2) raw = data[0] << 8 | data[1]
if raw > 32767: raw -= 65535 vol = 2.048 / 32767 print str(raw*vol) + " [V]"
2017-02-03 04:02 レイアウトがズレて誤ったプログラムを記述していました。修正済みです。申し訳ございません。WordPressの仕様で勝手に変換されてしまうみたいです。
最後に実行。
$ sudo python mcp3425.py
測定結果は下に載せておきます。
3. – 解説
MCP3425のデータシートを参考にする。
bit 7
RDY:Ready Bit
This bit is the data ready flag. In read mode, this bit indicates if the output register has been updated with a new conversion. In One-Shot Conversion mode, writing this bit to “1” initiates a new conversion.
Reading RDY bit with the read command:
1 = Output register has not been updated.
0 = Output register has been updated with the latest conversion data.
Writing RDY bit with the write command:
Continuous Conversion mode: No effect
One-Shot Conversion mode:
1 = Initiate a new conversion.
0 = No effect.bit 6-5
C1-C0: Channel Selection Bits
These are the Channel Selection bits, but not used in the MCP3425 device.bit 4
O/C: Conversion Mode Bit
1 = Continuous Conversion Mode. Once this bit is selected, the device performs data conversions
continuously.
0 = One-Shot Conversion Mode. The device performs a single conversion and enters a low power
standby mode until it receives another write/read command.bit 3-2
S1-S0: Sample Rate Selection Bit
00 = 240 SPS (12 bits),
01 = 60 SPS (14 bits),
10 = 15 SPS (16 bits)bit 1-0
G1-G0: PGA Gain Selector Bits
00 = 1 V/V,
01 = 2 V/V,
10 = 4 V/V,
11 = 8 V/V
各種説明
各ビット | ビット | 説明 |
Bit 7 | 1 | 新しい変換を開始。 |
0 | 何もせず。 | |
Bit 6 | 0 | チャンネル選択ビットだが、このチップでは使いません。0を選択。 |
Bit 5 | 0 | チャンネル選択ビットだが、このチップでは使いません。0を選択。 |
Bit 4 | 1 | 連続変換モード。 |
0 | ワンショット変換モード。デバイスは1回の変換を実行し、低電力になる。 | |
Bit 3-2 | 00 | 12ビットで取得。1秒間に240取得。 |
01 | 14ビットで取得。1秒間に60取得。 | |
10 | 16ビットで取得。1秒間に15取得。 | |
Bit 1-0 | 00 | ゲイン 1倍。 |
01 | ゲイン 2倍。 | |
10 | ゲイン 4倍。 | |
11 | ゲイン 8倍。 |
3.1. – 書き込み設定
これを参考にしてパラメータを設定した。以下のプログラムの一部がそれである。
bus.write_i2c_block_data(0x68, 0b10001000, [0x00])
端から並べていくのだ!Bit 7には新しい変換要求、Bit 6からBit 5は無視して0、Bit 4はワンショットコンバージョンモードの選択、Bit 3からBit 2までがビット指定(12ビットの場合 [00]、14ビットの場合[01]、16ビットの場合[10])、Bit 1からBit 0までがゲイン設定(1倍指定は[00]、2倍指定は[01]、4倍指定は[10]、8倍指定は[11])。これらをつなげる。今回であれば0b10001000という構成になった。ちなみに12ビットにしたければ、0b10000000です。
ちなみに基数の接頭表記法は下記の表に示す。
基数 | 接頭 | 例 |
2進数 | 0b | 0b110 |
8進数 | 0o | 0o310 |
10進数 | 0d | 0d209 |
16進数 | 0x | 0x1F2 |
これらが各種ビットによる性能。16ビットで電圧を測定すると12ビットに比べて16倍細かく計測することが可能となる。しかしSPSは1/16しか計測できない。
ビット数 | 1秒あたりの取得数 [SPS] | 設定値 | 分解階調 |
12ビット | 240 | 00 | 4,096 |
14ビット | 60 | 01 | 16,384 |
16ビット | 15 | 10 | 65,536 |
これらが各PGAゲイン。倍率を示す。
PGAゲイン | 設定値 | 倍率 [倍] |
1 V/V | 00 | 1 |
2 V/V | 01 | 2 |
4 V/V | 10 | 4 |
8 V/V | 11 | 8 |
3.2. – 読み込み設定
MCP3425からデータを読み出す必要がある。bus.read_i2c_block_dataにて読み出す。右は2バイト(=16ビット)でデータ格納を行っている。
data = bus.read_i2c_block_data(0x68, 0x00, 2)
これによって読み込みが行われる。次にビットをシフトして16Bitとして整形しなければならない。”bus.read_i2c_block_data”はdata[0]及びdata[1]に格納される。
raw = data[0] << 8 | data[1]
実際にdata[0]とdata[1]に何が格納されているか確認する必要がある。
data[0]とdata[1]を合わせた(OR = 論理和)のが562である。
表示は10進数で表示されているが、実際の作業は2進数で行われる。
ここでまた話が戻るが、ビット演算を使っている。”<< 8″は左に8つシフトを表している。詳しくは図解で。
raw = data[0] << 8 | data[1]
data[0]を左に8動かす。その間には0が8入る。次にORによる演算を行う。次にdata[1]を導入する。
raw = data[0] << 8 | data[1]
3.3. – 測定結果
測定結果は以下の通り。小さい電圧値も計測できることに加えて、マイナス値もしっかりと計測できることを確認した。
以上です。今後プログラムについては修正する場合があります。間違いがあったら教えてください!
以上