# SPDX-License-Identifier: LGPL-3.0-or-later # Copyright (C) 2020 Daniel Thompson """Bosch BMA421 accelerometer driver ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ """ import bma42x import time class BMA421: """BMA421 driver .. automethod:: __init__ """ def __init__(self, i2c): """Configure the driver. :param machine.I2C i2c: I2C bus used to access the sensor. """ self._dev = bma42x.BMA42X(i2c) def reset(self): """Reset and reinitialize the sensor.""" dev = self._dev # Init, reset, wait for reset, enable I2C watchdog dev.init() dev.set_command_register(0xb6) time.sleep(0.20) dev.set_reg(bma42x.NV_CONFIG_ADDR, 6); # Configure the sensor for basic step counting dev.write_config_file() dev.set_accel_enable(True) dev.set_accel_config(odr=bma42x.OUTPUT_DATA_RATE_100HZ, range=bma42x.ACCEL_RANGE_2G, bandwidth=bma42x.ACCEL_NORMAL_AVG4, perf_mode=bma42x.CIC_AVG_MODE) dev.feature_enable(bma42x.STEP_CNTR, True) @property def steps(self): """Report the number of steps counted.""" return self._dev.step_counter_output() @steps.setter def steps(self, value): if value != 0: raise ValueError() # TODO: There is a more efficient way to reset the step counter # but I haven't looked it up yet! self.reset()