summaryrefslogtreecommitdiff
path: root/wasp/drivers
diff options
context:
space:
mode:
Diffstat (limited to 'wasp/drivers')
-rw-r--r--wasp/drivers/bma421.py53
1 files changed, 53 insertions, 0 deletions
diff --git a/wasp/drivers/bma421.py b/wasp/drivers/bma421.py
new file mode 100644
index 0000000..aae4b59
--- /dev/null
+++ b/wasp/drivers/bma421.py
@@ -0,0 +1,53 @@
+# 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()