Skip to content

Pi 5 updated source lib I made #5

@Jojojrman

Description

@Jojojrman

I was trying to use this on the PI 5 and it used smbus2 instead so I made a version that you are free to take and use for people who need it.

All that needs to be added is the specific models, I only had the one that I was using. Should be easy to add the other ones

from smbus2 import SMBus
from abc import ABC, abstractmethod

GP8XXX_I2C_DEVICE_ADDR = 0x58

class DFRobot_GP8XXX(ABC):
    OUTPUT_RANGE_2_5V = 0
    OUTPUT_RANGE_5V = 1
    OUTPUT_RANGE_10V = 2
    OUTPUT_RANGE_VCC = 3
    RESOLUTION_12_BIT = 0x0FFF
    RESOLUTION_15_BIT = 0x7FFF

    @abstractmethod
    def begin(self):
        pass

    @abstractmethod
    def set_dac_out_voltage(self, voltage, channel):
        pass


class DFRobot_GP8XXX_IIC(DFRobot_GP8XXX):
    GP8XXX_CONFIG_CURRENT_REG = 0x02

    def __init__(self, bus=1, resolution=DFRobot_GP8XXX.RESOLUTION_12_BIT, device_addr=GP8XXX_I2C_DEVICE_ADDR):
        self._resolution = resolution
        self._device_addr = device_addr
        self._bus_num = bus
        self._bus = SMBus(bus)

    def begin(self):
        # Optionally scan for device presence
        try:
            self._bus.write_quick(self._device_addr)
            return 0
        except:
            return -1

    def set_dac_outrange(self, range):
        if range == self.OUTPUT_RANGE_5V:
            self._write_reg(self.GP8XXX_CONFIG_CURRENT_REG >> 1, [0x00])
        elif range == self.OUTPUT_RANGE_10V:
            self._write_reg(self.GP8XXX_CONFIG_CURRENT_REG >> 1, [0x11])

    def set_dac_out_voltage(self, data, channel=0):
        if data > self._resolution:
            data = self._resolution
        if self._resolution == self.RESOLUTION_12_BIT:
            data <<= 4
        elif self._resolution == self.RESOLUTION_15_BIT:
            data <<= 1
        self._send_data(data, channel)

    def _send_data(self, data, channel):
        buf = [data & 0xFF, (data >> 8) & 0xFF, data & 0xFF, (data >> 8) & 0xFF]
        if channel == 0:
            self._write_reg(self.GP8XXX_CONFIG_CURRENT_REG, buf[:2])
        elif channel == 1:
            self._write_reg(self.GP8XXX_CONFIG_CURRENT_REG << 1, buf[:2])
        elif channel == 2:
            self._write_reg(self.GP8XXX_CONFIG_CURRENT_REG, buf[:4])

    def _write_reg(self, reg, data):
        self._bus.write_i2c_block_data(self._device_addr, reg, data)

class DFRobot_GP8413(DFRobot_GP8XXX_IIC):
    def __init__(self, bus=1, i2c_addr=0x58):
        super().__init__(bus=bus, resolution=self.RESOLUTION_15_BIT, device_addr=i2c_addr)

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions