Raspberry Pi 3にAD変換器「ADS7828」とDA変換器「DAC7573」を接続します。プログラム言語はPython3でライブラリ「pigpio」を使用します。Raspberry Pi 3の設定については「pigpioによるI2CとSPIインタフェースの実装」を参考にしてください。
AD変換器「ADS7828」とDA変換器「DAC7573」の接続
AD変換器「ADS7828」とDA変換器「DAC7573」は、Raspberry Pi 3とI2Cインタフェースにより接続します。
AD変換器「ADS7828」
ADS7828は、アナログ信号をデジタル信号に変換し、12ビットのデジタル変換し8チャンネル入力を持ちます。
DA変換器「DAC7573」
DAC7573は、12ビットのデジタル信号をアナログ信号に変換し、4チャンネルのアナログ出力を持ちます。
コマンド「i2cdetect」によりRaspberry Pi 3との接続を確認します。I2Cインタフェースのアドレスは次のようになっています。
- AD変換器「ADS7828」のアドレス – 0x48
- DA変換器「DAC7573」のアドレス – 0x4c
AD変換器「ADS7828」のPythonスクリプト
Python3でライブラリ「pigpio」を使用して、AD変換器「ADS7828」のPythonスクリプト「mADS7828.py」を作成します。ADS7828のデータシートを示します。
デジタル変換された電圧を読み込むコマンドは、次の仕様に基づいています。「PD1, PD0」は「11」に設定しています。「SD」については、Differential Inputs「0」あるいはSingle-Ended Inputs「1」を使用します。
デジタル変換された電圧データの受信手順は、次のようになっています。Write-Addressing後に、上記で作成したコマンドバイトを出力します。デジタル変換された電圧は、Read-Addressingの後に入力される2バイトのデータを使用します。
Differential InputsとSingle-Ended Inputsとで、「C2 – C0: Channel Selections」の割り当てが次のように変わります。
Pythonスクリプト「mADS7828.py」を次に示します。19行目から25行目でコマンドを作成し、変数「reg_data」に保存します。28行目でコマンドを出力します。30行目で電圧値を入力し「data」に保存します。
# -*- coding: utf-8 -*- import pigpio import time ADS_ADDRESS = 0x48 class ADS7828(object): """コンストラクタ""" def __init__(self, pidata, address, internal, differential): self.pi = pidata self.internal = internal self.differential = differential self._device = pidata.i2c_open(1, address) def read_adc(self, channel): reg_data = 0 if not self.differential: reg_data |= 0x80 if self.internal: reg_data |= 0x0C else: reg_data |= 0x04 reg_data |= (channel << 4) regtemp = reg_data reg_data = [reg_data] self.pi.i2c_write_device(self._device, reg_data) reg_data = regtemp wc, data = self.pi.i2c_read_i2c_block_data(self._device, reg_data, 2) if self.internal: return (int.from_bytes(data, 'big', signed=True) )* CONSTANT25 else: return (int.from_bytes(data, 'big', signed=True) )* CONSTANT50 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 = ADS7828(pi, ADS_ADDRESS, True, True) while True: wvoltage = adc.read_adc(CHANNEL) print("voltage:{:.2f}v".format(wvoltage)) time.sleep(0.5)
DA変換器「DAC7573」のPythonスクリプト
Python3でライブラリ「pigpio」を使用して、DA変換器「DAC7573」のPythonスクリプト「mDAC7573.py」を作成します。DAC7573のデータシートを示します。
デジタル値の電圧を書き込むコマンドは、次の仕様に基づいています。Extended address 「A1,A2」は「00」に設定しました。Load「L1,L2」は「01」(Update selected DAC with I2C data)に設定しました。「PD0」は「0」(Normal operation)設定しました。
デジタル値の電圧を書き込む手順は、次のようになっています。書き込む手順は「DAC7573 as a Slave Receiver – Standard and Fast Mode」を使用しています。「SLAVE ADDRESS」後に上記で作成したコマンドを設定し、次のバイトに出力したい電圧値を設定します。
書き込んだデジタル値の電圧を読み込むコマンドは、次の仕様に基づいています。この電圧の読み込みは、電圧値がうまく出力されないため、動作確認のために行います。
設定したデジタル値の電圧を読み込む手順は、次のようになっています。
作成したPythonスクリプト「mDAC7573.py」を次に示します。22行目でコマンドを作成し、変数「reg_data」に保存します。24行目でコマンドを出力します。26行目で電圧値を入力し「data」に保存します。
# -*- coding: utf-8 -*- import pigpio import time class DAC7573(object): DEFAULT_ADDRESS = 0x4c CONSTANT = 5.0 / (2 ** 12) """コンストラクタ""" def __init__(self, pidata): self.pi = pidata self._device = pidata.i2c_open(1, DAC7573.DEFAULT_ADDRESS) def set_voltage(self, ch, voltage): value = int(voltage / DAC7573.CONSTANT) # Clamp value to an unsigned 12-bit value. if value > 4095: value = 4095 if value < 0: value = 0 reg_data = [0x10 | (ch << 1), (value >> 4) & 0xFF, (value << 4) & 0xFF] self.pi.i2c_write_device(self._device, reg_data) reg_data = 0x10 | (ch << 1) wc, data = self.pi.i2c_read_i2c_block_data(self._device, reg_data, 2) 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) logger = 0 dac = DAC7573(pi) while True: dac.set_voltage(0,5) time.sleep(2.0)