Raspberry Pi 3にAD変換器「ADS1015」とDA変換器「MCP4725」を接続し、ADS1015でデジタル値から変換したアナログ電圧を、MCP4725に入力して、入力したアナログ電圧をデジタル変換してその値を表示します。プログラム言語はPython3でライブラリ「pigpio」を使用します。Raspberry Pi 3の設定については「pigpioによるI2CとSPIインタフェースの実装」を参考にしてください。

AD変換器「ADS1015」とDA変換器「MCP4725」の接続

AD変換器「ADS1015」とDA変換器「MCP4725」は、それぞれebayから購入しました。

AD変換器「ADS1015」

ADS1015は、Raspberry Pi 3とI2C インタフェースにより接続し、アナログ信号をデジタル信号に変換し、12ビットのデジタル変換し4チャンネル入力を持ちます。

AD変換器「ADS1015」

DA変換器「MCP4725」

MCP4725は、Raspberry Pi 3とI2C インタフェースにより接続し、12ビットのデジタル信号をアナログ信号に変換し、1チャンネルのアナログ出力を持ちます。

DA変換器「MCP4725」

Raspberry Pi 3とAD変換器「ADS1015 」とDA変換器「MCP4725」間で、I2CのSDAとSCLのそれぞれに接続します。AD変換器「ADS1015 」とDA変換器「MCP4725」のVCCにはraspberry piの3.3Vを入力します。接続した図を次に示します。

Raspberry Pi 3との接続

次のコマンドでRaspberry Pi 3との接続を確認します。

$ i2cdetect -y 1
     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f
00:          -- -- -- -- -- -- -- -- -- -- -- -- --
10: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
20: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
30: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
40: -- -- -- -- -- -- -- -- 48 -- -- -- -- -- -- --
50: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
60: -- -- -- -- 64 -- -- -- -- -- -- -- -- -- -- --
70: -- -- -- -- -- -- -- --
  • AD変換器「ADS1015」のアドレス – 0x48
  • DA変換器「MCP4725」のアドレス – 0x64

AD変換器「ADS1015」のPythonスクリプト

Python3でライブラリ「pigpio」を使用して、AD変換器「ADS1015」のPythonスクリプト「mADS1015.py」を作成します。ADS1015のデータシートを示します。
Config registerには次の形式で発生する電圧値を書き込みます。最初の1バイトは、Config registerを指定します。次の1バイトにはInput multiplexer configurationを設定し手入力するチャンネルを指定しProgrammable gain amplifier configurationで使用するゲインを指定(001 : FS = ±4.096V)します。入力電圧値のLSBは(±4.096V/4096)となります。

i2c03

i2c04

mADS1015.py

import time
import mADS1015
import pigpio

class ADS1015(object):
    DEFAULT_ADDRESS  = 0x48
    CONSTANT = 4.096/(2**11)

    def __init__(self, pi):
        self.pi = pi
        self._device = pi.i2c_open(1, self.DEFAULT_ADDRESS)

    def read_adc(self, channel):
        reg_data = [0x01, 0xc3 | (channel << 4), 0xe3]
        self.pi.i2c_write_device(self._device, reg_data)
        time.sleep(0.5)
        
        reg_data = 0x00
        wc,data =  self.pi.i2c_read_i2c_block_data(self._device, reg_data,2)
        return (int.from_bytes(data, 'big', signed=True)  >> 4 ) * self.CONSTANT

    def cancel(self):
        """
        Cancels the sensor and releases resources.
        """
        if self._device is not None:
            self.pi.i2c_close(self._device)
            self._device = None

if __name__ == "__main__":
    CHANNEL = 0
    pi = pigpio.pi()
    if not pi.connected:
       exit(0)

    adc = mADS1015.ADS1015(pi)

    while True:
        voltage = adc.read_adc(CHANNEL)
        print("voltage:{:.2f}v".format(voltage))
        time.sleep(0.5)
        
    dac.cancel()
    pi.stop()                   
        

DA変換器「MCP4725」のPythonスクリプト

