2020-06-09 22:29:00 +02:00
|
|
|
# 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)
|
2020-06-12 09:51:37 +02:00
|
|
|
time.sleep(0.05)
|
2020-06-09 22:29:00 +02:00
|
|
|
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()
|