mb_2024_rev_0_0.py 2.75 KB
Newer Older
import importlib
from ..config import OHMPI_CONFIG
import adafruit_ads1x15.ads1115 as ads  # noqa
from adafruit_ads1x15.analog_in import AnalogIn  # noqa
from adafruit_mcp230xx.mcp23008 import MCP23008  # noqa
from digitalio import Direction  # noqa
import minimalmodbus  # noqa
import time
from hardware import TxAbstract, RxAbstract
controller_module = importlib.import_module(f'{OHMPI_CONFIG["hardware"]["controller"]["model"]}')
TX_CONFIG = OHMPI_CONFIG['hardware']['TX']

class TX(TxAbstract):
    def __init__(self, **kwargs):
        self.controller = kwargs.pop('controller', controller_module.Controller())
        super().__init__(**kwargs)

        # I2C connexion to MCP23008, for current injection
        self.mcp_board = MCP23008(self.controller.bus, address=TX_CONFIG['mcp_board_address'])
        self.pin4 = self.mcp_board.get_pin(4)  # Ohmpi_run
        self.pin4.direction = Direction.OUTPUT
        self.pin4.value = True

        # ADS1115 for current measurement (AB)
        self.ads_current = ads.ADS1115(self.controller.bus, gain=2/3, data_rate=860, address=0x48)

        # DPH 5005 Digital Power Supply
        self.pin2 = self.mcp_board.get_pin(2)  # dps +
        self.pin2.direction = Direction.OUTPUT
        self.pin2.value = True
        self.pin3 = self.mcp_board.get_pin(3)  # dps -
        self.pin3.direction = Direction.OUTPUT
        self.pin3.value = True
        time.sleep(4)
        self.DPS = minimalmodbus.Instrument(port='/dev/ttyUSB0', slaveaddress=1)  # port name, address (decimal)
        self.DPS.serial.baudrate = 9600  # Baud rate 9600 as listed in doc
        self.DPS.serial.bytesize = 8  #
        self.DPS.serial.timeout = 1  # greater than 0.5 for it to work
        self.DPS.debug = False  #
        self.DPS.serial.parity = 'N'  # No parity
        self.DPS.mode = minimalmodbus.MODE_RTU  # RTU mode
        self.DPS.write_register(0x0001, 1000, 0)  # max current allowed (100 mA for relays)
        # (last number) 0 is for mA, 3 is for A

        # self.soh_logger.debug(f'Battery voltage: {self.DPS.read_register(0x05,2 ):.3f}') TODO: SOH logger
        print(self.DPS.read_register(0x05, 2))
        self.switch_dps('off')

    def turn_on(self):
        self.pin2.value = True
        self.pin3.value = True
        self.exec_logger.debug(f'Switching DPS on')
        time.sleep(4)

    def turn_off(self):
        self.pin2.value = False
        self.pin3.value = False
        self.exec_logger.debug(f'Switching DPS off')


class RX(RxAbstract):
    def __init__(self, **kwargs):
        self.controller = kwargs.pop('controller', controller_module.Controller())
        super().__init__(**kwargs)

        # ADS1115 for voltage measurement (MN)
        self.ads_voltage = ads.ADS1115(self.controller.bus, gain=2/3, data_rate=860, address=0x49)