Python3でライブラリ「pigpio」を使用して、DA変換器「MCP4725」のPythonスクリプト「mMCP4725.py」を作成します。MCP4725のデータシートを示します。
DAC Registerには次の形式で発生する電圧値を書き込みます。最初の1バイトは、pi.i2c_open関数で設定します。次の1バイトにはDAC Register: (C2 = 0, C1 = 1, C0 = 0)への書き込みコマンドを設定し、残り2バイトに発生電圧値を書き込みます。発生電圧値のLSBは(3.3V/4096)となります。

DAC Registerの書き込み形式

mMCP4725.py

import time
import mMCP4725
import pigpio

class MCP4725(object):
    DEFAULT_ADDRESS  = 0x64
    CONSTANT = 3.3/(2**12)

    def __init__(self, pi):
        self.pi = pi
        self._device = pi.i2c_open(1, self.DEFAULT_ADDRESS)

    def set_voltage(self, voltage):
        value = int(voltage / self.CONSTANT)
        # Clamp value to an unsigned 12-bit value.
        if value > 4095:
            value = 4095
        if value < 0:
            value = 0
        print ('Setting value to {0:04}'.format(value))
        reg_data = [0x40, (value >> 4) & 0xFF, (value << 4) & 0xFF]
        
        self.pi.i2c_write_device(self._device, reg_data)

    def cancel(self):
        if self._device is not None:
            self.pi.i2c_close(self._device)
            self._device = None

            
if __name__ == "__main__":
    pi = pigpio.pi()
    if not pi.connected:
       exit(0)
             
    dac = mMCP4725.MCP4725(pi)
     
    while True:
        dac.set_voltage(2.3)
        time.sleep(2.0)
        
    dac.cancel()
    pi.stop()           

ADS1015とMCP4725のPythonスクリプトの実行

DA変換器「MCP4725」の出力をAD変換器「ADS1015」のチャンネル0に接続して、mMCP4725.pyで発生する電圧を変化させてmMCP4725.pyを実行し、mADS1015.pyを実行して、入力された電圧を表示させます。。

発生電圧:0V

mMCP4725.pyの39行目のdac.set_voltage関数のパラメータを「0」にして、MCP4725から0Vの電圧を発生します。ADS1015で入力された電圧をデジタル変換すると「-0.00v」になりました。

$ python3 mMCP4725.py
Setting value to 0000
Setting value to 0000
Setting value to 0000
Setting value to 0000
Setting value to 0000
Setting value to 0000
Setting value to 0000

$ python3 mADS1015.py
voltage:-0.00v
voltage:-0.00v
voltage:-0.00v
voltage:-0.00v
voltage:-0.00v
voltage:-0.00v
voltage:-0.00v

発生電圧:1.65V

mMCP4725.pyの39行目のdac.set_voltage関数のパラメータを「1.65」にして、MCP4725から1.65Vの電圧を発生します。ADS1015で入力された電圧をデジタル変換すると「1.62v」になりました。

$ python3 mMCP4725.py
Setting value to 2048
Setting value to 2048
Setting value to 2048
Setting value to 2048
Setting value to 2048
Setting value to 2048
Setting value to 2048
Setting value to 2048

$ python3 mADS1015.py
voltage:1.63v
voltage:1.62v
voltage:1.62v
voltage:1.62v
voltage:1.62v
voltage:1.62v
voltage:1.62v
voltage:1.62v
voltage:1.62v
voltage:1.62v

発生電圧:3.3V

mMCP4725.pyの39行目のdac.set_voltage関数のパラメータを「3.3」にして、MCP4725から3.3Vの電圧を発生します。ADS1015で入力された電圧をデジタル変換すると「3.25v」になりました。

$ python3 mMCP4725.py
Setting value to 4095
Setting value to 4095
Setting value to 4095
Setting value to 4095
Setting value to 4095
Setting value to 4095
Setting value to 4095
Setting value to 4095
Setting value to 4095
Setting value to 4095
Setting value to 4095

 $ python3 mADS1015.py
voltage:3.26v
voltage:3.25v
voltage:3.25v
voltage:3.25v
voltage:3.25v
voltage:3.25v
voltage:3.25v
voltage:3.25v
voltage:3.25v
voltage:3.25v
voltage:3.25v