Skip to content

Commit

Permalink
🎉 BMA400 support [#11]
Browse files Browse the repository at this point in the history
  • Loading branch information
selyunin committed Dec 25, 2024
1 parent bc4b50e commit fb5461b
Show file tree
Hide file tree
Showing 13 changed files with 1,202 additions and 0 deletions.
14 changes: 14 additions & 0 deletions examples/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,20 @@ These are self-contained examples for using the `umrx-v3-py` with Application Bo
* [`switch_app_dfu.py`](./switch_app_dfu.py)
* [`switch_app_mtp.py`](./switch_app_mtp.py)

## [`bma400`](https://www.bosch-sensortec.com/products/motion-sensors/accelerometers/bma400/)

The examples in the [`bma400`](./bma400) folder
show different communication features for the
[BMA400 shuttle](https://www.bosch-sensortec.com/media/boschsensortec/downloads/shuttle_board_flyer/application_board_3_1/bst-bma400-sf000.pdf)
board:

* [`bma400/bma400_i2c_read_write.py`](./bma400/bma400_i2c_read_write.py)
* [`bma400/bma400_i2c_polling_streaming.py`](./bma400/bma400_i2c_polling_streaming.py)
* [`bma400/bma400_i2c_interrupt_streaming.py`](./bma400/bma400_i2c_interrupt_streaming.py)
* [`bma400/bma400_spi_read_write.py`](./bma400/bma400_spi_read_write.py)
* [`bma400/bma400_spi_polling_streaming.py`](./bma400/bma400_spi_polling_streaming.py)
* [`bma400/bma400_spi_interrupt_streaming.py`](./bma400/bma400_spi_interrupt_streaming.py)


## [`bmi088`](https://www.bosch-sensortec.com/products/motion-sensors/imus/bmi088/)

Expand Down
Empty file added examples/bma400/__init__.py
Empty file.
47 changes: 47 additions & 0 deletions examples/bma400/bma400_i2c_interrupt_streaming.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,47 @@
import logging
import struct
import sys
import time
from pathlib import Path

from umrx_app_v3.shuttle_board.bma400.bma400_shuttle import BMA400Shuttle


def setup_logging(level: int = logging.DEBUG) -> logging.Logger:
logger = logging.getLogger()
logger.setLevel(level)
stdout_handler = logging.StreamHandler(sys.stdout)
log_format = "(%(asctime)s) [%(levelname)-8s] %(filename)s:%(lineno)d: %(message)s"
log_formatter = logging.Formatter(log_format)
stdout_handler.setFormatter(log_formatter)
file_handler = logging.FileHandler(f"{Path(__file__).parent / Path(__file__).stem}.log", mode="w")
file_handler.setFormatter(log_formatter)
logger.addHandler(stdout_handler)
logger.addHandler(file_handler)
return logger


if __name__ == "__main__":
logger = setup_logging()
shuttle = BMA400Shuttle.on_hardware_v3_rev1()
shuttle.initialize()
shuttle.check_connected_hw()

shuttle.configure_i2c()
logger.info(f"chip_id=0x{shuttle.sensor.chip_id:02X}")
assert shuttle.sensor.chip_id == 0x90
shuttle.configure_interrupt_streaming()
shuttle.start_streaming()
time.sleep(0.1)
for idx in range(1000):
for streaming in shuttle.board.receive_interrupt_streaming_multiple(includes_mcu_timestamp=False):
sensor_id, packet, time_stamp, payload = streaming
a_x, a_y, a_z, t_0, t_1, t_2 = struct.unpack("<HHHBBB", payload)
a_x, a_y, a_z = shuttle.sensor.sign_convert_accel(a_x, a_y, a_z)
sensor_time = ((t_2 << 16) | (t_1 << 8) | t_0) * 39.0625e-6
logger.info(
f"[{idx=:03d}], acceleration(a_x={a_x:+5d}, a_y={a_y:+5d}, a_z={a_z:+5d}), "
f"time_stamp(s)={sensor_time:.3f}"
)
time.sleep(0.05)
shuttle.board.stop_interrupt_streaming()
48 changes: 48 additions & 0 deletions examples/bma400/bma400_i2c_polling_streaming.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,48 @@
import logging
import struct
import sys
import time
from pathlib import Path

from umrx_app_v3.shuttle_board.bma400.bma400_shuttle import BMA400Shuttle


def setup_logging(level: int = logging.DEBUG) -> logging.Logger:
logger = logging.getLogger()
logger.setLevel(level)
stdout_handler = logging.StreamHandler(sys.stdout)
log_format = "(%(asctime)s) [%(levelname)-8s] %(filename)s:%(lineno)d: %(message)s"
log_formatter = logging.Formatter(log_format)
stdout_handler.setFormatter(log_formatter)
file_handler = logging.FileHandler(f"{Path(__file__).parent / Path(__file__).stem}.log", mode="w")
file_handler.setFormatter(log_formatter)
logger.addHandler(stdout_handler)
logger.addHandler(file_handler)
return logger


if __name__ == "__main__":
logger = setup_logging()
# This example is for Application Board 3.1 hardware
shuttle = BMA400Shuttle.on_hardware_v3_rev1()
shuttle.initialize()
shuttle.check_connected_hw()

shuttle.configure_i2c()
logger.info(f"chip_id=0x{shuttle.sensor.chip_id:04X}")
assert shuttle.sensor.chip_id == 0x90
shuttle.configure_polling_streaming()
shuttle.start_streaming()
time.sleep(0.1)
for idx in range(1000):
for streaming in shuttle.board.receive_polling_streaming_multiple():
sensor_id, payload = streaming
a_x, a_y, a_z, t_0, t_1, t_2 = struct.unpack("<HHHBBB", payload)
a_x, a_y, a_z = shuttle.sensor.sign_convert_accel(a_x, a_y, a_z)
sensor_time = ((t_2 << 16) | (t_1 << 8) | t_0) * 39.0625e-6
logger.info(
f"[{idx=:03d}], acceleration(a_x={a_x:4d}, a_y={a_y:4d}, a_z={a_z:4d}), "
f"time_stamp(s)={sensor_time:.3f}"
)
time.sleep(0.05)
shuttle.board.stop_polling_streaming()
40 changes: 40 additions & 0 deletions examples/bma400/bma400_i2c_read_write.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,40 @@
import logging
import sys
import time
from pathlib import Path

from umrx_app_v3.shuttle_board.bma400.bma400_shuttle import BMA400Shuttle


def setup_logging(level: int = logging.DEBUG) -> logging.Logger:
logger = logging.getLogger()
logger.setLevel(level)
stdout_handler = logging.StreamHandler(sys.stdout)
log_format = "(%(asctime)s) [%(levelname)-8s] %(filename)s:%(lineno)d: %(message)s"
log_formatter = logging.Formatter(log_format)
stdout_handler.setFormatter(log_formatter)
file_handler = logging.FileHandler(f"{Path(__file__).parent / Path(__file__).stem}.log", mode="w")
file_handler.setFormatter(log_formatter)
logger.addHandler(stdout_handler)
logger.addHandler(file_handler)
return logger


if __name__ == "__main__":
logger = setup_logging()
shuttle = BMA400Shuttle.on_hardware_v3_rev1()
shuttle.initialize()
shuttle.check_connected_hw()

shuttle.configure_i2c()

logger.info(f"chip_id=0x{shuttle.sensor.chip_id:02X}")
logger.info(f"err_reg=0x{shuttle.sensor.err_reg:02X}")
logger.info(f"status=0x{shuttle.sensor.status:02X}")

logger.info(f"acceleration={shuttle.sensor.acc_data}")
logger.info(f"sensor_time={shuttle.sensor.sensor_time}")
shuttle.switch_on_accel()
time.sleep(0.1)
logger.info(f"acceleration={shuttle.sensor.acc_data}")
logger.info(f"sensor_time={shuttle.sensor.sensor_time}")
49 changes: 49 additions & 0 deletions examples/bma400/bma400_spi_interrupt_streaming.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,49 @@
import logging
import struct
import sys
import time
from pathlib import Path

from umrx_app_v3.shuttle_board.bma400.bma400_shuttle import BMA400Shuttle


def setup_logging(level: int = logging.DEBUG) -> logging.Logger:
logger = logging.getLogger()
logger.setLevel(level)
stdout_handler = logging.StreamHandler(sys.stdout)
log_format = "(%(asctime)s) [%(levelname)-8s] %(filename)s:%(lineno)d: %(message)s"
log_formatter = logging.Formatter(log_format)
stdout_handler.setFormatter(log_formatter)
file_handler = logging.FileHandler(f"{Path(__file__).parent / Path(__file__).stem}.log", mode="w")
file_handler.setFormatter(log_formatter)
logger.addHandler(stdout_handler)
logger.addHandler(file_handler)
return logger


if __name__ == "__main__":
logger = setup_logging()
shuttle = BMA400Shuttle.on_hardware_v3_rev1()
shuttle.initialize()
shuttle.check_connected_hw()

shuttle.configure_spi()
_ = shuttle.board.read_spi(shuttle.CS, 0, 1) # dummy read is required, do not delete

logger.info(f"chip_id=0x{shuttle.sensor.chip_id:02X}")
assert shuttle.sensor.chip_id == 0x90
shuttle.configure_interrupt_streaming()
shuttle.start_streaming()
time.sleep(0.1)
for idx in range(1000):
for streaming in shuttle.board.receive_interrupt_streaming_multiple(includes_mcu_timestamp=False):
sensor_id, packet, time_stamp, payload = streaming
a_x, a_y, a_z, t_0, t_1, t_2 = struct.unpack("<xHHHBBB", payload)
a_x, a_y, a_z = shuttle.sensor.sign_convert_accel(a_x, a_y, a_z)
sensor_time = ((t_2 << 16) | (t_1 << 8) | t_0) * 39.0625e-6
logger.info(
f"[{idx=:03d}], acceleration(a_x={a_x:+5d}, a_y={a_y:+5d}, a_z={a_z:+5d}), "
f"time_stamp(s)={sensor_time:.3f}"
)
time.sleep(0.05)
shuttle.board.stop_interrupt_streaming()
49 changes: 49 additions & 0 deletions examples/bma400/bma400_spi_polling_streaming.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,49 @@
import logging
import struct
import sys
import time
from pathlib import Path

from umrx_app_v3.shuttle_board.bma400.bma400_shuttle import BMA400Shuttle


def setup_logging(level: int = logging.DEBUG) -> logging.Logger:
logger = logging.getLogger()
logger.setLevel(level)
stdout_handler = logging.StreamHandler(sys.stdout)
log_format = "(%(asctime)s) [%(levelname)-8s] %(filename)s:%(lineno)d: %(message)s"
log_formatter = logging.Formatter(log_format)
stdout_handler.setFormatter(log_formatter)
file_handler = logging.FileHandler(f"{Path(__file__).parent / Path(__file__).stem}.log", mode="w")
file_handler.setFormatter(log_formatter)
logger.addHandler(stdout_handler)
logger.addHandler(file_handler)
return logger


if __name__ == "__main__":
logger = setup_logging()
shuttle = BMA400Shuttle.on_hardware_v3_rev1()
shuttle.initialize()
shuttle.check_connected_hw()

shuttle.configure_spi()
_ = shuttle.board.read_spi(shuttle.CS, 0, 1) # dummy read is required, do not delete

logger.info(f"chip_id=0x{shuttle.sensor.chip_id:02X}")
assert shuttle.sensor.chip_id == 0x90
shuttle.configure_polling_streaming()
shuttle.start_streaming()
time.sleep(0.1)
for idx in range(1000):
for streaming in shuttle.board.receive_polling_streaming_multiple():
sensor_id, payload = streaming
a_x, a_y, a_z, t_0, t_1, t_2 = struct.unpack("<xHHHBBB", payload)
a_x, a_y, a_z = shuttle.sensor.sign_convert_accel(a_x, a_y, a_z)
sensor_time = ((t_2 << 16) | (t_1 << 8) | t_0) * 39.0625e-6
logger.info(
f"[{idx=:03d}], acceleration(a_x={a_x:4d}, a_y={a_y:4d}, a_z={a_z:4d}), "
f"time_stamp(s)={sensor_time:.3f}"
)
time.sleep(0.05)
shuttle.board.stop_polling_streaming()
41 changes: 41 additions & 0 deletions examples/bma400/bma400_spi_read_write.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,41 @@
import logging
import sys
import time
from pathlib import Path

from umrx_app_v3.shuttle_board.bma400.bma400_shuttle import BMA400Shuttle


def setup_logging(level: int = logging.DEBUG) -> logging.Logger:
logger = logging.getLogger()
logger.setLevel(level)
stdout_handler = logging.StreamHandler(sys.stdout)
log_format = "(%(asctime)s) [%(levelname)-8s] %(filename)s:%(lineno)d: %(message)s"
log_formatter = logging.Formatter(log_format)
stdout_handler.setFormatter(log_formatter)
file_handler = logging.FileHandler(f"{Path(__file__).parent / Path(__file__).stem}.log", mode="w")
file_handler.setFormatter(log_formatter)
logger.addHandler(stdout_handler)
logger.addHandler(file_handler)
return logger


if __name__ == "__main__":
logger = setup_logging()
shuttle = BMA400Shuttle.on_hardware_v3_rev1()
shuttle.initialize()
shuttle.check_connected_hw()

shuttle.configure_spi()
_ = shuttle.board.read_spi(shuttle.CS, 0, 1) # dummy read is required, do not delete

logger.info(f"chip_id=0x{shuttle.sensor.chip_id:02X}")
logger.info(f"err_reg=0x{shuttle.sensor.err_reg:02X}")
logger.info(f"status=0x{shuttle.sensor.status:02X}")

logger.info(f"acceleration={shuttle.sensor.acc_data}")
logger.info(f"sensor_time={shuttle.sensor.sensor_time}")
shuttle.switch_on_accel()
time.sleep(0.1)
logger.info(f"acceleration={shuttle.sensor.acc_data}")
logger.info(f"sensor_time={shuttle.sensor.sensor_time}")
Loading

0 comments on commit fb5461b

Please sign in to comment.